(Python版本3.7.4)
1. **与**kwargs
1.1 **的作用
**的作用是将字典中的内容作为参数传入函数中。
# 举例
def print1(a, b, c):
print(a, b, c)
# 定义一个字典
dict = {'a':1, 'b':2, 'c':3}
# 传入函数中
print1(**dict)
函数返回:
1 2 3
在print1()中有且只有三个positional argument,且都没有预设它们的值,因此字典中的参数只能包含且仅包含a,b,c三个参数。
dict = {'a':1, 'b':2, 'c':3, 'd':4}
print1(**dict) # 这就报错了
函数返回:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
in
2 # 因此字典中的参数只能包含且仅包含a,b,c三个参数。
3 dict = {'a':1, 'b':2, 'c':3, 'd':4}
----> 4 print1(**dict)
TypeError: print1() got an unexpected keyword argument 'd'
1.2 **kwargs的作用
在定义函数时使用**kwargs,可以接受不限量的参数个数
# 重新定义print1()
def print1(**kwargs):
i = 0
for elem in kwargs:
i = i + 1
print("第",i,"个参数:",elem, '=', kwargs[elem])
dict = {'a':1, 'b':2, 'c':3, 'd':4}
print1(**dict)
函数返回:
第 1 个参数: a = 1
第 2 个参数: b = 2
第 3 个参数: c = 3
第 4 个参数: d = 4
也可以:
print1(a=1, b=2, c=3, d=4, e=5)
返回:
第 1 个参数: a = 1
第 2 个参数: b = 2
第 3 个参数: c = 3
第 4 个参数: d = 4
第 5 个参数: e = 5
2. *与*args的作用
2.1 *的作用
与**不同的是,*解包的是列表(或元组),**解包的是字典
# 定义一个print2()来说明
def print2(a, b, c):
print(a, b, c)
list = [3, 5]
print2(1, *list)
tuple = (3, 5)
print2(1, *tuple)
返回:
1 3 5
1 3 5
由于print2()有且仅有三个positional argument,且都没有预定义它们的值,所以调用的时候必须给三个值。
2.2 *args的作用
# 重新定义print2()
def print2(*args):
i = 0
for elem in args:
i = i + 1
print("第",i,"个参数:",elem)
print(type(args))
list = [1,2,3,4,5]
print2(*list)
tuple = (1,2,3,4,5)
print2(*tuple)
返回:
第 1 个参数: 1
第 2 个参数: 2
第 3 个参数: 3
第 4 个参数: 4
第 5 个参数: 5
<class 'tuple'>
第 1 个参数: 1
第 2 个参数: 2
第 3 个参数: 3
第 4 个参数: 4
第 5 个参数: 5
<class 'tuple'>
这里的<class 'tuple'>代表在函数里的args实际上是个元组,即便可以传进去的也可以是list。