【发布时间】:2014-07-03 00:21:26
【问题描述】:
作为一个完整的 Python 新手,它看起来确实如此。运行 下面...
x = enumerate(['fee', 'fie', 'foe'])
x.next()
# Out[1]: (0, 'fee')
list(x)
# Out[2]: [(1, 'fie'), (2, 'foe')]
list(x)
# Out[3]: []
...我注意到:(a)x 确实有一个next 方法,似乎是
生成器需要,并且 (b) x 只能迭代一次,a
this famous python-tag
answer中强调的生成器的特性。
另一方面,this
question 的两个最受好评的答案
关于如何确定一个对象是否是一个生成器似乎
表示 enumerate() 确实不返回生成器。
import types
import inspect
x = enumerate(['fee', 'fie', 'foe'])
isinstance(x, types.GeneratorType)
# Out[4]: False
inspect.isgenerator(x)
# Out[5]: False
...虽然该问题的第三个poorly-upvoted answer 似乎表明enumerate() 确实实际上返回了一个生成器:
def isgenerator(iterable):
return hasattr(iterable,'__iter__') and not hasattr(iterable,'__len__')
isgenerator(x)
# Out[8]: True
那么发生了什么? x 是不是生成器?是不是某种意义上
“类似发电机”,但不是真正的发电机? Python 的使用是否
鸭子打字意味着上面最终代码块中概述的测试
实际上是最好的吗?
而不是继续写下贯穿我的可能性 头,我会把这个扔给你们中的人,他们会立即 知道答案。
【问题讨论】:
-
它像鸭子一样嘎嘎叫吗?
-
有点类似于
xrange()也不是GeneratorType,但它确实表现得像一个生成器 -
这可能有用:stackoverflow.com/questions/2776829/… -- 看起来 Python 区分了迭代器和生成器
-
“作为一个完整的 Python 新手”,您肯定会过度关注确切的类型。 ;)
标签: python