函数能提高应用的模块性,和代码的重复利用率。
函数应保持清晰性,接参返结果,用户交互操作在函数外进行或将函数分为两大类,一类只做事,不需要返回结果(如与用户交互或设置变量的值),另一类则执行一些运算,最后返回结果,最好不要在函数中用print语句输出信息
Python提供了许多内建函数,比如print(),max()和min()可传多个参数比较。
但你也可以自己创建函数,这被叫做用户自定义函数。
1.自定义函数
语法
Python 定义函数使用 def 关键字,一般格式如下:
def 函数名(参数列表): 函数体
默认情况下,参数值和参数名称是按函数声明中定义的顺序匹配起来的。
return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
1 #!/usr/bin/python3 2 # -*- coding:utf-8 -*- 3 4 def my_abs (x): 5 if x >= 0: 6 return x 7 else: 8 return -x 9 print(my_abs(-99))
isinstance() 实例 对参数类型做检查
1 #!/usr/bin/python3 2 # -*- coding:utf-8 -*- 3 4 def my_abs (x): 5 #如果参数x不是int或float则抛出一个类型异常 6 if not isinstance(x,(int,float)): 7 raise TypeError('bad operand type') 8 if x >= 0: 9 return x 10 else: 11 return -x 12 print(my_abs('-99'))
2.参数类型
以下是调用函数时可使用的正式参数类型:
- 必需参数
- 关键字参数
- 默认参数
- 不定长参数
必需参数
必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样,不然会出现语法错误。
关键字参数
关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值,以字典的形式。
使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
1 #!/usr/bin/python3 2 # -*- coding:utf-8 -*- 3 4 def printInfo( name, age ): 5 print ("名字:", name) 6 print ("年龄:", age) 7 return 8 9 printInfo( age = 100, name = "chb")
默认参数
调用函数时,如果没有传递参数,则会使用默认参数。
1 #!/usr/bin/python3 2 # -*- coding:utf-8 -*- 3 4 def printInfo( name, age = 21 ): 5 print ("名字:", name) 6 print ("年龄:", age) 7 return 8 9 printInfo( age = 100, name = "chb") 10 print('--------------------------') 11 printInfo( name = "chb" )
不定长参数
你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数(也称可变参数),和上述 2 种参数不同,声明时不会命名。
加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。
1 #!/usr/bin/python3 2 # -*- coding:utf-8 -*- 3 4 def printInfo( age, *vartuple ): 5 print(age) 6 print(vartuple) 7 8 printInfo( 11, 22, 33, 44)
参数组合先后顺序:必需、默认、不定长、关键字
3.匿名函数
Python 使用 lambda 来创建匿名函数。
所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
- lambda 只是一个表达式,函数体比 def 简单很多。
- lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
- lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
1 #!/usr/bin/python3 2 # -*- coding:utf-8 -*- 3 4 sum = lambda arg1, arg2: arg1 + arg2 5 #关键字lambda表示匿名函数,冒号前面表示函数参数,冒号后面就是要做的事情 6 7 print ("相加后的值为 : ", sum( 10, 20 )) 8 print ("相加后的值为 : ", sum( 30, 40 ))
4.变量作用域
变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python的作用域一共有4种,分别是:
- L (Local) 局部作用域
- E (Enclosing) 闭包函数外的函数中
- G (Global) 全局作用域
- B (Built-in) 内置作用域(内置函数所在模块的范围)
以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置中找。
1 g_count = 0 # 全局作用域 2 def outer(): 3 o_count = 1 # 闭包函数外的函数中 4 def inner(): 5 i_count = 2 # 局部作用域
global 和 nonlocal关键字
当内部作用域想修改外部作用域的变量时,就要用到global(全局)和nonlocal(非局部)关键字了。
以下实例修改全局变量 num:
1 #!/usr/bin/python3 2 # -*- coding:utf-8 -*- 3 4 num = 1 5 def fun(): 6 global num #需要使用global关键字声明 7 print(num) 8 num = 333 9 print(num) 10 11 fun() 12 print(num)
如果要修改嵌套作用域中的变量则需要 nonlocal 关键字了,如下实例:
1 #!/usr/bin/python3 2 # -*- coding:utf-8 -*- 3 4 def outer(): 5 num = 10 6 def inter(): 7 nonlocal num #nonlocal关键字声明 8 num = 100 9 print(num) 10 inter() 11 print(num) 12 outer()