Note:多个实参,放到一个元组里面,以*开头,可以传递多个参数;**是形参中按照关键字传值吧多余的传值以字典的方式实现。
------------------------------------------手动分割线------------------------------------
*args:将实参中按照位置传值,多出来的值都给args,以元组方式实现。
首先,为理解*args,实现一个乘法函数:
def multiply(x, y):
print (x * y)
multiply(5, 4)
输出结果为:20
改变输入:
def multiply(x, y):
print (x * y)
multiply(5, 4, 3)
输出结果为:TypeError: multiply() takes 2 positional arguments but 3 were given
使用*args,修改函数:
def multiply(*args):
z = 1
for num in args:
z *= num
print(z)
multiply(4, 5)
multiply(10, 9)
multiply(2, 3, 4)
multiply(3, 5, 10, 6)
输出结果为:
20
90
24
900
因为我们使用*args向我们的函数发送一个可变长度的参数列表,所以我们能够将尽可能多的参数传入函数调用中。使用*args,你可以创建更灵活的代码,在你的函数中接受不同数量的非keyworded参数。
示例1:
def func(x,*args):
print(x)
print(args)
func(1,2,3,4,5) #1->x 2,3,4,5->args
结果为:
1
(2, 3, 4, 5)
当args与位置参数和默认参数混用的情况下:(注意三者顺序)
示例一:(三者顺序是:位置参数、默认参数、*args)
def func(x,y=1,*args):
print('x = ',x)
print('y = ',y)
print('args = ',args)
func(1,2,3,4,5) #1->x 2->y 3,4,5->args
输出结果为:
x = 1
y = 2
args = (3, 4, 5)
示例二:(三者顺序为:位置参数、*args、默认参数)
def func(x,*args,y=1):
print('x = ',x)
print('args = ',args)
print('y = ',y)
func(1,2,3,4,5) #1->x 2,3,4,5->args 1->y
输出结果为:
x = 1
args = (2, 3, 4, 5)
y = 1
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 手动分割线 -------------------------------------------------
**kwargs:形参中按照关键字传值把多余的传值以字典的方式实现
例如1:
def print_kwargs(**kwargs):
print(kwargs)
print_kwargs(kwargs_1="Shark", kwargs_2=4.5, kwargs_3=True)
结果为:
{'kwargs_1': 'Shark', 'kwargs_2': 4.5, 'kwargs_3': True}
例如2:
def print_values(**kwargs):
for key, value in kwargs.items():
print("The value of {} is {}".format(key, value))
print_values(my_name="Sammy", your_name="Casey")
结果为:
The value of my_name is Sammy
The value of your_name is Casey
Note:**kwargs形成的字典不会按照函数的输入形式排序,字典格式是随机的。结果也有可能为:
The value of your_name is Casey
The value of my_name is Sammy
*******************
示例:
def func(x,**kwargs):
print('x = ',x)
print('kwargs = ',kwargs)
func(1,y=1,a=2,b=3,c=4) # y a b c -> kwargs
结果为:
x = 1
kwargs = {'a': 2, 'c': 4, 'b': 3, 'y': 1}
关于**kwargs、位置参数、*args、默认参数混用问题:(注意顺序)
位置参数、*args、**kwargs三者的顺序必须是:位置参数、*args、**kwargs,否则会出错。
示例1:
def func(x,*args,**kwargs):
print('x = ',x)
print('args = ',args)
print('kwargs = ',kwargs)
func(1,2,3,4,y=1,a=2,b=3,c=4)
结果为:
x = 1
args = (2, 3, 4)
kwargs = {'b': 3, 'c': 4, 'a': 2, 'y': 1}
错误示例:(顺序错误)
def func(x,**kwargs,*args):
print('x = ',x)
print('args = ',args)
print('kwargs = ',kwargs)
func(1,y=1,a=2,b=3,c=4,2,3,4)
结果为:
SyntaxError: invalid syntax
位置参数、默认参数、**kwargs的顺序必须为:位置参数、默认参数、**kwargs,否则会报错。
示例:
def func(x,y=2,**kwargs):
print('x = ',x)
print('y = ',y)
print('kwargs = ',kwargs)
func(1,y=1,a=2,b=3,c=4)
结果为:
x = 1
y = 1
kwargs = {'c': 4, 'a': 2, 'b': 3}