理解Python中的for循环迭代器

时间:2017-04-03 21:27:46

标签: python loops iterator

您好我正在努力确保我在python中正确理解for循环。

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

我理解范围(1,10)将返回一个可迭代的列表,for循环将调用列出 iter ()函数,该函数将返回迭代器。但我的问题特别针对的是'。从列表范围(1,10)返回的迭代器是否由for循环调用其 iter ()函数产生,存储在' i'并且循环最终会在i上运行next()函数来迭代列表?

2 个答案:

答案 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_FASTi并随后使用。

当迭代器完成时,弹出FOR_ITERTOS [迭代器],字节码计数器增加delta。” dis显示的内容将我们带到30:POP_BLOCK结束我们的for循环。

这与开头描述的过程一致。