首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python高阶函数

Python高阶函数
EN

Stack Overflow用户
提问于 2016-07-23 19:33:48
回答 2查看 103关注 0票数 1

给出下面的代码,我不明白为什么f和fib的行为不同。取自巴克利cs61a课程的例子

代码语言:javascript
复制
def fib(n):
    if n==1 or n==0:
        return n
    else:
        return fib(n-1) + fib(n-2)

def decor(f):
    def counted(*args):
        counted.call_count += 1
        return f(*args)
    counted.call_count = 0
    return counted

当我将代码加载到解释器中时,我得到了以下输出:

代码语言:javascript
复制
>>> fib(6)
8
>>> f = decor(fib)
>>> fib = decor(fib)
>>> # f and fib are both vars that represents a decorated fib function

>>> f(6)
8
>>> f.call_count # why 1 ???
1
>>> 
>>> fib(6)
8
>>> fib.call_count # 49 calls, that's fine
49
EN

回答 2

Stack Overflow用户

发布于 2016-07-23 19:41:14

f.call_count是1,因为f调用fib,然后fib递归地调用自己来计算结果。在整个过程中,f只被调用一次。

但是当您执行fib = decor(fib)时,您将覆盖全局范围内的fib函数,因此从那时起,fib将递归地调用修饰后的fib

票数 2
EN

Stack Overflow用户

发布于 2016-07-23 19:45:06

您正在覆盖fib,然后f调用fib而不是它自己:

代码语言:javascript
复制
def fib(n):
    if n==1 or n==0:
        return n
    else:
        print("fib is: " + repr(fib))
        return fib(n-1) + fib(n-2)

def decor(f):
    def counted(*args):
        counted.call_count += 1
        return f(*args)
    counted.call_count = 0
    return counted



f = decor(fib)
fib = decor(fib)

print("=== f ===")
print(f(6))
print(f.call_count)

print("=== fib ===")
print(fib(6))
print(fib.call_count)

当我运行这个命令时,输出是:

代码语言:javascript
复制
=== f ===
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
8
1
=== fib ===
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
8
49

请注意,fib is始终在0x7fa844639758上运行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38541296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档