• 迭代器和生成器


    迭代器

    • 什么是迭代器

      • 迭代:迭代是一个重复的过程,但是每次重复都是基于上一次重复的结果而继续

      • 迭代器:迭代取值的工具

    • 为什要用迭代器

      • 优点

        1. 提供了一种不依赖索引的迭代取值方式

        2. 更节省内存

      • 缺点

        1. 不如按索引的取值方式灵活

        2. 取值一次性的,只能往后取,无法预测值的个数

    如何用迭代器

    • 可迭代的对象: str/list/tuple/dict/set/文件

      但凡内置有__ iter __方法的对象都称之为迭代对象

    • 迭代器类型:

      既内置有__ iter __ 方法有内置有 __ next __方法的对象都称之为迭代器对象

    • 调用可迭代对象下__ iter __ 方法,会有一个返回值,该返回值就是内置的迭代器对象

    # while 实现迭代取值
    ​
    d = {'k1':111,'k2':222, 'k3':333}
    iter_d = d.__iter__  # 将可迭代对象转化为迭代器对象
    while True:
        try:  # 测试文件
            v = iter_d.__next__  # 迭代循环一个内容
            print(v)
        except StopIteration:  # 当错误内容正好是except即接收不报错
            break
            
    # for 循环迭代取值(底层原理如上)
    d = {'k1':111,'k2':222, 'k3':333}
    for k in d:
        print(k)
        
        
    # for循环的底层原理
    # 1. 调用in后面的那个值/对象的__inter__方法,拿到一个迭代器对象iter_obj
    # 2. 调用迭代器对象iter_obj.__next__()将得到的返回值赋值变量k,循环往复直到取值完毕抛出异常StopIteration
    # 3. 捕捉异常结束循环

      


    生成器

    • 什么是生成器

      生成器就是一种自定义的迭代器

      def func():  # 生成器
          print('first')
          yield 1
          print('second')
          yield 2
          print('third')
          yield 3
          
      for i in func():  # 迭代循环func内容
          print(i)
    • 如何得到生成器

      但凡函数内出现yield关键字,再去调用函数不会立刻执行函数体代码,会得到一个返回值,该返回值就是生成器对象,及自定义迭代器

    • 总结yield:

      1. 提供一种自定义迭代器的解决方案

      2. yield &return

        • 相同点: 都可以返回值,返回值没有类型限制和个数限制

        • 不同点: return只能返回一次值,yield却可以让函数暂停在某个位置,可以返回多次值。

     


     

  • 相关阅读:
    JasperReport 表单发布的问题
    再谈需要分析三(面向对象方法的需求分析过程)续
    ASP.NET 4.0 Session过期 一个奇怪的问题
    再谈需要分析三(面向对象方法的需求分析过程)
    Silverlight 4.0 Accordion 解决ScrollViewer 的问题
    批处理操作压缩文件
    为前端开发人员制作chrome扩展一枚jsbeautifier
    2012年年终总结:这一年,我玩大了
    .net 日志
    快速切换内外网IP
  • 原文地址:https://www.cnblogs.com/liusijun113/p/10059461.html
Copyright © 2020-2023  润新知