今日主要内容
1.动态参数
2.命名空间或名称空间
3.函数的嵌套
4.关键字global和nonlocal
动态函数
动态参数*args ,**kwargs
(1)*args
接收的是实参对应的所有位置参数(实参中超出形参位置的),并将其放在元组中.
例1.*args正确放置的位置(不带默认参数)
例2:带默认参数,不影响默认参数的取值
总结:
形参对应顺序:位置参数,*args,默认参数
(2)**kwargs 动态传参
将所有关键字参数(超过形参设置的关键字参数)添加到一个字典里.
例3:**kwargs正确使用
最终的排列顺序:
例4:
总结:
最终顺序:位置参数,*args,默认参数,**kwargs
一般工作的书写方式:
def funcl(*args,**kwargs):
pass
funcl
知识点: *的应用
例5:*args,*的作用
将各个可迭代的数据类型转换成元组形式,以前是元组的,直接套用原式
例6:**kwargs 的** 作用
总结 *,**
在函数的调用执行时,
*可迭代对象,代表打散(list,tuple,str,dict(键))将元素一一添加到args。
**字典,代表打散,将所有键值对放到一个kwargs字典里。
在函数定义时, *args,**kwargs代表的是聚合。
def func(*args,**kwargs): # 聚合
print(args)
print(kwargs)
func(*,**)#打散
=================================================================
2.命名空间,名称空间
命名空间一共分为三种:
全局命名空间
局部命名空间
内置命名空间
*内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法。
三种命名空间之间的加载与取值顺序:
加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)
取值顺序:
在局部调用:局部命名空间->全局命名空间->内置命名空间
在全局调用:全局命名空间->内置命名空间
综上所述,在找寻变量时,从小范围,一层一层到大范围去找寻。
如下图简单描述:
加载为向下的箭头,取值为向上的箭头.
作用域
作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。
全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效
局部作用域:局部名称空间,只能在局部范围内生效
globals和locals方法
例7:比较全局和局部作用域区别
取的值全部放在字典里面.
全局名称空间:py3中内置的所有变量
局部名称空间:根据所在位置,对变量进行展示,如果所在的函数中有变量,则打印函数的变量,如果则空,只查找当前级内.
对比
函数的嵌套
解决思路:
1.先确认函数什么执行,没有看到调用函数,则函数不执行.即函数名()
2.代码从上到下依次执行.
3.调用函数:函数里面从上至下依次执行
例8:通过举例理解上面的内容,就好理解了
4 关键字:global 和 nonlocal (声明变量)
global:
1,在局部空间内,声明一个全局变量。
2,在局部作用域想要对全局作用域的全局变量进行修改时,需要用到 global(限于字符串,数字)。
例9:
如果不用global声明,则外部是找不到内部的变量的.
如果声明,则外部可以使用此变量
2,在局部空间内改变一个全局变量
例10:
nonlocal #将内部变量,引用到外部,不包括全局
1,不能修改全局变量。
2.在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,
并且引用的哪层,从那层及以下此变量全部发生改变。(只要在函数内,就可以引用到外层,只要出了函数,到全局下就错误)
总结:
global和nonlocal用法相同,nonlocal不能反用到全局下,global可以从局部到全局这样使用.