我从Most pythonic way of counting matching elements in something iterable遇到了这段代码

r = xrange(1, 10)
print sum(1 for v in r if v % 2 == 0) # 4
print sum(1 for v in r if v % 3 == 0) # 3

r重复一次。然后再次迭代。我认为,如果迭代器一旦被消耗,那么它就结束了,不应再次进行迭代。

生成器表达式只能迭代一次:
r = (7 * i for i in xrange(1, 10))
print sum(1 for v in r if v % 2 == 0) # 4
print sum(1 for v in r if v % 3 == 0) # 0

也枚举(L):
r = enumerate(mylist)

和文件对象:
f = open(myfilename, 'r')

为什么xrange表现不同?

最佳答案

因为通过调用xrange生成的xrange()对象指定了一个__iter__,该rangeiterator每次迭代时都会提供其自身的唯一版本(实际上是一个单独的ojit_code对象)。

>>> x = xrange(3)
>>> type(x)
<type 'xrange'>
>>> i = x.__iter__()
>>> type(i)
<type 'rangeiterator'>

关于python - 为什么xrange可以回到Python的开始?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10776250/

10-15 04:24