Python基础---函数Function

函数Function

定义:带名字的代码块,用于完成具体的工作

     最基本的一种代码抽象的方式,借助函数,可以不用关心底层的具体计算过程,直接在更高层次上思考问题

在Python中,内置了多种多样的函数,可以直接调用,例如abs(), len(), list()。。。

函数要素:

  1、在Python中,使用关键字 def func_name():来告诉Python定义了一个函数func_name

  2、在函数名称后的括号内,可以设置函数参数

     函数参数包含:形参、位置实参、关键字实参、默认值、收集参数、关键字收集参数

     1、形参:函数完成其工作所需的一种信息

1 def youname(first_name, last_name):  # first_name, last_name即为形参

 

     2、位置实参:调用函数时传递给函数的信息,以传递时的前后顺序一一对应函数的形参

 1 def youname(first_name, last_name):
 2     name = first_name + ' ' + last_name
 3     print(name.title())
 4 
 5 
 6 youname('alan', 'wood')    # 实参位置对应形参,实参位置不同,输出结果不同
 7 --->Alan Wood
 8 
 9 youname('wood', 'alan')
10 --->Wood Alan

 

     3、关键字实参:传递给函数的名称-值对,传递时使用' = '明确表示相对应

1 def youname(first_name, last_name):
2     name = first_name + ' ' + last_name
3     print(name.title())
4 
5 
6 youname(last_name='alan', first_name='wood')
7 --->Wood Alan

 

     4、默认值:在定义函数时,给形参指定默认值,当传递实参到函数时,没有该形参,则该形参直接使用默认值

 1 def youname(first_name, last_name='wood'):
 2     name = first_name + ' ' + last_name
 3     print(name.title())
 4 
 5 
 6 youname('alan')
 7 --->Alan Wood
 8 
 9 youname('alan', 'simth')
10 --->Alan Simth

 

     5、收集参数:传递任意数量的实参,使用 ' *形参名' 代表该参数,该参数所接受的实参会组成一个元组Tuple

 1 def youname(first_name, *last_names):
2   
print(type(last_names))
3 for last_name in last_names: # last_names接收实参后形成元组,遍历出其中的值做后续操作
4 name = first_name + ' ' + last_name
5 print(name.title())
6
7
8 youname('alan', 'simth', 'wood', 'xu')
9 ---><class 'tuple>
10 --->Alan Simth
11 --->Alan Wood
12 --->Alan Xu

 

     6、关键字收集参数:使用任意数量的关键字参数,使用 '**形参名' 代表该参数,该参数所收集的实参,会组成一个字典Dict

 1 def youname(first_name, last_name, **you_info):
 2     print(type(you_info))
 3     name = first_name + ' ' + last_name
 4     print(name.title())
 5     for key, value in you_info.items():
 6         print('your ' + key + ' is ' + value)
 7 
 8 
 9 youname('alan', 'simth', age='18', height='180cm')
10 ---><class 'dict'>
11 --->Alan Simth
12 --->your age is 18
13 --->your height is 180cm

 

 

    函数参数顺序:

     1、关键字收集参数必须在所有形参之后(即最后一位);

     2、普通形参和收集参数之间的顺序,一般普通在前,收集在后;

     3、普通参数位于何种收集参数之前,则必须使用该收集参数可以接受的格式;

     4、一个函数的参数位中,只能存在一个收集参数或者一个关键字收集参数,普通参数不受限制

  3、在函数中,可以使用return关键字将值返回到调用函数的代码行,可以将程序大部分的动作移到函数中去,简化程序

函数编写细节:

  1、函数名应该具有对其功能的描述性,且只能使用小写字母和下划线

  2、每个函数都应包含简要阐述其功能的注释,紧跟在函数定义后面,采用'''   '''格式;

    其中必须包含:功能,参数,返回值  非必须:示例,注意事项等

  3、给形参指定默认值、对于调用函数时引入的关键字实参,等号两边不要有空格

  4、每行代码不要超过79字符

  5、如果程序或模块包含多个函数,可使用两个空行将相邻函数分开

 

模块Module:

函数的优点之一,是可以将代码块与主程序分离,

将函数存储在.py文件中,在需要使用时,使用import func_name语句导入到主程序中,这个文件就是一个模块

import语句允许在当前运行程序文件中,使用模块的代码

1 import name  # 将上面的例子保存在name.py文件中,import导入
2 
3 name.youname('alan', 'simth', age='18', height='180cm')  

 

导入特定的函数:from  file_name import func_name

1 from name import youname
2 
3 youname('alan', 'simth', age='18', height='180cm')

使用as给函数或模块指定别名:

如果函数名与程序中现有的名称冲突,或者函数名太长,可指定一个别命,即外号

1 from name import youname as yn
2 # import name as n
3 
4 yn('alan', 'simth', age='18', height='180cm')
5 # n.youname('alan', 'simth', age='18', height='180cm')

使用 * 号运算符可以导入模块中所有的函数(一般不使用)

1 from name import *
2 
3 youname('alan', 'simth', age='18', height='180cm')

 递归函数:

定义:在函数内部,可以调用其他函数,但是如果一个函数在内部调用的是函数自身,则这个函数就是递归函数

1 def func(n):
2     if n == 1:
3         return 1
4     return n * func(n-1)
5 
6 
7 num = func(5)
8 print(num)
9 --->120

优缺点:使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出

栈溢出:在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每进行一次函数调用,栈就会加一层栈帧,每当函数返回,则减少一层栈帧

    但是栈的大小不是无限的,所以函数调用多次就会出现栈溢出

1 def func(n):
2     if n == 1:
3         return 1
4     return n * func(n-1)
5 
6 
7 num = func(1001)
8 print(num)
9 --->RecursionError: maximum recursion depth exceeded

尾递归:解决栈溢出现象可以使用尾递归进行优化

    尾递归是指,函数在返回的时候,调用自身本身,并且return语句不能包含表达式

    这样,无论函数本身调用几次,都只占一个栈帧  

posted @ 2018-02-27 23:25  风缘  阅读(317)  评论(0编辑  收藏  举报