在Python for循环中发生了什么?

时间:2015-04-19 08:17:56

标签: python for-loop

让我们采用标准的Java for循环

for (int i = 0; i < 10; i++) {
    System.out.println(i);
}

我可以确切地看到这个for循环中发生了什么。 i初始化为0.检查条件并在每次迭代时进行增量。

这是Python版本

for i in range(0, 10):
    print(i)

在这个循环中发生了什么细节?

3 个答案:

答案 0 :(得分:3)

误解是这两个循环相似。

Java的表单从一些初始值开始,将其打印出来,只要该值小于某个终值,它就会继续循环。

Python实际上是将每个元素包含在你给它的任何可迭代中,并打印出它的内容而不做任何增加。

因为在这种情况下,iterable是range的结果,你在不同版本之间获取元素的行为会发生变化。

  • 如果你正在使用Python&lt; 3,range是一个急切地生成一个元素列表供你使用的函数。延迟生成的变体是xrange,其中根据需要生成值。在这种情况下,由于您在整个集合中循环完成,并且内存约束不是那么高,因此您不会注意到两者之间存在任何差异。

  • 在Python&gt; = 3,range behaves similar to xrange中,它是另一种序列类型,它也会生成动态所需的值。

这里的关键区别在于Python循环中的变量表示iterable中包含的实际值,而Java正在使用标准for循环生成值。

如果您使用enhanced-for loop代替,那么您将更接近以了解Python的循环如何工作:

int[] list = {1, 2, 3, 4, 5, 6, 7, 8, 9}
for(int i : list) {
    System.out.println(i);
}

答案 1 :(得分:1)

看一下range()内置函数的文档,可以看到这个函数&#34;创建包含算术进度的列表&#34;。这个列表是迭代的,好像它直接传递给循环:

for i in range(0, 10):
    print(i)

此代码与

基本相同
for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]:
    print(i)

in关键字基本上是对提供的可迭代对象中的每个元素说 - 在本例中是一个列表。 &#34;对于列表中的每个项目&#34;。循环知道何时停止,因为范围函数生成有限列表 - 该列表具有它的长度,这是停止条件。在内部,当循环尝试读取超出范围的索引时,会生成StopIteration exception并触发终止条件。

答案 2 :(得分:1)

range(0,10)返回0到9之间的数字列表。 循环遍历此列表,每次迭代都会将列表中的下一个数字分配给i