生成器只是一个函数,它返回一个可以在其上调用的对象,这样每次调用它都会返回一些值,直到它引发一个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
是一个引用可调用对象的名称,该对象是具有a的类的实例 __call__
方法。
在这种情况下, myGen
是一个发电机,和 myGen(6)
是什么时候返回的迭代器 myGen
叫做。
但为什么呢 type(g)
返回 <type 'generator'>
在所有?
这回来了 iterator
事情看起来也很可疑,因为没有 return
函数中的语句。