动态传参:
万能参数:*args,接受的就是实参对应的所有位置参数,并放在元组里
形参对应顺序:位置参数,*args,默认参数
def func(a,b,c,d,*args,e='male'): print(a) print(b) print(c) print(d) print(args) print(e) func(1,2,3,4,5,10,5,6,7,8,e='female')
**kwargs:接收所有的关键字参数(无意义的)并放在一个字典中
def func(a,b,c,**kwargs): print(kwargs) func(1,2,c=3,r=4,b1=5,c1=6,d=7)
{'c1': 6, 'b1': 5, 'r': 4}
所有参数的顺序:位置参数,*args,默认参数,**kwargs
**的魔法作用
1.*可迭代对象,代表打散(list,tuple,字符串,字典的键)
2.**字典,代表打散,将所有的键值对防盗一个kwargs字典里
def func(*args): print(args) l1=[1,2,30] l2=[1,2,33,21,45,66] print(func(*l1,*l2))
在函数定义时,*args,**kwargs代表的是聚合
def func(*args,**kwargs): print(args) print(kwargs) dic1={'name1':'alex','age1':46} dic2={'name2':'wusir','age2':64} func(*[1,2,3,4],*'asdfsad',**dic1,**dic2)
(1, 2, 3, 4, 'a', 's', 'd', 'f', 's', 'a', 'd')
{'name2': 'wusir', 'name1': 'alex', 'age1': 46, 'age2': 64}
我们首先回忆一下Python代码运行的时候遇到函数是怎么做的,从Python解释器开始执行之后,就在内存中开辟里一个空间,每当遇到一个变量的时候,就把变量名和值之间对应的关系记录下来,但是当遇到函数定义的时候,解释器只是象征性的将函数名读如内存,表示知道这个函数存在了,至于函数内部的变量和逻辑,解释器根本不关心。
等执行到函数调用的时候,Python解释器会再开辟一块内存来储存这个函数里面的内容,这个时候,才关注函数里面有哪些变量,而函数中的变量回储存在新开辟出来的内存中,函数中的变量只能在函数内部使用,并且会随着函数执行完毕,这块内存中的所有内容也会被清空。
我们给这个‘存放名字与值的关系’的空间起了一个名字-------命名空间。
代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做全局命名空间;
在函数的运行中开辟的临时的空间叫做局部命名空间。
def f1(): print('in f1') def f2(): print('in f2') f2() f1() def f1(): def f2(): def f3(): print('in f3') print('in f2') f3() print('in f1') f2() f1()
a=2 b=3 def func1(): c=5 d=6 print(globals()) #全局变量放入到一个字典中 print(locals()) func1()
{'__file__': '/Users/lixinwei/PycharmProjects/untitled1/3.29/3.29知识点.py', '__doc__': None, 'a': 2, '__package__': None, '__cached__': None, '__spec__': None, 'func1': <function func1 at 0x1021748c8>, '__name__': '__main__', '__builtins__': <module 'builtins' (built-in)>, 'b': 3, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x1006a5cc0>}
{'c': 5, 'd': 6}
a=4 def func1(): global a a=5 func1() print(a)
a=5 如果去掉global a=4
globals:全局名称空间的所有变量。
作用:1.在局部空间内生命一个全局变量
2.在局部空间内改变一个全局变量
nonlocal:
1.不能改变全局变量,但能修改聚部变量
2.在局部作用域中,对父级作用域(或更外层作用域非全部作用域)的变量进行修改,并且引的哪层,从哪层及以下此变量全部发生改变
def add_b(): b = 42 def do_global(): b = 10 print(b) def dd_nonlocal(): nonlocal b b = b + 20 print(b) dd_nonlocal() print(b) do_global() print(b) add_b()
10,30,30,42
函数在调用的时候执行
代码从上倒下依次执行,调用函数,函数里面从上倒下依次执行