gpt4 book ai didi

python - 为什么 xrange 能够回到 Python 的起点?

转载 作者:IT老高 更新时间:2023-10-28 22:07:10 26 4
gpt4 key购买 nike

我从 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 object .

>>> type(xrange(10))
<type 'xrange'>

除了重复迭代之外,xrange 对象还支持生成器不支持的其他功能——比如索引:

>>> xrange(10)[5]
5

它们也有长度:

>>> len(xrange(10))
10

而且它们可以颠倒:

>>> list(reversed(xrange(10)))
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

简而言之,xrange 对象实现了完整的 sequence interface :

>>> import collections
>>> isinstance(xrange(10), collections.Sequence)
True

他们只是在不占用大量内存的情况下这样做。

另请注意,在 Python 3 中,range 返回的 range 对象具有所有相同的属性。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com