在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
。
是否有更简洁或更好的方法来获得理想的结果?
答案 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