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 生成器

bzoj1016:[JSOI2008]最小生成树计数

python 这演示了如何逐步计算python生成器的线性回归,以避免需要加载整个结构

随机数生成器不会使用输入字段中的值生成给定范围内的预期数字[重复]

Python XLWT:Python xlwt 生成的 Excel 包含缺失值

如何从给定范围生成固定长度值的随机列表?