在Python中,有一种更简单的方法可以将一个参数默认为另一个参数吗?

时间:2014-03-27 23:03:42

标签: python function arguments default python-3.3

在Python 3.3.3中,当我尝试

def f(x,y=0):
 z = x+y
 return z

它运作得很好。
但是,当我尝试

def f(x,y=x):
 z = x+y
 return z

我得到NameError: name 'x' is not defined
我知道我可以做到

def f(x,y=None):
 y = x if y is None else y
 z = x+y
 return z




是否有更简洁或更好的方法来获得理想的结果?

4 个答案:

答案 0 :(得分:7)

没有。在函数定义时评估默认参数,在函数定义时,我们还没有x。明确地检查哨兵值是我们能做的最好的事情。

答案 1 :(得分:2)

不要害怕简单:

def f(x, y=None):
    if y is None:
        y = x
    z = x + y
    return z

你几乎肯定也应该有一个docstring和更好的标识符名称。

Python中的“简洁”通常是毫无意义的复杂。

Python是一种崇高,因为你可以用它编写非常清晰的代码。不要试图把它变成不应该的东西。

https://stackoverflow.com/questions/1103299/help-me-understand-this-brian-kernighan-quote

答案 2 :(得分:0)

def f(x,y=None):
 z = x + (x if y is None else y)
 return z

更简洁......

def f(x,y=None):
     return x + (x if y is None else y)

更简洁

f = lambda x,y=None:x + (x if y is None else y)

可能就像你能做到的那样简洁......

答案 3 :(得分:-2)

虽然没有明显更好,但这是一种方式:

def f(x, **kwargs):
    y = kwargs.get('y', x)
    z = x + y
    return z

print f(1)       # -> 2
print f(1, y=2)  # -> 3