【发布时间】:2014-03-25 18:46:50
【问题描述】:
生成器只是一个函数,它返回一个您可以在其上调用 next 的对象,这样每次调用它都会返回一些值,直到它引发 StopIteration 异常,表明所有值都已生成。这样的对象称为迭代器。
>>> def myGen(n):
... yield n
... yield n + 1
...
>>> g = myGen(6)
我从Understanding Generators in 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 的类型是“生成器”,它是不可调用的。
但是generators are callable, and calling a generator gets you an iterator object
这是怎么回事?
当我在寻找答案时,我遇到了Every time you define a function python creates a callable object.
那么,我可以这样说吗? 当函数myGen 被定义时,myGen 是一个引用可调用对象的名称,该对象是具有__call__ 方法的类的实例。
在这种情况下,myGen 是一个生成器,myGen(6) 是调用myGen 时返回的迭代器。
但是为什么type(g) 会返回<type 'generator'> 呢?
这个返回的iterator 对我来说也很可疑,因为函数中没有return 语句。
【问题讨论】:
-
+1 写得好。
-
我相信生成器是一个创建对象的函数。该对象是生成器,该生成器是可迭代的。但是您可以调用动态生成可交互对象的函数,您可以对其进行迭代。