最后,有个较不常用的选项,是规定函式被呼叫时,可以使用任意数量的引数。这些引数会被包装进一个tuple 中。在可变数量的引数之前,可能有零个或多个普通引数:
def write_multiple_items(file, separator, *args):
file.write(separator.join(args))
通常,这些variadic(可变的)引数会出现在参数列表的最末端,这样它们就可以把所有传递给函式的剩余输入引数都捞起来。出现在*args
参数后面的任何参数必须是「仅限关键字」引数,意即它们只能作为关键字引数,而不能用作位置引数。
def concat(*args, sep="/"):
return sep.join(args)
concat("earth", "mars", "venus")
'earth/mars/venus'
concat("earth", "mars", "venus", sep=".")
'earth.mars.venus'
拆解引数列表
当引数们已经存在一个list 或tuple 里,但为了满足一个需要个别位置引数的函式呼叫,而去拆解它们时,情况就刚好相反。例如,内建的Range()函式要求分开的start和stop引数。如果这些引数不是分开的,则要在呼叫函式时,用*
运算子把引数们从list 或tuple 中拆解出来:
list(range(3, 6)) # normal call with separate arguments
[3, 4, 5]
args = [3, 6]
list(range(*args)) # call with arguments unpacked from a list
[3, 4, 5]
同样地,dictionary(字典)可以用**
运算子传递关键字引数:
def parrot(voltage, state='a stiff', action='voom'):
print("-- This parrot wouldn't", action, end=' ')
print("if you put", voltage, "volts through it.", end=' ')
print("E's", state, "!")
d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !