我想编写一个具有默认值的函数,该默认值是函数的另一个输入。我想要这样的事情:
def pythag_thm(a, b=a):
return (a**2 + b**2)**.5
但我得到NameError: name 'a' is not defined
。我意识到我可以做类似的事情:
def pythag_thm(a, b=False):
if b==False:
return (a**2 + a**2)**.5
else:
return (a**2 + b**2)**.5
但这似乎不是'pythonic'。有干净的方法吗?我只是以错误的方式思考这个问题吗?
答案 0 :(得分:3)
人们通常做的是
def pythag_thm(a, b=None):
if b is None:
b = a
return (a ** 2 + b ** 2) ** .5
答案 1 :(得分:2)
默认参数在函数定义时计算,因此无法以这种方式执行。
import math
def pythag_thm(a, b=None):
if b is None:
b = a
return math.hypot(a, b)
答案 2 :(得分:1)
人们通常会使用None
:
def pythag_thm(a, b=None):
b = b if b is not None else a
...
如果None
是您b
的有效值,则可以创建自己的DEFAULT
值:
DEFAULT = object()
def pythag_thm(a, b=DEFAULT):
b = b if b is not DEFAULT else a
...
如果您有心情,您也可以自己处理*args
和**kwargs
:
def pythag_thm(a, *args, **kwargs):
try
b = args[0]
assert len(args) == 1
except IndexError:
try:
b = kwargs.pop('b')
assert not kwargs
except KeyError:
b = a
...
您可能希望坚持使用变体1或2,因为它是最pythonic的,并且不要求您使用args
和kwargs
。
答案 3 :(得分:0)
b的输入中没有范围可以知道是什么。它们不存在,直到它们处于函数体内
我能想到的最蟒蛇的方式是:
def example(a, b=None):
if not b: b = a
// code here
编辑:与@ pavel的答案相同 - 学习更快的打字。对于潜伏者:存在行为差异。帕维尔的答案更好,我不会正确处理类似的事情:
example (2, 0)
因为b是None测试是更正确的
答案 4 :(得分:0)
在提供默认值时要特别小心,例如,当您希望默认值为列表时,这是一个错误:
>>> def function_with_default(arg=[]):
... return arg
...
这是一个意外结果的例子:
>>> ret = function_with_default()
>>> ret
[]
>>> ret.append(2)
>>> # unexpected side-effects ...
>>> ret2 = function_with_default()
>>> ret2
[2]
上面的示例中发生的是您实际上可以修改对象。 这是没有副作用的方法:
>>> def function_with_default(arg=None):
... if arg is None:
... arg = []
... return arg
...
相同的例子,不同的输出:
>>> ret = function_with_default()
>>> ret
[]
>>> ret.append(2)
>>> # no unexpected side-effects this time ...
>>> ret2 = function_with_default()
>>> ret2
[]
回答你的问题,你可以使用。
def pythag_thm(a, b=None):
if b is None:
b = a
return (a**2 + b**2)**.5