1, *args 动态 参数,万能参数
*args就是接受实参对应的剩余的位置参数,并将其放在元组中。在定义函数时,*args代表的是聚合。
def func(*args): print(args) func(1,34,‘jdai‘,5,56,66)#(1, 34, ‘jdai‘, 5, 56, 66)
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,10,5,6,7,8,e=‘女‘)#1
2
3
4
(5, 10, 5, 6, 7, 8)
女
2,**kwargs,动态传参,只接受关键字参数,将所有的关键字参数(无意义的)放到一个字典中。
最终顺序(形参角度)
def func(a,b,c,**kwargs): print(kwargs) func(1,3,4,r=6,t=7,y=0)
位置传参,*args, 默认参数 **kwargs
def func(a,b,c,d,*args,e=‘男‘,**kwargs): print(a) print(b) print(c) print(d) print(args)#(5, 10, 5, 6, 7, 8) print(e) print(kwargs)#{‘f‘: ‘女‘, ‘h‘: 48, ‘g‘: 5} func(1,2,3,4,5,10,5,6,7,8,f=‘女‘,g=5,h=48)
3, *号的魔法运用,在函数调用执行时,*代表打散。*加可迭代对象(list,tuple,set,str,dict的键),代表打散,将元素一一添加到args。
def func(*args): print(args) li = [1,2,3,4,6] l2 = [3,6,6,7,77,66] tu = (‘eqwj‘,‘ee‘,‘ui‘) func(*li,*l2,*tu)
(1, 2, 3, 4, 6, 3, 6, 6, 7, 77, 66, ‘eqwj‘, ‘ee‘, ‘ui‘)将元素一一添加到args中。
def func(**kwargs): print(kwargs) dic = {‘name‘:‘alex‘,‘age‘:44} dic1 = {‘home‘:‘taiwan‘,‘hobby‘:‘football‘} func(**dic,**dic1)
**字典,代表打散,将所有键值对放到一个kwargs字典里。
def func(*args,**kwargs): print(args) print(kwargs) dic1 = {‘honnn‘:‘shui‘,‘nugu‘:‘dao‘} dic2 = {‘name1‘:‘两年半‘,‘age‘:33} func(*[1,3,4,5],*‘ahdhsdkj‘,**dic1,**dic2)
(1, 3, 4, 5, ‘a‘, ‘h‘, ‘d‘, ‘h‘, ‘s‘, ‘d‘, ‘k‘, ‘j‘)
{‘nugu‘: ‘dao‘, ‘name1‘: ‘两年半‘, ‘honnn‘: ‘shui‘, ‘age‘: 33}
4,名称空间,也叫命名空间。放置变量与对应的值得关系(内存地址的关系)。当执行函数的时候,它会在内存中开辟一个临时名称空间,存放函数体内的所有变量与值得关系,随着函数的执行完毕,
临时空间自动关闭。
全局名称空间,名称空间,命名空间,全面命名空间。
局部命名空间,临时名称空间,临时命名空间,局部名称空间。
内置名称空间,所有的内置函数等存储的空间。
加载顺序:
内置名称空间>>>全局名称空间>>>(函数执行时)局部名称空间
取值顺序:
(函数执行时)局部名称空间>>>全局名称空间>>>内置名称空间
name = ‘老男孩‘ def func1(): name =‘taibai‘ print(name) func1()#taibai
name = ‘老男孩‘ def func1(): # name =‘taibai‘ print(name) func1()#老男孩
全局作用域:全局名称空间,内置名称空间。
局部作用域:局部名称空间。
5,函数的嵌套
print(111)#1 def func1(): print(333)#2 func2() print(777)#4 def func2(): print(444)#3 def func3(): print(555) func2() func1() print(222)#5
print(111)#1 def func1(): print(333)#2 func2() print(444)#6 def func2(): print(222)#3 func3() print(555)#5 def func3(): print(666)#4 func1() print(777)#7
6,globals和locals
a = 2 b = 3 def func1(): c = 4 d = 5 print(globals())#将全局变量放在字典中 return locals()#将局部变量放在字典中{‘c‘: 4, ‘d‘: 5} print(func1())
{‘a‘: 2, ‘__cached__‘: None, ‘__file__‘: ‘D:/python3/day11/xuxi329.py‘, ‘__name__‘: ‘__main__‘, ‘__doc__‘: None, ‘__builtins__‘: <module ‘builtins‘ (built-in)>, ‘b‘: 3, ‘__loader__‘: <_frozen_importlib_external.SourceFileLoader object at 0x000001EE02A95780>, ‘func1‘: <function func1 at 0x000001EE026CA048>, ‘__spec__‘: None, ‘__package__‘: None}
a = 4 def func1(): b = 6 def func2(): nonlocal b#nonlocal不能修改全局变量 b = 666 print(b) func2() print(b) func1()
global:
1,在局部空间内,声明一个全局变量。
2,在局部空间内,改变一个全局变量。
globals,全局名称空间:所有变量。
locals,局部名称空间:所有变量。
nonlocal:
1,不能修改全局变量。
2,在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。