函数的进阶
函数的参数
函数的实参传递给形参的过程叫做传参: 函数的拓展性
实参角度 -- 函数的调用者
- 位置参数: 从左至右,按照顺序,一一对应.
- 关键字参数: 一一对应.
- 混合参数: 位置参数在关键字参数前面.
形参角度 --- 定义函数时
位置参数: 与实参角度位置参数一样.
默认值参数: 一定在位置参数后面,不传参数即沿用默认的参数.
动态参数(万能参数:*args,**kwargs)
当函数传入的参数不定时,上面的传参方式解决不了问题
args: 将实参角度:定义一个函数时, 所有的位置参数聚合到一个元组中。
******kwargs: 函数的定义时:将实参角度所有的关键字参数聚合成了一个字典,给了kwargs.
形参的最终顺序
位置参数---->*args--->默认值参数--->仅限关键字参数--->**kwargs
*的魔性用法
函数内:函数的执行时: * 代表打散,** 只能打散映射类型(字典) (key不能是int型)
函数外:处理剩余元素,处理后的结果为列表形式
命名空间与作用域
命名空间:
- 全局命名空间:我们直接在py文件中,函数外声明的变量
- 内置命名空间:python最开始会开辟一个自己的命名空间 -- 内置命名空间
- 局部命名空间:函数内部声明的变量,函数执行时创建
- 加载顺序: 内置命名空间 => 全局命名空间 => 局部命名空间
- 取值顺序: 局部命名空间 => 全局命名空间 => 内置命名空间
作用域: 变量或函数的声明周期
全局作用域: 内置命名空间 全局命名空间
局部作用域: 局部命名空间
globals() # 查看全局作用域中的内容locals() # 查看的是当前作用域中的内容
函数的嵌套
# 函数可以互相嵌套:def outer(): def inner(): print('我是内部') print('我是外部') inner()outer()
拓展
global
- 在局部作用域中可以更改全局作用域的变量(限于字符串,数字)
- 利用global在局部作用域也可以声明一个全局变量
nonlocal
- 不能更改全局变量
- 在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。