Python 为什么在decorator中返回函数时没有参数。

Python 为什么在decorator中返回函数时没有参数。,python,function,arguments,decorator,memoization,Python,Function,Arguments,Decorator,Memoization,例如: 带memoize装饰器的Fibonaci递归函数。调用函数helper时,没有参数。如果函数helper被定义为接受一个参数x,那么我希望用一个参数调用函数。我想了解为什么语法是这样的 def memoize(f): memo = {} def helper(x): if x not in memo: memo[x] = f(x) return memo[x] return helpe

例如: 带memoize装饰器的Fibonaci递归函数。调用函数helper时,没有参数。如果函数helper被定义为接受一个参数x,那么我希望用一个参数调用函数。我想了解为什么语法是这样的

def memoize(f):
    memo = {}
    def helper(x):
        if x not in memo:            
            memo[x] = f(x)
        return memo[x]
    return helper

@memoize
def fib(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fib(n-1) + fib(n-2)

print(fib(40))

您确实可以使用参数调用帮助器。修饰符是这方面的语法糖

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


fib = memoize(fib)

因此,您的
fib
函数不再是原来的
fib
-函数。它实际上是
helper
闭包,因为
memoize
返回的就是闭包。因此,当您调用
fib(40)
时,您可以调用
helper(40)
memoize
decorator创建一个函数对象,它不调用它,只返回它。

使用参数调用帮助器。修饰符是这方面的语法糖

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


fib = memoize(fib)

因此,您的
fib
函数不再是原来的
fib
-函数。它实际上是
helper
闭包,因为
memoize
返回的就是闭包。因此,当您调用
fib(40)
时,您可以调用
helper(40)
memoize
decorator创建一个函数对象,它不调用它,只返回它。

我相信语法是这样的,因此它看起来尽可能精简。在
@
之后放置一个decorator对象(一个接受一个参数并返回一个函数的函数),python使用您定义的函数调用它。这个

@memoize
def fib(n):
    ...
完全等同于以下内容,不使用magic decorator语法:

def fib(n):
   ...

fib = memoize(fib)

如果你想让你的头旋转一点,就可以认为“<代码> @ /代码>实际上可以遵循一个函数调用——但是这个函数调用必须返回一个如上所述的装饰器!下面是一个愚蠢的示例,它计算装饰函数被调用的次数,但允许您设置起始值。(这只是一个例子:它不是很有用,因为只能装饰一个函数,等等)


这里,
countcalls(4)
定义并返回(不调用)函数
decorator
,该函数将包装经过修饰的函数,并返回包装器来代替我编写的函数。

我相信语法是这样的,因此它看起来尽可能精简。在
@
之后放置一个decorator对象(一个接受一个参数并返回一个函数的函数),python使用您定义的函数调用它。这个

@memoize
def fib(n):
    ...
完全等同于以下内容,不使用magic decorator语法:

def fib(n):
   ...

fib = memoize(fib)

如果你想让你的头旋转一点,就可以认为“<代码> @ /代码>实际上可以遵循一个函数调用——但是这个函数调用必须返回一个如上所述的装饰器!下面是一个愚蠢的示例,它计算装饰函数被调用的次数,但允许您设置起始值。(这只是一个例子:它不是很有用,因为只能装饰一个函数,等等)

这里,
countcalls(4)
定义并返回(不调用)函数
decorator
,该函数将包装修饰后的函数,并返回包装器以代替我编写的函数