1、可变长参数
可变长参数指的是实参的个数不固定。
实参无非分为位置实参和关键字实参两种
2、处理可变长参数的机制
形参必须要有两种机制来分别处理按照位置定义的实参溢出的情况:*
按照关键字实参溢出的情况:**
针对这两种形式的可变长,形参也应有有两种解决方案,分别是*args,**args
3、示例
需要处理这样的函数
示例1:
def foo(x,y): print(x,y)foo(1,2,3,4,5,6) #这样的示例需要*来处理
处理示例1:
def foo(x,y,*nums): #nums=(3, 4, 5, 6, 7, 8) print(x) print(y) print(nums)foo(1,2,3,4,5,6,7,8)
示例2:
def foo(x,y): print(x) print(y)foo(x=1,y=2,a=3,b=4) #这样的示例需要**来处理
处理示例2:
def foo(x,y,**nums): #nums={'b': 4, 'a': 3}
print(x) print(y) print(nums)foo(y=2,x=1,b=4,a=3)
通常情况将记为*args ,**kwargs
示例3:
def foo(x,y,*args): print(x) print(y) print(args)foo(1,2,3,4,5,6,7,8,9)
示例4:
def foo(x,y,**kwargs): print(x) print(y) print(kwargs)foo(1,2,a=10,b=20,c=30)
4、*args的扩展用法
*就是位置参数,后面跟的是元组格式
def foo(x,y,*args): print(x) print(y) print(args)foo(1,2,*(3,5,6,7,8)) #foo(1,2,3,5,6,7,8)
5、**kwargs的扩展用法
**就是关键字实参,后面跟的是字典格式
def foo(x,y,**kwargs): print(x) print(y) print(kwargs)foo(1,2,**{ 'name':'egon','age':18,'sex':'male'}) #foo(1,2,age=18,name='egon',sex='male')
6、混合使用
*args 必须在**kwargs的前面,因为*args是位置参数,而**kwargs是关键字参数
def foo(x,*args,**kwargs): print(x) print(args) print(kwargs)foo(1,3,a=2,b=1)
7、函数引用
import timedef register(name,age,sex='male'): print(name) print(age) print(sex) time.sleep(3)def wrapper(*args,**kwargs): start_time=time.time() register(*args,**kwargs) stop_time=time.time() print('run time is %s' %(stop_time-start_time))wrapper('egon',18)
8、命名关键字参数
*后定义的参数称为命名关键字参数,必须是被以关键字实参的形式传值(有默认值的除外)
def foo(*args,x): print(x) print(args)foo(1,2,3,4,5,x=10)
def foo(name,age,*,sex): print(name) print(age) print(sex)foo('egon',18,sex='falme'
def foo(name,age,*,sex,group): print(name) print(age) print(sex) print(group)foo('egon',18,group='it',sex='male')
def foo(name,age,*args,sex='male',group): print(name) print(age) print(sex) print(group)foo('egon',18,22,33,44,55,group='it')