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

参考: 

可迭代器 vs. 迭代器 vs. 生成器 » nvie.comhttps://nvie.com/posts/iterators-vs-generators/#containers


 

可迭代的(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_ITERiter(x) FOR_ITER next()指令,它将等效于重复调用以获取每个元素,但这不会从字节代码指令中显示,因为它针对解释器中的速度进行了优化。

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

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

 

posted @ 2022-03-30 08:50  泥烟  阅读(35)  评论(0编辑  收藏  举报