使用python函数arg作为默认参数

时间:2013-02-14 22:12:02

标签: python

我想编写一个具有默认值的函数,该默认值是函数的另一个输入。我想要这样的事情:

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'。有干净的方法吗?我只是以错误的方式思考这个问题吗?

5 个答案:

答案 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)

  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
        ...
    
  4. 您可能希望坚持使用变体1或2,因为它是最pythonic的,并且不要求您使用argskwargs

答案 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