[python笔记] 深入分析iterable, iterator, generator

参考:

[python笔记] 深入分析iterable, iterator, generator


可迭代的(Iterable)有:

  • 文件
  • generator
  • 大部分containers , 如list, tuple, dict, String.....

一点小测试:

from collections import Iterable, Iterator


def f():
    x = 0
    while True:
        yield x
        x = x + 1

g = f()
a = [1, 2, 3]
b = (1, 2, 3)
c = {"name":"kkk", "age":15}

print(type(g))                      #<class 'generator'>
print(isinstance(g, Iterable))      #True

print(isinstance(a, Iterable))          #True
print(isinstance(b, Iterable))          #True
print(isinstance("String", Iterable))   #True
print(isinstance(c, Iterable))          #True

iterable实现了__iter__()方法的对象, 该方法返回的是的一个iterator对象.其中,iterator的目的是返回所有元素

测试:

x = [1, 2, 3, 6, 2, 39]

itX = iter(x)
print(type(itX))        #<class 'list_iterator'>

for i in range(6):
    print(next(itX),end=" ")    #1 2 3 6 2 39

iterable是一个比iterator更大的概念

x = [1, 2, 3, 6, 2, 39]
for i in x: 
    . . . 

当反汇编此代码时,可以看到显式调用GET_ITER``iter(x) ``FOR_ITER**next()**的指令,它将等效于重复调用以获取每个元素,但这不会从字节代码指令中显示,因为它针对解释器中的速度进行了优化。

import dis
x = [1, 2, 3, 6, 2, 39]
dis.dis('for i in x: pass')

img

调用FOR_ITER这个指令实现了读取下一个next()的功能, 即, for循环中,首先利用GET_ITER得到x的返回值, 一个iterator. 再通过FOR_ITER得到其中的元素. 如此实现了循环的功能

评论