Python 范围生成器是生成所有值还是逐步生成它们? [复制]
Posted
技术标签:
【中文标题】Python 范围生成器是生成所有值还是逐步生成它们? [复制]【英文标题】:Does the Python range generator generate all values or yields them progressively? [duplicate] 【发布时间】:2015-10-07 15:34:33 【问题描述】:当你做这样的事情时:
for i in range(5):
print i
Python 是做什么的?它是否首先生成一个带有 [0,1,2,3,4] 的数组,然后遍历打印它的每个项目? 类似于:
for i in [0,1,2,3,4]:
print i
还是在生成每个数字时打印它们?比如:
Generate 0 assign 0 to i print i
生成 1 -> 将 1 分配给 i -> 打印 i
生成 2 -> 将 2 分配给 i -> 打印 i
生成 3 -> 将 3 分配给 i -> 打印 i
生成 4 -> 将 4 分配给 i -> 打印 i
更新
我已经为 Python 2.7 添加了标签。我不认为我的问题是特定于版本的,但似乎是!
现在我正在使用 Python 2.7,所以我的问题与此有关。但我发现比较 Python 2 范围和 Python 3 范围的信息非常有价值。
【问题讨论】:
@TigerhawkT3 如果我没记错的话,Python 3 中的range
比标准的 yield
迭代器更复杂,所以我认为它不会是那个问题的重复
它实际上是一个生成器,它为__contains__
实现了一些数学运算和一些特殊逻辑,因此您可以对其进行两次迭代。
您想了解 python 3 还是 python 2.7?他们有两种截然不同的行为。
是的,我看到了关于生成器生成的部分,但错过了实际上是关于 range
而不是生成器的部分。显然,Python 2 的范围。
无论如何,是的,在 Python 2 中,range
函数确实返回了 list
。这就是为什么 Python 3 对它进行了如此彻底的改变(基本上是重写)。
【参考方案1】:
在 Python 2 中,它返回一个值列表。试试这个看看
print range(4)
在 Python 3 中,它返回一个可迭代对象。您可以使用以下代码将其转换为 list
:
print(list(range(4))
【讨论】:
我知道它返回一个值列表,我只是想知道它是如何工作的。 在不同的上下文中使用时,任何函数都不应以特殊方式表现,因此range
在 Python 2 中将始终返回一个列表。【参考方案2】:
在 Python 2 中,range()
返回整个列表对象,然后返回该列表
对象被for
迭代。
在 Python 3 中,它返回 a memory efficient iterable,这是一个
具有专用逻辑和方法的自己的对象,而不是列表。现在
for
将获取由该可迭代对象生成的每个值。
在 Python 2 中有 xrange()
来获得类似于 Python 3 的东西
range()
做。 Python 2 的 xrange 介于 Python 2 之间
范围和 Python 3 的范围。比前者好,但不如前者
和后者一样好。
最后,在 Python 3 中,如果你想要整个列表:
>>> list(range(...))
【讨论】:
以上是关于Python 范围生成器是生成所有值还是逐步生成它们? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
python 这演示了如何逐步计算python生成器的线性回归,以避免需要加载整个结构
随机数生成器不会使用输入字段中的值生成给定范围内的预期数字[重复]