【发布时间】:2014-04-27 01:10:43
【问题描述】:
考虑以下代码 这里我没有使用@符号进行装饰
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()
谢谢。
【问题讨论】:
-
我不知道,但我有点懒惰为那些把'Why'写成'Y'的人写作^_^
-
嗯,首先你需要了解什么是装饰器。请阅读this article和this answer
-
再想一想, this 作为递归函数的额外角度使得它更难证明这是一个骗局;再次收回。
标签: python recursion decorator