函数的进阶
一、动态参数
当我们在定义函数时,不确定接受的参数个数,就需要引入动态参数。
动态参数包括动态位置参数和动态默认参数如下:
def func(a,b,*args,c=0,d=5,**kwargs): print(a,b) print(args) print(c,d) print(kwargs) func(1,2,3,5,4,2,25,q=8,m=11,w=22,e=33)
动态位置参数用 “ * args ” 做参数名,动态默认参数用“ ** kwargs ” 。通常在不明确接受参数数量时使用动态参数,且优先顺序为位置 > 动态位置 > 默认参数 > 动态默认参数
动态位置参数返回的是元组的形式;动态默认参数返回的是字典的形式
*在实参调用的时候 *将可迭代的对象打散,字典是将键取出;** 将字典打散成 关键字参数(键=值)
*在形参调用的时候 *就是将元素聚合;** 就是将关键字参数聚合成一个字典
*args,**kwargs 可以修改,但是不建议修改
二、函数的注释
函数的注释使用 “““ 注释 ””” 的方式,查看某函数的注释:函数名.__doc__如下:
def aaa(user,pwd): """ 登录函数 :param user: 用户名 :param pwd: 密码 :return: 校验后的账号和密码 """ print(111) print(aaa.__doc__)
三、名称空间
名称空间分三种:内置空间、全局空间和局部空间。
内置空间:pyhon安装包里集成的代码
全局空间:当前的py文件
局部空间:函数中的代码
名称空间的加载顺序:内置空间 ---> 全局空间 ---> 局部空间
取值顺序:局部空间 ---> 全局空间 ---> 内置空间(找不到就报错)
作用域分全局作用域和局部作用域:全局作用域包括内置空间与全局空间;而局部作用域就是函数体。
四、函数的嵌套与互相调用
1、在函数func内
def func(): print(3) def f(): print(1) print(2) f() func()
2、多个独立函数调用
def func2(): print(1) log() def func1(): print(3) def log(): func1() print(6) def fun(): print(7)
3、一个函数体内相互调用
def func(): a = 1 def log(): a = 5 # a = 15 def info(): nonlocal a # 声明修改log函数下边的变量a a += 10 # a = a + 10 a = 15 print(a) # 15 info() print(a) # 15 log() print(a) # 1 func()
五、global与nonlocal
global : 在局部修改全部变量,如果没有就创建一个新的
nonlocal : 在局部空间内,修改离自己最近的变量,如果上一层没有就继续向上找,直到找到局部变量的顶层,局部空间内没有可以修改的变量,就报错