一个函数,将自身作为默认参数

时间:2016-07-19 13:12:19

标签: python

在定义时解析默认值。所以这不会起作用

def f(x, func = f):
    if x<1:
        return x
    else:
        return x + func(x-1)
但是,我确实找到了办法。我从一些虚拟函数开始

def a(x):
    return x

def f(x, func=a):
    if x < 1:
        return x
    else:
        return x + func(x-1)

然后发出

f.__defaults__ = (f,)

显然很尴尬。有另一种方式还是这种糟糕的蟒蛇?如果不好,你能解释一下原因吗?它会破坏什么?

无论如何,它都有效:

In [99]: f(10)
Out[99]: 55

In [100]: f(10, f)
Out[100]: 55

In [101]: f(10, lambda x : 2*x)
Out[101]: 28 

1 个答案:

答案 0 :(得分:3)

详细说明Andrea Corbellini的建议,你可以这样做:

def f(x, func=None):
    if func is None:
        func = f

    if x < 1:
        return x
    else:
        return x + func(x-1)

在Python中实现函数内部的实际默认值并将默认参数定义为None(或None中的某个私有sentinel对象是有效输入),这是一个非常标准的习惯用法可变默认值的问题,例如list个对象。