当前位置:  开发笔记 > 编程语言 > 正文

Python中的高阶函数

如何解决《Python中的高阶函数》经验,为你挑选了1个好方法。

我对一些人可能认为是一个基本问题的道歉.在以下简单代码中:

def greet(name):
    def say_hi():
        print('Preparing to greet...')
        print('Hi', name, '!')       
        print('Greeting given.')
    return say_hi

当使用形式参数调用'greet'并且解释器遇到'say_hi'函数时,事件序列是什么.我看到对它的引用被返回(形成一个我假设的闭包?),但是内部函数是执行还是只是'读'而不是在程序员编写如下代码之前调用它:

f = greet('Caroline')
f()

Kasramvd.. 6

因为python中的每一件事都是关于运行时的(除了编译时间任务,如窥视优化器等),除非你调用它,否则python不会调用你的函数.

您可以通过使用module中的dis函数来查看此行为,该函数dis返回函数的相对字节码:

>>> def greet(name):
...     def say_hi():
...         print('Preparing to greet...')
...         print('Hi', name, '!')       
...         print('Greeting given.')
...     return say_hi
... 
>>> import dis
>>> 
>>> dis.dis(greet)
  2           0 LOAD_CLOSURE             0 (name)
              3 BUILD_TUPLE              1
              6 LOAD_CONST               1 (", line 2>)
              9 MAKE_CLOSURE             0
             12 STORE_FAST               1 (say_hi)

  6          15 LOAD_FAST                1 (say_hi)
             18 RETURN_VALUE  

正如您在第6部分中看到的那样,python只是将函数作为CONST值中的代码对象加载.



1> Kasramvd..:

因为python中的每一件事都是关于运行时的(除了编译时间任务,如窥视优化器等),除非你调用它,否则python不会调用你的函数.

您可以通过使用module中的dis函数来查看此行为,该函数dis返回函数的相对字节码:

>>> def greet(name):
...     def say_hi():
...         print('Preparing to greet...')
...         print('Hi', name, '!')       
...         print('Greeting given.')
...     return say_hi
... 
>>> import dis
>>> 
>>> dis.dis(greet)
  2           0 LOAD_CLOSURE             0 (name)
              3 BUILD_TUPLE              1
              6 LOAD_CONST               1 (", line 2>)
              9 MAKE_CLOSURE             0
             12 STORE_FAST               1 (say_hi)

  6          15 LOAD_FAST                1 (say_hi)
             18 RETURN_VALUE  

正如您在第6部分中看到的那样,python只是将函数作为CONST值中的代码对象加载.

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有