Skip to main content
 首页 » 编程设计

python之有没有办法在python中引用当前函数

2025年05月04日9cyq1162

我想要一个函数来引用它自己。例如是递归的。

所以我做了类似的事情:

def fib(n): 
    return n if n <= 1 else fib(n-1)+fib(n-2) 

大多数时候这很好,但是 fib 实际上并不引用它自己;它指的是封闭 block 中 fib 的绑定(bind)。因此,如果由于某种原因 fib 被重新分配,它将中断:

>>> foo = fib 
>>> fib = foo(10) 
>>> x = foo(8) 
Traceback (most recent call last): 
  File "<stdin>", line 1, in <module> 
  File "<stdin>", line 2, in fib 
TypeError: 'int' object is not callable 

如果可能的话,我怎样才能防止这种情况发生(从 fib 内部)?据我所知,fib 的名称在函数定义完全执行之前并不存在;有任何解决方法吗?

我没有可能实际发生的真实用例;我纯粹出于好奇而问。

请您参考如下方法:

我会为此做一个装饰器

from functools import wraps 
 
def selfcaller(func): 
    @wraps(func) 
    def wrapper(*args, **kwargs): 
        return func(wrapper, *args, **kwargs) 
    return wrapper 

像这样使用它

@selfcaller 
def fib(self, n): 
    return n if n <= 1 else self(n-1)+self(n-2) 

这实际上是一种定义 Fixed Point Combinator 的可读方式(或 Y 组合器):

fix = lambda g: (lambda f: g(lambda arg: f(f)(arg))) (lambda f: g(lambda arg: f(f)(arg))) 

用法:

fib = fix(lambda self: lambda n: n if n <= 1 else self(n-1)+self(n-2)) 

或:

@fix 
def fib(self): 
    return lambda n: n if n <= 1 else self(n-1)+self(n-2) 

这里的绑定(bind)发生在形参中,所以不会出现这个问题。