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

高阶函数Python演练
EN

Stack Overflow用户
提问于 2013-08-17 09:33:09
回答 1查看 1.4K关注 0票数 0
代码语言:javascript
复制
def tracer(fn):
    def traced(x):
        print('Calling', fn, '(', x, ')')
        result = fn(x)
        print('Got', result, 'from', fn, '(', x, ')')
        return result
    return traced

def fact(n):
    if n == 0:
        return 1
    return n * fact(n-1)

new_fact = tracer(fact)
new_fact(2)

我在pythontutor.com上使用了这段代码来更好地理解高阶函数,但是我很难理解为什么步骤8中的new_fact(2)映射到traced?换句话说,traced函数如何知道参数是2

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-17 09:36:06

在Python中,函数也是对象。调用tracer()函数时,它返回嵌套的traced()函数;实际上,它正在创建该函数的新副本:

代码语言:javascript
复制
return traced

您将返回的函数对象存储在new_fact中,然后调用它:

代码语言:javascript
复制
>>> tracer(fact)
<function traced at 0x10644c320>
>>> new_fact = tracer(fact)
>>> new_fact
<function traced at 0x10644c398>
>>> new_fact(2)
('Calling', <function fact at 0x10644c230>, '(', 2, ')')
('Got', 2, 'from', <function fact at 0x10644c230>, '(', 2, ')')
2

您可以对任何函数执行此操作;将对函数的引用存储在另一个名称中:

代码语言:javascript
复制
>>> def foo(): print 'foo'
... 
>>> bar = foo
>>> bar()
foo
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18287260

复制
相关文章

相似问题

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