【问题标题】:difference between decorating with @ symbol and without it in python在python中用@符号装饰和没有它的区别
【发布时间】: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 articlethis answer
  • 再想一想, this 作为递归函数的额外角度使得它更难证明这是一个骗局;再次收回。

标签: python recursion decorator


【解决方案1】:

区别可能与递归调用有关。当fib 调用fib 时,会在模块范围内查找该名称。如果您使用 @ 装饰器语法,则可以找到名称为 fib 的装饰函数。如果你只做fib1 = isOddMy(fib),就会发现未修饰的函数名称为fib

【讨论】:

  • 谢谢你是正确的,因为我检查了一个非递归 fib() 函数并且@符号在那里工作。但是有任何解决方法..
  • @muru 究竟有什么解决方法?不清楚你想做什么。
  • @Janne 我的意思是使用 @ 符号作为装饰器到递归函数,更重要的是像其他程序一样获得结果(没有用于装饰器的 @ 符号)
  • @muru 如果一种方法可以为您提供所需的结果,我会说它一种解决方法。
  • @JanneKarila 我希望我对内部运作有更深入的了解
猜你喜欢
  • 2012-01-09
  • 2016-03-16
  • 2021-07-19
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
  • 2020-02-21
  • 2015-07-26
相关资源
最近更新 更多