可变关键字参数使用**定义,在函数体内,可变关键字参数是一个字典。可变关键字参数的key都是字符串,并且符合标识符定义规范。
- def fn(**kwargs):
- print(kwargs)
- dict01 = {'name': 'Laven Liu', 'age': 29}
- fn(**dict01)
- # fn(dict01)
- fn(name='Laven Liu', age=29)
- {'name': 'Laven Liu', 'age': 29}
- {'name': 'Laven Liu', 'age': 29}
可变位置参数只能以位置参数的形式调用可变关键字参数只能以关键字参数的形式调用可变位置参数必须在可变关键字参数之前
- In[18]: def fn(*args, **kwargs):
- ...: print(args)
- ...: print(kwargs)
- ...:
- In[19]: fn(1, 2, 3, a=1, b=2)
- (1, 2, 3)
- {'a': 1, 'b': 2}
- In[20]: def fn(*args, x, y):
- ...: print(args)
- ...: print(x, y)
- ...:
- In[21]: fn(1, 2, 3, 4)
- ---------------------------------------------------------------------------
- TypeError Traceback (most recent call last)
- in ()
- ----> 1 fn(1, 2, 3, 4)
- TypeError: fn() missing 2 required keyword-only arguments: 'x' and 'y'
- In[22]: fn(1, 2, x=3, y=4)
- (1, 2)
- 3 4
可变参数后置可变参数不和默认参数一起出现
7. 参数组合
在Python中定义函数,可以用必选参数、默认参数、可变参数和关键字参数,这4种参数都可以一起使用,或者只用其中某些,但是请注意,参数定义的顺序必须是: 必选参数、默认参数、可变参数和关键字参数
比如定义一个函数,包含上述4种参数:
- >>> def func(a, b, c=0, *args, **kwargs):
- ... print('a =', a, 'b =', b, 'c =', c, 'args = ', args, 'kwargs = ', kwargs)
在函数调用的时候,Python解释器自动按照参数位置和参数名把对应的参数传进去。
- >>> func(1, 2)
- a = 1 b = 2 c = 0 args = () kwargs = {}
- >>> func(1, 2, c=3)
- a = 1 b = 2 c = 3 args = () kwargs = {}
- >>> func(1, 2, 3, 'a', 'b')
- a = 1 b = 2 c = 3 args = ('a', 'b') kwargs = {}
- >>> func(1, 2, 3, 'a', 'b', x=99)
- a = 1 b = 2 c = 3 args = ('a', 'b') kwargs = {'x': 99}
- >>>
最神奇的是通过一个tuple和dict,我们也可以调用该函数:
- >>> args = (1, 2, 3, 4)
- >>> kwargs = {'x': 99}
- >>> func(*args, **kwargs)
- a = 1 b = 2 c = 3 args = (4,) kwargs = {'x': 99}
所以,对于任意函数,都可以通过类似func(*args, **kwargs)的形式调用它,无论它的参数是如何定义的。
8. 参数解构
参数解构发生在函数调用时,可变参数发生函数定义的时候。参数解构分为两种形式,一种是位置参数解构,另一种是关键字参数解构。
参数结构的两种形式:
位置参数解构,使用一个星号。解构的对象为可迭代对象,解构的结果为位置参数。关键字参数解构,使用两个星号。解构的对象为字典,解构的结果为关键字参数。 (编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|