As a complete Python newbie, it certainly looks that way. Running the
following...
x = enumerate(['fee', 'fie', 'foe'])
x.next()
# Out[1]: (0, 'fee')
list(x)
# Out[2]: [(1, 'fie'), (2, 'foe')]
list(x)
# Out[3]: []
... I notice that: (a) x
does have a next
method, as seems to be
required for generators, and (b) x
can only be iterated over once, a
characteristic of generators emphasized in this famous python
-tag
answer.
On the other hand, the two most highly-upvoted answers to this
question
about how to determine whether an object is a generator would seem to
indicate that enumerate()
does not return a generator.
import types
import inspect
x = enumerate(['fee', 'fie', 'foe'])
isinstance(x, types.GeneratorType)
# Out[4]: False
inspect.isgenerator(x)
# Out[5]: False
... while a third poorly-upvoted answer to that question would seem to indicate that enumerate()
does in fact return a generator:
def isgenerator(iterable):
return hasattr(iterable,'__iter__') and not hasattr(iterable,'__len__')
isgenerator(x)
# Out[8]: True
So what's going on? Is x
a generator or not? Is it in some sense
"generator-like", but not an actual generator? Does Python's use of
duck-typing mean that the test outlined in the final code block above
is actually the best one?
Rather than continue to write down the possibilities running through my
head, I'll just throw this out to those of you who will immediately
know the answer.
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…