Python 中的高阶函数
Higher order functions in Python
对于某些人可能认为是基本问题的问题,我深表歉意。在下面的简单代码中:
def greet(name):
def say_hi():
print('Preparing to greet...')
print('Hi', name, '!')
print('Greeting given.')
return say_hi
带形参调用'greet',解释器遇到'say_hi'函数时,事件的顺序是什么。我看到返回了对它的引用(我假设形成了一个闭包?),但是内部函数是被执行还是只是 'read' 并且在程序员编写如下代码之前不会被调用:
f = greet('Caroline')
f()
由于 python 中的所有内容都与运行时有关(除了像窥孔优化器等编译时任务),python 除非您调用它,否则不会调用您的函数。
您可以通过使用 dis
模块中的 dis
函数来查看此行为,其中 returns 您的函数的相关字节码 :
>>> 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 (<code object say_hi at 0x7fdacc12c8b0, file "<stdin>", 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 值中。
对于某些人可能认为是基本问题的问题,我深表歉意。在下面的简单代码中:
def greet(name):
def say_hi():
print('Preparing to greet...')
print('Hi', name, '!')
print('Greeting given.')
return say_hi
带形参调用'greet',解释器遇到'say_hi'函数时,事件的顺序是什么。我看到返回了对它的引用(我假设形成了一个闭包?),但是内部函数是被执行还是只是 'read' 并且在程序员编写如下代码之前不会被调用:
f = greet('Caroline')
f()
由于 python 中的所有内容都与运行时有关(除了像窥孔优化器等编译时任务),python 除非您调用它,否则不会调用您的函数。
您可以通过使用 dis
模块中的 dis
函数来查看此行为,其中 returns 您的函数的相关字节码 :
>>> 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 (<code object say_hi at 0x7fdacc12c8b0, file "<stdin>", 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 值中。