Python 为什么在decorator中返回函数时没有参数。
例如: 带memoize装饰器的Fibonaci递归函数。调用函数helper时,没有参数。如果函数helper被定义为接受一个参数x,那么我希望用一个参数调用函数。我想了解为什么语法是这样的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
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
,该函数将包装修饰后的函数,并返回包装器以代替我编写的函数