2

作为参考,我指的是这篇文章中的答案

答案的作者给出了以下代码

def sum(*values, **options):
    s = 0
    for i in values:
        s = s + i
    if "neg" in options:
        if neg:
            s = -s
    return s

s = sum(1, 2, 3, 4, 5)            # returns 15
s = sum(1, 2, 3, 4, 5, neg=True)  # returns -15
s = sum(1, 2, 3, 4, 5, neg=False) # returns 15

但是,当我在我的上运行时,出现以下错误

NameError: global name 'neg' is not defined

谁能解释一下。一般来说,函数如何知道何时values结束和何时options开始

4

2 回答 2

4
if neg:

那条线有问题。它应该是:

if options["neg"]:

函数如何知道值何时结束以及选项何时开始?

未命名的值进入*values。关键字参数进入**options

于 2013-08-07T14:37:15.500 回答
3

你犯了一个小错误。将您的代码更改为以下内容,它应该可以工作。"neg"只需从options字典中获取值,(values保存未命名的参数并options保存关键字参数)

>>> def sum(*values, **options):
        s = 0
        for i in values:
            s = s + i
        if "neg" in options:
            if options["neg"]:
                s = -s
        return s

>>> s = sum(1, 2, 3, 4, 5, neg=True)
>>> s
-15
>>> sum(1, 2, 3, 4, 5)
15
>>> sum(1, 2, 3, 4, 5, neg=True)
-15
>>> sum(1, 2, 3, 4, 5, neg=False)
15

尽管正如@glglgl 指出的那样,将您的代码更改为以下内容会将这两个if语句合二为一。

>>> def sum(*values, **options):
    s = 0
    for i in values:
        s = s + i
    if options.get("neg", False):
            s = -s
    return s

如何get(...)工作?

如果options字典没有 key "neg",(由您的第一个 if 条件处理),则get(...)返回默认值Falseands不被否定,如果optionscontains "neg",则返回它的值,在这种情况下,s被否定取决于字典中的值。

于 2013-08-07T14:37:27.127 回答