gpt4 book ai didi

python - python中使用@符号装饰和不使用@符号的区别

转载 作者:行者123 更新时间:2023-11-30 23:26:25 24 4
gpt4 key购买 nike

考虑以下代码这里我没有使用@符号进行装饰

import math

def isOddMy(func):
def innerOdd(x):
y = func(x)
if math.fmod(y, 2) == 0 :
return 0
else:
if y is not None:
return y
else:
return 0
return innerOdd

#@isOddMy
def fib(n):
#print n,
if n == 0 :
return 0
elif n == 1 :
return 1
else:
return fib(n-2) + fib(n-1)


def main():
#oddFibi = isOdd(fib)
#print [i for i in oddFibi(100)]
for i in range(1,10):
print fib(i),

print
fib1 = isOddMy(fib)
for i in range(1,10):
print fib1(i),

if __name__ == '__main__':
main()

结果是

1 1 2 3 5 8 13 21 34

1 1 0 3 5 0 13 21 0

下面我使用了@符号,但结果是1 1 0 1 1 0 1 1 0

为什么会这样?

import math

def isOddMy(func):
def innerOdd(x):
y = func(x)
if math.fmod(y, 2) == 0 :
return 0
else:
if y is not None:
return y
else:
return 0
return innerOdd

@isOddMy
def fib(n):
#print n,
if n == 0 :
return 0
elif n == 1 :
return 1
else:
return fib(n-2) + fib(n-1)


def main():
#oddFibi = isOdd(fib)
#print [i for i in oddFibi(100)]
for i in range(1,10):
print fib(i),

'''print
fib1 = isOddMy(fib)
for i in range(1,10):
print fib1(i),'''

if __name__ == '__main__':
main()

谢谢。

最佳答案

差异可能与递归调用有关。当 fib 调用 fib 时,会在模块作用域中查找该名称。如果您使用 @ 装饰器语法,则可以使用名称 fib 找到装饰函数。如果您只是执行 fib1 = isOddMy(fib),则会找到名为 fib 的未修饰函数。

关于python - python中使用@符号装饰和不使用@符号的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22528752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com