Le *_*ous 29 python iterator xrange
我从大多数pythonic方法中遇到了这个代码,用于计算可迭代的匹配元素
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
枚举(L):
r = enumerate(mylist)
Run Code Online (Sandbox Code Playgroud)
和文件对象:
f = open(myfilename, 'r')
Run Code Online (Sandbox Code Playgroud)
为什么xrange表现不同?
sen*_*rle 38
因为xrange
不返回发电机.它返回一个xrange对象.
>>> type(xrange(10))
<type 'xrange'>
Run Code Online (Sandbox Code Playgroud)
除了重复迭代之外,xrange
对象还支持生成器不需要的其他东西 - 比如索引:
>>> xrange(10)[5]
5
Run Code Online (Sandbox Code Playgroud)
他们也有一个长度:
>>> len(xrange(10))
10
Run Code Online (Sandbox Code Playgroud)
他们可以逆转:
>>> list(reversed(xrange(10)))
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Run Code Online (Sandbox Code Playgroud)
>>> import collections
>>> isinstance(xrange(10), collections.Sequence)
True
Run Code Online (Sandbox Code Playgroud)
他们只是在不占用大量内存的情况下完成它.
另请注意,在Python 3中,range
返回的对象range
具有所有相同的属性.
Amb*_*ber 17
因为xrange
通过调用生成的对象xrange()
指定了每次迭代时__iter__
提供自身(实际上是单独的rangeiterator
对象)的唯一版本.
>>> x = xrange(3)
>>> type(x)
<type 'xrange'>
>>> i = x.__iter__()
>>> type(i)
<type 'rangeiterator'>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1497 次 |
最近记录: |