python如何将函数解释为生成器

时间:2014-09-14 16:48:57

标签: python generator yield

我知道如果"收益"语句存在于函数中,它将被视为生成器。 但是当函数(生成器)第一次调用时,python解释器如何在这种情况下工作。我的意思是当代码被解释时我首先考虑" gen"将绑定到一个函数对象。为什么它不会在第一次调用时与正常函数或类不同之前执行语句。它如何在yield

之前暂停执行print函数
>>> def gen():
...    print("In gen")
...    yield 1
...    yield 2
... 
>>> type(gen)
<type 'function'>
>>> a = gen
>>> type(a)
<type 'function'>
>>> 
>>> b = a()
>>> type(b)
<type 'generator'>
>>> b.next()
In gen
1
>>> b.next()
2
>>> 

1 个答案:

答案 0 :(得分:4)

当Python 解析 def语句时,它会决定代码是定义生成器还是函数。如果代码包含yield表达式,那么它是一个生成器。因此,当调用生成器函数a时,它将返回generator objectb

def语句中的代码在调用b.next()之前不会执行。


考虑这两个功能:

def gen():
     print('In gen')
     yield 1
     yield 2


def func():
     print('In gen')    

虽然genfunc都是功能, Python知道gen是一个生成器:

In [96]: import inspect

In [101]: inspect.isgeneratorfunction(gen)
Out[101]: True

In [102]: inspect.isgeneratorfunction(func)
Out[102]: False

如果您查看检查模块内部,您会看到

def isgeneratorfunction(object):
    """Return true if the object is a user-defined generator function.

    Generator function objects provides same attributes as functions.

    See help(isfunction) for attributes listing."""
    return bool((isfunction(object) or ismethod(object)) and
                object.func_code.co_flags & CO_GENERATOR)

显然Python在执行函数内部代码之前先检查它。