您好我正在努力确保我在python中正确理解for循环。
for i in range(1,10):
print i
我理解范围(1,10)将返回一个可迭代的列表,for循环将调用列出 iter ()函数,该函数将返回迭代器。但我的问题特别针对的是'。从列表范围(1,10)返回的迭代器是否由for循环调用其 iter ()函数产生,存储在' i'并且循环最终会在i上运行next()函数来迭代列表?
答案 0 :(得分:4)
for i in range(1,10):
print(i)
相当于
_iterator = iter(range(1, 10))
while True:
try:
i = next(_iterator)
except StopIteration:
break
print(i)
也就是说,在每次迭代开始时,迭代器产生的下一个值被赋给循环变量(或变量)。
答案 1 :(得分:1)
来自Understanding Python's "for" statement:
在最简单和原始的形式中,这正是for-in语句的作用;当你写作
for name in train:
do something with name
解释器只需获取
train[0]
并将其分配给name
,然后执行代码块。然后呢 获取train[1]
,train[2]
等,直到获得IndexError
。
或者,我们可以使用dis
并检查机器代码:
>>> def forloop():
for i in range(1, 10):
print i
>>> dis.dis(forloop)
2 0 SETUP_LOOP 28 (to 31)
3 LOAD_GLOBAL 0 (range)
6 LOAD_CONST 1 (1)
9 LOAD_CONST 2 (10)
12 CALL_FUNCTION 2
15 GET_ITER
>> 16 FOR_ITER 11 (to 30)
19 STORE_FAST 0 (i)
3 22 LOAD_FAST 0 (i)
25 PRINT_ITEM
26 PRINT_NEWLINE
27 JUMP_ABSOLUTE 16
>> 30 POP_BLOCK
>> 31 LOAD_CONST 0 (None)
34 RETURN_VALUE
我们设置一个循环,调用范围,然后:
16
FOR_ITER
11 (to 30)
将迭代器的结果推送到堆栈上,然后STORE_FAST
为i
并随后使用。
当迭代器完成时,弹出FOR_ITER
“TOS
[迭代器],字节码计数器增加delta。” dis
显示的内容将我们带到30:POP_BLOCK
结束我们的for循环。
这与开头描述的过程一致。