zoukankan      html  css  js  c++  java
  • Python的容器、生成器、迭代器、可迭代对象的家谱

    前言


    之前虽然写Python,但是对Python的这些概念也是模模糊糊,知道有一天,看到了一篇文章,讲的透彻,所以就写这篇作为对于这篇高文的读书笔记吧
    致谢,该文作者,完全理解Python迭代对象、迭代器、生成器

    总论


    总论:可迭代对象概念最大,包含迭代器和大部分容器,以及例如files、sockets等可以迭代的对象。

    容器:
        list、dequeue、set、dict、Counter、tuple、str等等,注意Bloom filter容器不能迭代,所以不是所有容器都可以迭代的。
    
    迭代器:
        概念比较复杂,基本上就是实现了__iter__()和__next__()两个方法的对象,当没有下一个元素的时候跑出StopIteration异常。
        所以所有的生成器都是迭代器,这里的生成器包括生成器推导式,和生成器函数。
    
    生成器:
        特殊又优雅的迭代器,函数体没有return内容(实际上,在循环中return 本身类似于break的功能,但是不能 return xxx);
        可以节省CPU和内存。
    生成器表达式:
        与列表推导式的差别
        [x for x in y if x > z] -> 列表推导式
        (x for x in y if x > z) -> 生成器表达式
    
    

    然后我们来重点学习一下生成器吧:

    生成器


    yield 来代替return 临时转移程序控制权,yield 暂时把当下的值返回给编程者,但是保留了函数运行状态,而不是像return 那样直接结束了自身函数的调用。
    例如我们来处理一个大文件

    def readBigFile(filename):
        with open(filename,"r") as fread:
            while True:
                try:
                    line = fread.readline()
                except Exception(reason):
                    raise
                if line != "" and line != None:
                    yield line
                else:
                    break
    
  • 相关阅读:
    if else配对问题
    未完
    c,c++,java格式总结
    c++笔记
    Vaadin
    J2msi 自己制作的把exe打成安装包简易GUI程序(第二版 带DLL注册)
    scala手动编译运行
    jframe去掉窗体
    jdk1.7
    vbox共享文件 挂载
  • 原文地址:https://www.cnblogs.com/KevinGeorge/p/9176991.html
Copyright © 2011-2022 走看看