一、可变长度的参数(*args与**kwargs的用法)
可变长度指的是在调用函数时,传入的值(实参)的个数不固定
而实参是用来为形参赋值的,所以对应着,针对溢出的实参必须有对应的形参来接收
1.可变长度的位置参数
*形参名:用来接收溢出的位置实参,溢出的位置实参会被*保存成元组的形式赋值给紧跟其后的形参
*后跟的可以是任意名字,但是约定俗成应该是args
def func(x, y, *args):
print(x, y, args)
func(1, 2, 3, 4, 5, 6)
# x= 1,y=2,args=(3, 4, 5, 6)
def my_sum(*args):
res = 0
for i in args:
res += i
return res
my_sum(1, 2, 3, 4)
2.*可以用在实参中,实参中带*,将*后的值打散成位置实参
def func(x, y, z):
print(x, y, z)
# *可以用在实参中,实参中带*,将*后的值打散成位置实参
func(*[1, 2, 3]) # 等价于func(1, 2, 3)
func(*(1, 2, 3))
# func(*[1, 2, 3, 4])
# func(*[1, 2])
# 以上两种方式都不行,多一个少一都不行,一定要和形参数相对应
my_list = [1, 2, 3]
func(*my_list) # 这里一定要加*号
my_tuple = (1, 2, 3)
func(*my_tuple)
3.形参和实参中都带*
def func(x, y, *args):
print(x, y, args)
# 实参先不带*
# 因为实参没有*,所以是整体传给args,并用元组保存
func(1, 2, [1, 2, 3, 4]) # 结果为:1 2 ([1,2,3,4],)
func(1, 2, (1, 2, 3, 4)) # 结果为:1 2 ((1,2,3,4),)
# 实参带*
# 带*,将*后的值打散,再传给args
func(1, 2, *[1, 2, 3, 4]) #等价于func(1,2,1,2,3,4) # 结果是:1 2 (1,2,3,4)
func(1, 2, *(1, 2, 3, 4)) # 结果是:1 2 (1,2,3,4)
func(1, *[1, 2, 3, 4]) # 结果是:1,1,(2,3,4)
func(*"hello") #func('h','e','l','l','o') 结果是:h e ('l','l','o')
4.可变长度的关键字参数
**形参名:用来接收溢出的关键字实参,**会将溢出的关键字实参保存成字典格式,然后赋值给紧跟其后的形参
**后跟的可以是任意名字,但是约定俗成应该是kwargs
def func(x, y, **kwargs):
print(x, y, kwargs)
# 传入方式有两种:
# 第一种:
func(1, y=2, a=3, b="it", c=[1, 2, 3])
# 第二种:
dict1 = {"age": 18, "name": "小美"}
func(1, 2, **dict1)
5.**可以用在实参中(**后跟的只能是字典),实参中带**,将**后的值打散成关键字实参
def func(x, y, z):
print(x, y, z)
# 字典里的key值要与形参名一致
func(**{"x":1, "y":2, "z":3})
6.形参与实参中都带**
def func(x, y, **kwargs):
print(x, y, kwargs)
# 记住,要将**后的值打散
func(**{"x":1, "y":2, "z":3, "p":4})
# 1 2 {'z':3,'p':4}
7.*args与**kwargs混合使用
def func(x, *args, **kwargs):
print(args)
print(kwargs)
func(1, 2, 3, 4, a=1, b=2, c=3)
def index(x, y, z):
print(x, y, z)
def wrapper(*args, **kwargs):# args=(1,) kwargs={'z':2,'y':3} 形参汇总
index(*args, **kwargs) # x=1 y=3 z=2 实参打散
wrapper(1, z=2, y=3)
二、命名关键字参数(了解)
在定义函数时,*后定义的参数,如下所示,称之为命名关键字参数
特点:
1.命名关键字形参必须按照key=value的形式为其传值
def func(x, y, *, a, b):# 其中a,b称之为命名关键字参数
print(x, y)
print(a, b)
func(1, 2, b=3, a=4)
def func(x, y, *, a=10, b):# a=10 叫做给命名关键字参数赋默认值,不是默认参数
print(x, y)
print(a, b)
func(1, 2, b=30)