解释Python中的关键字参数(VarArgs)

20
请看下面的代码:-
#!/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))

能否有人解释一下如何使用 *numbers 和 **keywords 选取参数?简单的解释将不胜感激。谢谢!


你在 http://docs.python.org/reference/expressions.html#calls 的哪一部分感到困惑了?你能更具体地说明哪个段落不够完整吗? - S.Lott
2个回答

29
在你的代码中,numbers 被赋值为元组 (1,2,3)。keywords 被赋值为字典,包含 vegetablesfruits
一个星号 (*) 定义位置参数。这意味着你可以接收任意数量的参数。你可以将传递的参数视为元组。
两个星号 (**) 定义关键字参数。
参考材料可在此处找到。
示例:
Python 2.x(在关键字参数之前)
def foo(x, y, foo=None, *args): print [x, y, foo, args]

foo(1, 2, 3, 4)            --> [1, 2, 3, (4, )]  # foo == 4
foo(1, 2, 3, 4, foo=True)  --> TypeError

Python 3.x(带有仅限关键字参数)

def foo(x, y, *args, foo=None): print([x, y, foo, args])

foo(1, 2, 3, 4)           --> [1, 2, None, (3, 4)]  # foo is None
foo(1, 2, 3, 4, foo=True) --> [1, 2, True, (3, 4)]

def combo(x=None, *args, y=None): ...  # 2.x and 3.x styles in one function
尽管有经验的程序员可以理解2.x中发生了什么,但这是反直觉的(只要有足够的位置参数,位置参数就会绑定到foo=,而不管关键字参数如何)。
Python 3.x引入了更直观的关键字唯一参数,使用PEP-3102(在变长参数之后的关键字参数只能通过名称绑定)。

谢谢 - 更多关于这个的信息 - 这是否意味着第一个参数总是列表/元组,第二个参数为字典? - rgolwalkar
1
嗨,S.Lott - 我读了kgiannakakis的解释,然后阅读了http://docs.python.org/py3k/tutorial/controlflow.html#keyword-arguments - 它消除了我的疑虑 - 谢谢您的检查。 - rgolwalkar
1
@kgiannakakis:在运行您的Python 2.x示例后,foo应该是3,不是吗? - Treefish Zhang

2

让我们先解析一下这个函数。

这个函数总共有三个参数:

  1. initial=5 => 这是一个关键字参数。
  2. *numbers => 这也被称为*args。你可以传递任意数量的参数。
  3. **keywords => 这是一个类似字典的关键字参数,每个键都对应着一个给定的值。

==========================================

count = initial

* 我们知道,initial是一个关键字参数,它包含了一个值为5。

* 所以现在,把值为5赋给一个名为count的变量。

for number in numbers:

* number是numbers的占位符变量。

* 我们知道,numbers是一个任意参数,因此它可以带上任何数量的参数或值。

* 现在,number将包含传递给函数中numbers参数的参数。

count += number

* 每次循环遍历numbers参数并将count加入到number中,并返回一个count。

* 当count为5时,它会遍历参数并添加第一个实例的参数。这将重复进行直到循环耗尽。

for key in keywords:

* 这有点棘手,因为这次的参数是字典类型,其中包含键和对应的值。

count += keywords[key]

return count

100 + 50 + (10, 1, 2, 3) => 166。

我知道这个答案有点大,但理解每个函数的基本概念是一名全面的程序员的核心优势。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接