测试输入如下,一个tuple,一个dict
lls = (78, 'stupid')
dds = dict(k1=1, k2=2, k3=3, name='stupid', num=76)
元组传入固定参数函数
通过*拆包
def unpack(num, word):
print('hope num...{}'.format(num))
print('hope stupid..'+word)
unpack(*lls)
输出如下:
hope num...78
hope stupid..stupid
不定长参数*args
传入元组时仍当作单个参数处理,同上拆包
def unpack2(*content):
print(repr(content))
print(', '.join('hope num...{}'.format(num) for num in content))
unpack2(lls)#((78, 'stupid'),)
值得注意的是
#unpack2(*lls, 96) #SyntaxError: only named arguments may follow *expression
unpack2(96, *lls) # 拆包符号仅能作最后一个参数
unpack2(*(lls+(1,))) #Solution
引用StackOverFlow的一篇回答:
只允许星号表达式作为参数列表中的最后一项。这将简化拆包代码,并使得允许将星号表达式分配给一个迭代器。这种行为被拒绝了,因为这太令人吃惊了。(违反了'最少惊讶原则')
但这种情况只会出现在Python2中。
Python3有“仅限关键字参数”
>>> def f(a, *, b):
··· return a, b
···
>>> f(1, b=2)
(1,2)
不定长参数/dict的拆包表达式:**args
**dict将每个键值对元素作为单个元素作为参数传入。
**dict放在形式参数末尾,键值对与其他形式参数名匹配,剩余的存入形参dict。
def depack(func):
def unpack3(name, num, **content):
print(repr(content)) #{'k3': 3, 'k2': 2, 'k1': 1}
print(', '.join(name*time for name,time in content.items())) #k3k3k3, k2k2, k1
func(num, name)
return unpack3
@depack
def unpack(num, word):
print('hope num...{}'.format(num)) #hope num...76
print('hope stupid..'+word) #hope stupid..stupid
unpack(**dds)
输出如下:
{'k3': 3, 'k2': 2, 'k1': 1}
k3k3k3, k2k2, k1
hope num...76
hope stupid..stupid