函数是一个基本的代码单元,用于组织或重用一批特定功能的代码段,从而使得软件开发过程更为模块化,代码重用率更高。
1. 函数定义语法
1 2 3 4 |
def 函数名( 参数列表 ): """文档字符串""" 函数体 return 返回值 |
其中:
- def:函数定义关键字;
- 函数名:函数的名称,命名需要符合Python3命名规范;
- 参数列表:函数执行时所需的输入参数列表,若函数不需要输入,可以为空;
- 文档字符串:该函数的说明文档,可选;
- 函数体:函数中需要进行的一系列操作语句的集合;
- 返回值:函数执行完毕后返回给调用者的值,可选。
1 2 3 4 5 6 7 |
def add(a, b): """返回a与b的和""" c= a+b return c # 调用示例 result= add(2 + 3) |
2. 函数参数
函数参数列表可以为空,也可以使用多种不同的参数组合而成。Python3支持的参数类型有:
- 必选参数:在调用函数时,必选参数必须按照函数定义时的顺序依次输入,且类型和数量要保持一致;
- 默认参数:定义函数时,在参数列表为参数提供默认值,调用函数时,默认参数可以不输入使用默认值,也可以输入其它值;
- 可变长度参数:定义形式如 *args ,可以接收可变数量的参数输入;
- 关键字参数:定义形如 **kwargs 的参数,在调用时允许输入0个或多个形如 key=value 的关键字变量。
另外还支持将参数压缩为列表或字典,批量传入。函数参数在参数列表中的次序如下:必选参数,默认参数,可变长度参数,关键字参数。以下是函数参数使用示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
# 1. 定义空函数 def noop(): pass; # 2. 定义必选参数 def func1(name, age): print(name, "is", age) func1('Tom', 23) # Tom is 23 # 3. 定义默认参数 def func2(name, age=18): print(name, "is", age) func2('Jack') # 使用默认参数调用,输出:Jack is 18 func2('Jack',22)# 使用给定age值调用,输出:Jack is 22 # 4. 定义可变参数 def func3(*args): print(args) func3() # () func3('aa') # ('aa',) func3('aa', 'bb', 'cc') # ('aa', 'bb', 'cc') # 5. 定义关键字参数 def func4(**kwargs): print(kwargs) func4() # {} func4(aa=1) # {'aa': 1} func4(aa=1, bb=2, cc=3) # {'aa': 1, 'bb': 2, 'cc': 3} # 6. 复合定义 def func5(name, age=18, *args, **kwargs): print(name, 'is', age) print(args) print(kwargs) # 在复合定义中要慎用默认值参数 func5('jack', 'args_begin', 1, 2, 'args_end', kw0=0, kw1=1) # jack is args_begin # (1, 2, 'args_end') # {'kw0': 0, 'kw1': 1} func5('jack', 23, 'args_begin', 1, 2, 'args_end', kw0=0, kw1=1) # jack is 23 # ('args_begin', 1, 2, 'args_end') # {'kw0': 0, 'kw1': 1} |
3. 函数返回值
在函数体中,通过调用 return [expression] 语句退出函数执行,并将返回值传递给调用者。当return语句后无表达式时,返回值为None。
4. 变量作用域
对于函数来说,其内部定义的变量为本地变量,只能在其内部访问;其外部定义的变量为全局变量,可以在函数中访问。此外,函数内部的语句块不具有独立的作用域,而嵌套函数有独立的作用域。默认情况下变量访问所遵循的规则为:
- 在嵌套函数中,变量名的查找次序为:当前函数体内->上一级函数->…->函数外部作用域,查找过程由内到外,直到找到对应函数为止;
- 在函数内部(非嵌套函数),若变量名存在则直接使用,否则在全局作用域中继续查找。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# 1. 默认情况下变量访问 name= 'aaa' def func1(): name= 'bbb' def func2(): name= 'ccc' print('func2.name= ',name) func2() print('func1.name= ',name) func1() # func1.name= bbb # func2.name= ccc print('outer.name= ', name) # outer.name= aaa # 2. 使用global关键字在函数内部访问全局变量 name2= 'global' def func2(): global name2 print('func2.name2:', name2) name2= 'global_new' func2() # func2.name2: global print('outer.name2', name2) # outer.name2 global_new # 3. 使用nonlocal在嵌套函数中访问上次函数内的局部变量 def func3(): name3= 'func3_name3' def func4(): nonlocal name3 print('func4.name3= ', name3) name3= 'func3_name3_new' func4() print('func3.name3= ', name3) func3() # func4.name3= func3_name3 # func3.name3= func3_name3_new |
5. 匿名函数
Python中可通过lambda表达式来定义匿名函数,其语法如下:
1 |
lambda [arg1 [,arg2 [,.....argn]]] : expression |
匿名函数的等价形式如下:
1 2 |
def func([arg1 [,arg2 [,.....argn]]]): return expression |
使用示例:
1 2 |
add= lambda x, y : x+y add(2, 3) # 5 |