我从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/