zoukankan      html  css  js  c++  java
  • python-迭代器 生成器 可迭代对象

     总结(可迭代对象):

      只要一个对象有__iter__方法,那么这个对象就是可迭代对象

      如:字符串 字典 元祖 集合 打开的文件句柄(能够被for循环的都是 )

    迭代器:

      只要一个对象有__iter__和__next__方法,这个对象就是迭代器

      迭代器的优点:

      1.不依赖索引

      2.惰性计算,节省内存  缺点:1.不如索引取值方便 2.一次性,只能往后取值,不能回退

    生成器:

      使用yield的函数被称为生成器(操作类似迭代器)

      #生成器(列表式)

      generator = (x*x for x in range(10)) 把列表生成式的【】改成(),就创建了一个生成器

    yield from 后面加上一个生成器后,就实现了生成的嵌套。
    当然实现生成器的嵌套,并不是一定必须要使用yield from,而是使用yield from可以让我们避免让我们自己处理各种料想不到的异常,而让我们专注于业务代码的实现。
    如果自己用yield去实现,那只会加大代码的编写难度,降低开发效率,降低代码的可读性。既然Python已经想得这么周到,我们当然要好好利用起来。
    讲解它之前,首先要知道这个几个概念
    
      1、调用方:调用委派生成器的客户端(调用方)代码2、委托生成器:包含yield from表达式的生成器函数3、子生成器:yield from后面加的生成器函数
    
    # 子生成器
    def average_gen():
        total = 0
        count = 0
        average = 0
        while True:
            new_num = yield average
            count += 1
            total += new_num
            average = total/count
    
    # 委托生成器
    def proxy_gen():
        while True:
            yield from average_gen()
    
    # 调用方
    def main():
        calc_average = proxy_gen()
        next(calc_average)            # 预激下生成器
        print(calc_average.send(10))  # 打印:10.0
        print(calc_average.send(20))  # 打印:15.0
        print(calc_average.send(30))  # 打印:20.0
    
    if __name__ == '__main__':
        main()
  • 相关阅读:
    实验2:Mininet实验——拓扑的命令脚本生成
    实验1:Mininet源码安装和可视化拓扑工具
    第一次博客作业
    数据采集第四次作业
    第7组(69)团队展示
    数据采集第三次作业
    结对作业
    数据采集第二次作业
    数据采集第一次作业
    第一次个人编程作业
  • 原文地址:https://www.cnblogs.com/qlshao/p/13608868.html
Copyright © 2011-2022 走看看