2

我想编写一个函数,它的默认值是函数的另一个输入。我想要这样的东西:

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”。有没有一种干净的方法可以做到这一点?我只是以错误的方式思考这个问题吗?

4

5 回答 5

3

人们通常做的是

def pythag_thm(a, b=None):
    if b is None:
        b = a

    return (a ** 2 + b ** 2) ** .5
于 2013-02-14T22:13:44.003 回答
2

默认参数是在函数定义时评估的,所以没有办法这样做。

import math
def pythag_thm(a, b=None):
    if b is None:
        b = a
    return math.hypot(a, b)
于 2013-02-14T22:13:50.623 回答
1
  1. 人们通常None为此使用:

    def pythag_thm(a, b=None):
        b = b if b is not None else a
        ...
    
  2. 如果None对您来说是一个有效值,您b可以创建自己的DEFAULT值:

    DEFAULT = object()
    
    def pythag_thm(a, b=DEFAULT):
        b = b if b is not DEFAULT else a
        ...
    
  3. 如果你有心情,你也可以*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 的并且不需要您摆弄argsand kwargs

于 2013-02-14T22:20:58.677 回答
0

输入中没有 b 知道 a 是什么的范围。它们只有在函数体中才存在

我能想到的最pythonic的方式是:

def example(a, b=None):
    if not b: b = a
    // code here

编辑:与@pavel 的答案相同 - 必须学习更快的打字。对于潜伏者:存在行为差异。帕维尔的回答更好,我的不会正确处理类似的事情:

example (2, 0)

因为 b is None 测试是更正确的

于 2013-02-14T22:14:40.953 回答
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
于 2013-02-14T22:41:51.753 回答