生成器只是一个函数,它返回一个对象,您可以对该对象进行下一次调用,因此对于每次调用,它都会返回一些值,直到它引发StopIteration异常,表明所有值都已生成。这样的对象被称为迭代器。
>>> def myGen(n):
... yield n
... yield n + 1
...
>>> g = myGen(6)
我引用了《理解Python中的生成器?
以下是我想弄清楚的:
哪个是生成器?
myGen
还是myGen(6)
?根据上面提到的报价,我认为发电机应该是
myGen
。myGen(6)
是返回的迭代器对象。但我真的不确定。当我尝试这个:
>>> type(myGen) <type 'function'> >>> type(g) # <1>this is confusing me. <type 'generator'> >>> callable(g) # <2> g is not callable. False >>> callable(myGen) True >>> g is iter(g) # <3> so g should an iterable and an iterator True # at the same time. And it will be passed as an argument >>> for i in g: # to built-in function `next()` in a "for...in..." loop. print i # (is that correct?) 6 7
因此,根据<1>
和<2>
,g
的类型是"generator",并且它是不可调用的。但是生成器是可调用的,调用生成器会得到一个迭代器对象这里发生了什么?
当我搜索答案时,每次定义函数时,我都会遇到python会创建一个可调用对象
那么,我能说这样的话吗当定义函数myGen
时,myGen
是指可调用对象的名称,该对象是具有__call__
方法的类的实例。在这种情况下,myGen
是一个生成器,myGen(6)
是调用myGen
时返回的迭代器。
但是为什么type(g)
会返回<type 'generator'>
呢?这个返回的iterator
对我来说也很可疑,因为函数中没有return
语句。
难道函数总是返回一些东西吗(至少是None
,当执行过程中没有返回语句并且到达函数的末尾时)?
不幸的是,术语令人困惑,因为"生成器"通常用于指代函数或返回的迭代器,很难说其中一种用法更正确。收益率声明的文件显示
yield语句仅在定义生成器函数时使用,并且仅在生成器功能的主体中使用。使用收益率函数定义中的语句足以导致定义来创建生成器函数而不是法线作用
当调用生成器函数时,它返回一个迭代器,称为生成器迭代器,或者更常见的生成程序。
最初引入该概念的政治公众人物说
请注意,当上下文中的意图明确时,非限定名称"generator"可用于指代生成器函数或生成器迭代器。
如果您想明确区分,请使用"生成器函数"作为函数,使用"生成器迭代器"作为迭代器。
1)myGen
是一个函数,当被调用时,它会返回一个生成器对象——所以是的,myGen(6)
是一个生成器。
2) 发电机提供__iter__
和next()
:docs