前方高能-函数的进阶
一. 函数参数--动态传参
如果我们需要给一个函数传参, 但是参数又是不确定的, 或者我给一个函数传很多参数, 那么形参就要写很多, 很麻烦, 这时就可以用到动态参数.
形参的第三种: 动态参数
动态参数分为两种:
1. 动态接收位置参数
在参数位置编写 * 表示接收任意内容
动态接收参数的时候要注意, 动态参数必须在位置参数的后面.
这时程序运行就会报错, 因为前面传递进去的所有位置参数都被*food接收了, a和b永远接收不到参数.
2. 动态接收关键字参数
在python中*args只能接胡搜位置参数无法接收关键字参数, 所以要使用**kwargs 来接收动态关键字参数.
顺序的问题, 在函数调用的时候, 如果先给出关键字参数, 则整个参数列表会报错.
那么我们的传参顺序是:
位置参数, *args, 默认值参数, **kwargs
如果想接收所有的参数:
这个俗称无敌模式.
动态参数的另一种传参方式:
在实参位置上给一个序列, 列表, 可迭代对象前面加个*表示吧这个序列打散.
如果是一个字典, 也可以打散, 但是需要用两个**
二. 命名空间
1. 命名空间分类:
1. 内置命名空间: 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内置命名空间
2. 全局命名空间: 我们直接在py文件中, 函数外声明的变量都属于全局命名空间
3. 局部命名空间: 在函数中声明的变量会放在局部命名空间
加载顺序:
内置 --> 全局 --> 局部
取值顺序:
局部 --> 全局 --> 内置
2. 作用域: 作用域就是作用范围, 按照生效范围来看分为 全局作用域和局部作用域
全局作用域: 内置 + 全局
局部作用域: 局部
3. 我们可以通过globals()函数来查看全局作用域中的内容, 也可以通过locals()来查看局部作用域中的变量和函数信息
globals() 查看全局作用域中的内容
locals() 查看当前作用域中的内容
三. 函数的嵌套
四. 关键字global和nonlocal
global表示. 不再使用局部作用域中的内容了. 而改用全局作用域中的变量
nonlocal 表示在局部作用域中, 引入离他最近的那一层的变量.
再看, 如果嵌套了很多层, 会是一种什么效果:
这样的程序如果能分析明白, 那么作用域, global和nonlocal就没有问题了.