1. *args与**kwargs
*args:接收不确定长度的位置参数(即实参可能为0个、一个或多个),并将所有接收到的位置参数打包成一个元组,传入args参数
**kwargs:接收不确定长度的关键字参数,并将所有接收到的关键字参数打包成一个字典,传入kwargs参数
【有关于位置参数和关键字参数的区别可以看这里——一文快速理解Python函数中形参、实参、位置参数及关键字参数的概念】
2. 使用*args传递不定长位置参数
首先我们来看一个通过使用*args来传递加数的求和函数的实现。
def sum_num(*args):
print("args:", args)
print("The type of parameter arg is:", type(args))
result = 0
for num in args:
result += num
return result
sum_result = sum_num(1, 3, 5, 8)
print("The sum of the input numbers is:", sum_result)
------------------------------------------------------
args: (1, 3, 5, 8)
The type of parameter arg is: <class 'tuple'>
The sum of the input numbers is: 17
此例中,函数通过*args分别接受了4个加数,分别是1、3、5、8并将其打包存在参数args中,参数args的类型是元组,args=(1, 3, 5, 8)。通过一次for循环,我们实现了对args中所有参数的遍历并求和。
需要注意的是*args只接收位置参数,如果想向其传入关键字参数将会出现错误,显示该函数并不期望获得一个关键字参数。
def sum_num(*args):
print("args:", args)
print("The type of parameter arg is:", type(args))
result = 0
for num in args:
result += num
return result
sum_result = sum_num(1, 3, 5, a=8)
print("The sum of the input numbers is:", sum_result)
--------------------------------------------------------------------------
Traceback (most recent call last):
File "C:/Users/asus1/PycharmProjects/test/test.py", line 10, in <module>
sum_result = sum_num(1, 3, 5, a=8)
TypeError: sum_num() got an unexpected keyword argument 'a'
那如果想向函数传入不定长的关键字参数的话,我们就可以通过**kwargs来实现。
3. 使用**kwargs传递不定长关键字参数
在此同样以上文的求和函数为例,我们将每个传入的加数都变为关键字参数,首先观察一下参数kwargs。
def sum_num(**kwargs):
print("kwargs:", kwargs)
print("The type of parameter kwarg is:", type(kwargs))
sum_num(a=1, b=3, c=5, d=8)
-----------------------------------------------------------
kwargs: {'a': 1, 'b': 3, 'c': 5, 'd': 8}
The type of parameter kwarg is: <class 'dict'>
可以从控制台输出看到,当函数通过**kwargs接收关键字参数时,会将其打包成一个字典形式存入kwargs中,因此如果仍想实现对传入参数的求和,应当遍历字典中的所有值并实现加和,修改后的代码如下所示。
def sum_num(**kwargs):
print("kwargs:", kwargs)
print("The type of parameter kwarg is:", type(kwargs))
result = 0
for num in kwargs.values():
result += num
return result
sum_result = sum_num(a=1, b=3, c=5, d=8)
print("The sum of the input numbers is:", sum_result)
------------------------------------------------------------
kwargs: {'a': 1, 'b': 3, 'c': 5, 'd': 8}
The type of parameter kwarg is: <class 'dict'>
The sum of the input numbers is: 17
P.S.此处想要传递不定长位置参数或关键字参数不是必须以args和kwargs作为参数名,但是我们约定俗成地将这两个参数名作为传递不定长位置参数和关键字参数的名字。
为了方便大家理解,最后我们通过改变参数名实现一个简单的小应用o(∩_∩)o~
4. 打印著名艺人吴意饭(化名)的简要个人信息
def kris_info(*nicknames, **info):
print("吴意饭昵称")
print("、".join(nicknames))
print("\n吴意饭个人信息")
for key, value in info.items():
print("{}:{}" .format(key, value))
kris_info('加拿大电鳗', '吴签', '牙签', 名字='吴意饭', 名言='我的很大,你忍一下~',
作品='《有一个地方只有我们知道》《从此以后》《大碗牢饭》')
-------------------------------------------------------------------------------
吴意饭昵称
加拿大电鳗、吴签、牙签
吴意饭个人信息
名字:吴意饭
名言:我的很大,你忍一下~
作品:《有一个地方只有我们知道》《从此以后》《大碗牢饭》
可以看到,这里我们分别通过*nickname和**info来传递吴意饭的昵称和个人信息而非原先的*args和**kwargs。
需要注意的是:在传参时位置参数必须在关键字参数之前,否则就会像下面这样子报错,显示关键字参数在位置参数之后为语法错误。
def kris_info(*nicknames, **info):
print("吴意饭昵称")
print("、".join(nicknames))
print("\n吴意饭个人信息")
for key, value in info.items():
print("{}:{}" .format(key, value))
kris_info(名字="吴意饭", 名言='我的很大,你忍一下~', 作品='《有一个地方只有我们知道》《从此以后》《大碗牢饭》',
"加拿大电鳗", "吴签", "牙签")
----------------------------------------------------------------------------------------------------------
File "C:/Users/asus1/PycharmProjects/test/test.py", line 10
"加拿大电鳗", "吴签", "牙签")
^
SyntaxError: positional argument follows keyword argument
|