VarArgs 参数

有时,你或许想定义一个能获取任意个数参数的函数,这可通过使用 * 号来实现。

#!/usr/bin/python
# Filename: total.py

def total(initial=5, *numbers, **keywords):
    count = initial
    for number in numbers:
        count += number
    for key in keywords:
        count += keywords[key]
    return count

print(total(10, 1, 2, 3, vegetables=50, fruits=100))

输出:
$ python total.py
166

如何工作:
当我们定义一个带星的参数,像 *param 时,从那一点后所有的参数被收集为一个叫做 ’param’ 的列表。(译者注:如在该例中,首先会给 initial 的值由 5 变成 10 ,然后 numbers 将 1,2,3,收集作为一个列表 numbers=(1,2,3))。

类似地,当我们定义一个带两个星的参数,像 **param 时,从那一点开始的所有的关键字参数会被收集为一个叫做 ’param’ 的字典。(译者注:在该例子中,从 vegetables=50 后的所有参数收集为一个字典 keywords=’vegetables’: 50, ’fruits’:100)。

Keyword-only 参数

如果想指定特定的关键参数为 keywor-only 而不是位置参数,可以在带星的参数后申明:

1 #!/usr/bin/python
2 # Filename: keyword_only.py
3
4 def total(initial=5, *numbers, vegetables):
5 count = initial
6 for number in numbers:
7 count += number
8 count += vegetables
9 return count
10
11 print(total(10, 1, 2, 3, vegetables=50))
12 print(total(10, 1, 2, 3,))
13 # Raises error because we have not supplied a default argument
value for 'vegetables'

输出:

$ python keyword_only.py
66
Traceback (most recent call last):
File "test.py", line 12, in <module>
print(total(10, 1, 2, 3))
TypeError: total() needs keyword-only argument vegetables

如何工作:
在带星号的参数后面申明参数会导致 keyword-only 参数。如果这些参数没有默认值,且像上面那样不给关键参数赋值,调用函数的时候会引发错误。

如果你想使用 keyword-only 参数,但又不需要带星的参数,可以简单地使用不适用名字的空星,如 def total(initial=5, *, vegetables)。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐