2013-08-07 122 views
2

仅供参考我指的答案在这post困惑在Python功能**参数调用

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

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 

任何人都可以解释这一点。而在一般情况下,如何在功能知道什么时候结束valuesoptions开始

回答

4
if neg: 

这条线是马车。它应该是:

if options["neg"]: 

如何函数知道什么时候结束的值和选项何时开始?

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

+1

'if options.get(“neg”,False):''包含'if'条件。 – glglgl

+0

@glglgl较短的代码似乎会减慢约2.4倍。我猜这是由于'dict.get'方法调用。 – RussW

+0

@RussW Oups!好的,但在多线程程序的情况下,它没有竞争条件。 – glglgl

2

你犯了一个小错误。改变你的代码到下面,它应该工作。从options字典刚刚得到的"neg"值,(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字典里没有密钥"neg"(如处理您的第一个if条件),那么,get(...)返回Falses默认值不否定,如果options包含"neg",那么它的值返回,在这种情况下,s取决于字典中的值。

+0

'如果options.get(“neg”,False):'包含'if'条件。 – glglgl

+1

@glglgl:的确如此。谢谢。添加到答案中并引用给您。 :) –