1、动态参数
*args 动态参数,万能参数
args接受的就是实参对应的所有位置参数,并将其放在元祖中
形参对应顺序
位置参数,*args,默认参数
def func(a,b,c,d,*args,e='男'): print(a) print(b) print(c) print(d) print(args) print(e)func(1,2,3,4,5,6,7,e='女')
#**kwargs:动态传参,将所有的关键字参数(无意义的)放到一个字典中
def func(a,b,c,**kwargs): print(kwargs)func(1,2,r=4,b1=5,c1=6,c=7)
def func(a,b,c,d,*args,e='男',**kwargs): print(a) print(b) print(c) print(d) print(args) print(e) print(kwargs)func(1,2,3,4,5,6,7,v=3,m=7,h=9,e='女')
最终顺序:位置参数,*args,默认参数,**kwargs
*魔法运用
def func(*args): print(args)l1=[1,2,30]l2=[1,2,33,21,45,66]func(*l1,*l2)
def func(**kwargs): print(kwargs)dic1={ 'name1':'alex','age1':33}dic2={ 'name':'老男孩','age':56}func(**dic1,**dic2)
在函数的调用执行时,
*可迭代对象,代表打散(list,tuple,str,dict(键))将元素一一添加到args
**字典,代表打散,将所有键值对放到一个kwargs字典中
在函数定义时,*args,**kwargs代表的是聚合
2、名称空间,临时名称空间
名称空间(命名空间),临时名称空间,内置名称空间
全局名称空间,名称空间,命名空间,全局命名空间
局部命名空间,临时名称空间,临时命名空间,局部名称空间
内置名称空间,所有的内置函数等存储的空间
input(),print(),len内置函数
加载顺序:
内置名称空间--->全局名称空间--->(函数执行时)局部名称空间
取值顺序:
函数执行时:局部名称空间--->全局名称空间--->内置名称空间
当执行函数的时候,他会在内存中开辟一个临时名称空间,存放函数体内的所有变量与值的关系
随着函数的执行完毕,临时空间自动关闭
3、函数的嵌套
函数被调用的时候执行,代码从上至下依次执行,调用函数:函数里面从上至下依次执行
def func1(): print(333) func2() print(666)def func2(): print(444) func3()def func3(): print(555)func1()print(222) #111 333 444 555 666 222
globals(),locals()
a = 2b = 3def func1(): c = 5 d = 6 print(globals()) # 全局变量放在一个字典中 return locals() # {'c': 5, 'd': 6}print(func1())# print(globals()) # 全局名称空间:所有变量# print(locals()) # 局部名称空间:所有变量
4、关键字global,nonlocal
global
1、在局部空间内,声明一个全局变量
def func1(): global name name='老男孩' print(name)func1()print(name)
2、在局部空间内改变一个全局变量
a=4def func1(): global a a=5func1()print(a)
nonlocal
1、不能修改全局变量
a=4def func1(): nonlocal a a=5func1()print(a) #SyntaxError: no binding for nonlocal 'a' found
在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变
a=4def func1(): b=6 def func2(): b=666 print(b) #666 func2() print(b) #6func1()