Python day 10 函数的进阶
从形参角度,昨天我们讲了位置传参要按顺序一一对应,默认传参,默认参数在位置参数后面,今天接着昨天说的还有动态参数。
今天我们主要讲动态参数 *args **kwargs
形参角度最终顺序:位置参数,*args,默认参数,**kwargs
*args 动态参数,万能参数。接受的就是实参对应的所有位置参数,并将其放在元组中。形参对应顺序: 位置参数,*args,默认参数
**kwargs 动态传参,他将所有的关键字参数(无意义的)放到一个字典中。
1 def func(a,b,c,**kwargs): 2 print(kwargs) 3 func(1,2,r=4,b1=5,c1=6,c=7)
1 def func(a,b,c,d,*args,e='男‘,**kwargs): 2 print(a) 3 print(b) 4 print(c) 5 print(d) 6 print(args) 7 print(e) 8 print(kwargs) 9 func(1,2,3,4,5,6,7,v=3,m=7,h=9,e='女‘)
*的魔法运用
在函数的调用执行时,
*可迭代对象,代表打散(list,tuple,str,dict(键))将元素一一添加到args。
**字典,代表打散,将所有键值对放到一个kwargs字典里。
在函数定义时, *args,**kwargs代表的是聚合。
1 def func(*args): 2 print(args) 3 l1 = [1,2,30] 4 l2 = [1,2,33,21,45,66] 5 tu = (1,2,3) 6 func(1,2,30,1,2,33,21,45,66) 7 func(*'qweqrfdsaf') 8 func(*{'name':'alex',"age":12}) 9 func(*l1,*l2) 10 11 12 13 def func(*args): 14 print(args) 15 func(1,2,3,10,20,80) 16 17 def func(**kwargs): 18 print(kwargs) 19 20 dic1 = {'name1':'alex','age1':46} 21 dic2 = {'name':'老男孩','age':56} 22 func(**dic1,**dic2)
名称空间(命名空间),临时名称空间,内置名称空间。
全局名称空间,名称空间,命名空间,全局命名空间。
局部命名空间,临时名称空间,临时命名空间,局部名称空间,。
内置名称空间,所有的内置函数等存储的空间。
加载顺序:
内置名称空间 ---> 全局名称空间--->(函数执行时)局部名称空间。
取值顺序:
函数执行时:局部名称空间 -->全局名称空间 -->内置名称空间
1 a = 4 2 b = 3 3 c = [1,2,3,4] 4 c1 = {'name':'alex'} 5 6 def func1(): 7 name = '老男孩' 8 print(name) 9 func1() 10 当执行函数的时候,他会在内存中开辟一个临时名称空间,存放函数体内的所有变量与值的关系, 11 随着函数的执行完毕,临时空间自动关闭。 12 input(),print(),len 内置函数 13 14 name = '老男孩' 15 def func1(): 16 name = 'taibai' 17 print(name) 18 func1() 19 def my_len(argv): 20 return 666 21 print(len([12,3,])) 22 a = 2 23 print(a) 24 def func1(): 25 age = 11 26 print(age)
函数的嵌套
函数什么时候执行? 函数调用的时候执行。
代码从上至下依次执行, 调用函数:函数里面从上至下依次执行。
1 函数什么时候执行? 函数调用的时候执行。 2 # 代码从上至下依次执行, 调用函数:函数里面从上至下依次执行。 3 # print(111) 4 # def func1(): 5 # print(333) 6 # 7 # def func2(): 8 # print(444) 9 # 10 # def func3(): 11 # print(555) 12 # func2() 13 # 14 # func1() 15 # print(222) 16 # 111 333 222 17 18 # print(111) 19 # def func1(): 20 # print(333) 21 # func2() 22 # print(666) 23 # 24 # def func2(): 25 # print(444) 26 # 27 # def func3(): 28 # print(555) 29 # 30 # func1() 31 # print(222) 32 # 111 333 444 666 222 33 34 35 # print(111) 36 # def func1(): 37 # print(333) 38 # func2() 39 # print(666) 40 # 41 # def func2(): 42 # print(444) 43 # func3() 44 # 45 # def func3(): 46 # print(555) 47 # 48 # func1() 49 # print(222) 50 # 111 333 444 555 666 222 51 52 # a = 2 53 # b = 3 54 # def func1(): 55 # c = 5 56 # d = 6 57 # print(globals()) # 全局变量放在一个字典中 58 # return locals() # {'c': 5, 'd': 6} 59 # print(func1()) 60 61 # print(globals()) # 全局名称空间:所有变量 62 # print(locals()) # 局部名称空间:所有变量
locals(),golbals()
locals()全局名称空间:所有变量放在一个列表
golbals()局部名称空间:所有变量放在一个列表
1 a = 2 2 b = 3 3 def func1(): 4 c = 5 5 d = 6 6 print(globals()) # 全局变量放在一个字典中 7 return locals() # {'c': 5, 'd': 6} 8 print(func1()) 9 10 # print(globals()) # 全局名称空间:所有变量 11 # print(locals()) # 局部名称空间:所有变量
关键字 global nonlocal
global
1,在局部空间内,声明一个全局变量
2,在局部空间内改变一个全局变量
nonlocal
1,不能修改全局变量。
2、在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。
1 # global 2 # 1,在局部空间内,声明一个全局变量 3 # def func1(): 4 # global name 5 # name = '老男孩' 6 # print(name) 7 # func1() 8 # print(name) 9 # 2,在局部空间内改变一个全局变量 10 # a = 4 11 # def func1(): 12 # global a 13 # a = 5 14 # print(a) 15 # func1() 16 # print(a) 17 18 # nonlocal 19 # 1,不能修改全局变量。 20 21 # a = 4 22 # def func1(): 23 # # nonlocal a 24 # a = 5 25 # print(a) 26 # func1() 27 # print(a) 28 # 在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改, 29 # 并且引用的哪层,从那层及以下此变量全部发生改变。 30 # a = 4 31 # def func1(): 32 # b = 6 33 # def func2(): 34 # b = 666 35 # print(b) #666 36 # func2() 37 # print(b) # 6 38 39 # func1() 40 # 41 b = 4 42 def func1(): 43 global b 44 b = 6 45 def func2(): 46 # nonlocal b 47 b = 666 48 print(b) # 49 50 print(b) 51 func2() 52 print(b) # 53 print(b) 54 func1() 55 print(b)





1 # global 2 # 1,在局部空间内,声明一个全局变量 3 # def func1(): 4 # global name 5 # name = '老男孩' 6 # print(name) 7 # func1() 8 # print(name) 9 # 2,在局部空间内改变一个全局变量 10 # a = 4 11 # def func1(): 12 # global a 13 # a = 5 14 # print(a) 15 # func1() 16 # print(a) 17 18 # nonlocal 19 # 1,不能修改全局变量。 20 21 # a = 4 22 # def func1(): 23 # # nonlocal a 24 # a = 5 25 # print(a) 26 # func1() 27 # print(a) 28 # 在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改, 29 # 并且引用的哪层,从那层及以下此变量全部发生改变。 30 # a = 4 31 # def func1(): 32 # b = 6 33 # def func2(): 34 # b = 666 35 # print(b) #666 36 # func2() 37 # print(b) # 6 38 39 # func1() 40 # 41 b = 4 42 def func1(): 43 global b 44 b = 6 45 def func2(): 46 # nonlocal b 47 b = 666 48 print(b) # 49 50 print(b) 51 func2() 52 print(b) # 53 print(b) 54 func1() 55 print(b)


浙公网安备 33010602011771号