• [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得到其中的元素. 如此实现了循环的功能

  • 相关阅读:
    C++中的类访问控制
    Docker应用程序容器技术_转
    16C554(8250)驱动分析
    动态调频DVFS_转
    ubifs概述
    ubifs物理存储
    fmt-重新格式化段落
    uniq-删除重复
    sort
    join用法
  • 原文地址:https://www.cnblogs.com/Knight02/p/16074857.html
Copyright © 2020-2023  润新知