1.动态参数:
动态参数,也叫不定长传参,就是你需要传给函数的参数很多,不定个数,那这种情况下,你就用*args,**kwargs接收,args是元祖形式,接收除去键值对以外的所有参数,kwargs接收的只是键值对的参数,并保存在字典中。
def sum(*args): count = 0 for i in args: count +=i return count print(sum(1,2,3,4,6,8,9,70))
def func(*args,**kwargs): print(kwargs) func(a='caoshirong',b=123)
*的魔性用法
在函数的定义时,在*位置参数,**位置参数聚合。
在函数的调用(执行)时,在*位置参数,**位置参数打散。
l1 = [1,2,3] l2 = [111,22,33,'alex'] def func(*args,**kwargs): # print(args) print(kwargs) # func(*l1,*l2) func(**{'name':'alex'},**{'sex':'boy'})
#形参的顺序
#位置参数,*args,默认参数,**kwargs.
2.名称空间,作用域,取值顺序等
全局命名空间:代码在运行伊使部命名空间:在函数运行中临时临时开辟的空间叫局部#命名空间一共分为三种:
全局命名空间
局部命名空间(临时的)
内置命名空间:内置命民中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法。
#2
作用域:
全局作用域:全局名称空间,内置名称空间
局部作用域:局部名称空间(临时)
#3
取值顺序:就近原则
局部名称空间----------->全局名称空间-------------->内置名称空间(单向从小到大范围)
len = 6 def func1(): len = 3 func1() print(len) def len(l): return l print(len([1,2,3]))
加载顺序:
内置名称空间---------->全局名称空间(当程序执行时)----------->局部名称空间(当函数调用的时候)
#4函数嵌套
def func1(): print(111) def func2(): print(222) func1() print(333) print(666) func2() print(555)
#global nonloca
#局部名称空间 对全局名称空间的变量可以引用,但是不能改变。
count = 1 def func(): count +=1 print(count) # local variable 'count' referenced before assignment func()
#如果你在局部名称空间 对一个变量进行修改,那么解释器会认为你的这个变量在局部中已经定义了,
但是对于上面的列题,局部中没有定义,所以他会报错。
#global
1.在局部名称空间声明一个全局变量。
2.在局部名称空间可以对全局变量进行修改。
3.对可变数据类型(list,dict,set)可以直接引用不用通过global。
count = 1 def func(): global count count +=1 print(count) func()
li = [1,2,3] dic = {'a':'b'} def change(): li.append('a') dic['q'] = 'g' print(dic) print(li) change() print(li) print(dic)
#nonlocal
1.子函数对父函数的变量进行修改
2.此变量不能是全局变量
#在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,
#并且引用的那层,从那层及以下此变量全部发生改变
def func1(): count = 666 def inner(): print(count) def func2(): nonlocal count count += 1 print('func2',count) func2() print('inner',count) inner() print('func1',count) func1()