Python范围生成器是生成所有值还是逐步生成它们?
当你这样做的时候:Python范围生成器是生成所有值还是逐步生成它们?,python,python-2.7,Python,Python 2.7,当你这样做的时候: for i in range(5): print i Python做什么?它是否先生成一个带有[0,1,2,3,4]的数组,然后再遍历每个项目来打印它? 类似于: for i in [0,1,2,3,4]: print i 还是在生成数字时打印每个数字?比如: 生成0将0分配给i打印i 生成1->将1分配给i->打印i 生成2->将2分配给i->打印i 生成3->将3分配给i->打印i 生成4->将4分配给i->打印i 更新 我已经为Python2.7添加
for i in range(5):
print i
Python做什么?它是否先生成一个带有[0,1,2,3,4]的数组,然后再遍历每个项目来打印它?
类似于:
for i in [0,1,2,3,4]:
print i
还是在生成数字时打印每个数字?比如:
生成0将0分配给i打印i
生成1->将1分配给i->打印i
生成2->将2分配给i->打印i
生成3->将3分配给i->打印i
生成4->将4分配给i->打印i
更新
我已经为Python2.7添加了标记。我不认为我的问题是特定版本的,但似乎是这样
现在我正在使用Python2.7,所以我的问题就是指这个。但我发现比较Python2范围和Python3范围的信息非常有价值。它返回一个值列表。试试看这个
print range(4)
在Python 2中,range()
返回整个列表对象,然后返回该列表
对象由为进行迭代
在Python3中,它返回,这是一个
对象本身具有专用的逻辑和方法,而不是列表。现在
for
将获取由该iterable生成的每个值
在Python2中,有xrange()
可以获得类似Python3的东西
range()
do。Python2的xrange介于Python2的xrange之间
范围和Python 3的范围。它比前者好,但不如前者
跟后者一样好
最后,在Python3中,如果您想要整个列表,请执行以下操作:
>>> list(range(...))
@TigerhawkT3如果我没记错的话,Python 3中的
range
比标准的yield
迭代器要复杂得多,所以我不认为它会重复这个问题它实际上是一个生成器,它实现了\uuuuu包含的一些数学和一些特殊的逻辑,所以你可以对它进行两次迭代,但是,您是否对Python3或Python2.7感到好奇?他们有两种非常不同的行为。是的,我看到了关于生成器生成的部分,但错过了关于range
而不是生成器的部分。显然,Python2在这个范围内。无论如何,是的,在Python2中,range
函数确实返回了一个列表。这就是为什么Python 3对其进行了如此彻底的更改(基本上是重写的)。我知道它会返回一个值列表,我只是想知道它是如何工作的。当它在不同的上下文中使用时,任何函数都不应该以特殊的方式运行,因此在Python 2中,range
始终会返回一个列表。