动态参数 *args **kwargs
*args 动态参数,万能参数
# args 接受的就是实参对应的 所有位置参数,并将其放在元祖中。
def func(*args): print(args) func(1,2,3,4,5,6) # (1, 2, 3, 4, 5, 6)
# 形参对应顺序: 位置参数, *args ,默认参数。
def func(a,b,c,*args,sex = '男'): print(a) print(b) print(c) print(args) print(sex) func(2,3,4,5,6,7,sex = '女') # 2 # 3 # 4 # (5, 6, 7) # 女
**kwargs 动态传参,它将所有的关键字参数(无意义的)放到一个字典中。
def func(a,b,c,**kwargs): print(a) print(b) print(c) print(kwargs) func(1,2,d = 4,v = 6,c = 3) # 1 # 2 # 3 # {'d': 4, 'v': 6}
形参的最终顺序: 位置参数, *args,默认参数,**kwargs
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,e = '女',f = 4,v = 6,) # 1 # 2 # 3 # 4 # (5, 6, 7) # 女 # {'v': 6, 'f': 4}
# 在函数的调用执行时,
*可迭代对象,代表打散可迭代对象(list,tuple,str,dict(键))将元素一一加入到args.
# 在函数定义时,*args,**kwargs 代表的是聚合。
def func(*args): print(args) l1 = [1,2,3] l2 = [4,5,6,7] func(*l1,*l2) # (1, 2, 3, 4, 5, 6, 7)
def func(*args): print(args) func(1,2,3,4,5,6,7) # (1, 2, 3, 4, 5, 6, 7)
**字典,代表打散,将所有键值对放到一个kwargs字典里。
def func(**kwargs): print(kwargs) dic1 = {'k1':1,'k2':2,'k3':3} dic2 = {'name':'顾清秋','age':17} func(**dic1,**dic2) # {'name': '顾清秋', 'k3': 3, 'age': 17, 'k2': 2, 'k1': 1}
命名空间一共分为三种:
全局命名空间:代码在运行的伊始,创建的存储 ‘变量名与值的关系’ 的空间叫做全局命名空间。
局部命名空间,在函数的运行中开辟的临时空间叫做局部命名空间。
内置命名空间。python解释器存在的内置函数运行时的空间叫做内置命名空间。
三种命名空间的加载顺序与取值顺序:
加载顺序:内置命名空间--->全局命名空间--->局部命名空间。
取值顺序: 局部命名空间--->全局命名空间--->内置命名空间。
综上所述,在找寻变量时,从小范围,一层一层到大范围去找寻。
作用域:
作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。
全局作用域:包含内置命名空间,全局命名空间,在整个文件的任意位置都能被引用,全局有效。
局部作用域:局部命名空间,只能在局部范围内生效。
globals 和 locals 方法:
globals: 函数会以字典类型返回当前位置的全部全局变量。
locals: 函数会以字典类型返回当前位置的全部局部变量。
c = 1 def func(): a = 12 b = 20 print(locals()) #{'b': 20, 'a': 12} print(globals()) func()
global 关键字,nonlocal 关键字。
global:
1. 声明一个全局变量。
def func(): global a a = 3 func() print(a) # 3
2. 在局部作用域想要对全局作用域的全局变量进行修改时,需要用到global(限于字符串,数字)。
count = 1 def search(): global count count = 2 search() print(count) # 2
对可变数据类型(list,dict,set)可以直接引用不用通过global。
li = [1,2,3] dic = {'k1':1} def change(): li.append('a') dic['k2'] = 2 print(li) #[1, 2, 3, 'a'] print(dic) #{'k2': 2, 'k1': 1} change() print(li) #[1, 2, 3, 'a'] print(dic) #{'k2': 2, 'k1': 1}
nonlocal:
1,不能修改全局变量。
2,在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。
def func(): b = 2 def func1(): b = 4 print(b) # 4 def func2(): nonlocal b b = b + 4 # 8 print(b) func2() print(b) # 8 func1() print(b) # 2 func()