• python生成器与迭代器。


    生成器

    在python 中一边循环一边计算的机制,叫做生成器(generator)。

    通过列表生成式,我们可以直接创建一个列表。但是,收到内存的限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的内存,如果我们只需要前面几个元素,那么后面却大多数的元素占用的内存就白白浪费掉了。所以,如果列表元素可以按照某种算法推算出来,就可以在循环过程中不断推算出后续的元素。就不用创建完整的list,从而节省大量的空间。

    生成器保存的是算法,每次调用 next(G) ,就计算出 G 的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出 StopIteration 的异常。

    资料参考: https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317799226173f45ce40636141b6abc8424e12b5fb27000

          https://www.zhihu.com/question/20829330

    创建生成器的方法

    ①要把一个列表生成式的 [ ] 改成 ( )

    类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

    a = (x for x in  range(5))
    print(a)
    next(a)
    next(a)
    list(a)

    ②使用yieId

    yieId 与 ruturn 一样会返回一个值,但是这两者是有区别的:

       yieId语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执

    def gensquares(N):
        for i in range(N):
            yield i ** 2
    
    a = gensquares(5)
    b = gensquares(6)
    
    print(next(a))
    print(next(b))
    print(next(a))
    print(next(b))
    print(next(a))
    print(next(b))
    
    print(list(a))
    print(list(b))

    总结

    生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成器函数的第二次(或第 n 次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变。

    生成器不仅“记住”了它数据状态;生成器还“记住”了它在流控制构造(在命令式编程中,这种构造不只是数据值)中的位置。

    生成器的特点:

    1. 节约内存
    2. 迭代到下一次的调用时,所使用的参数都是第一次所保留下的,即是说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新创建的

     迭代器

    迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

    可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

     可迭代对象

    以直接作用于 for 循环的数据类型有以下几种:

    一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等;

    一类是 generator ,包括生成器和带 yield 的generator function。

    这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable 。

    iter()函数

    生成器都是 Iterator 对象,但 list 、 dict 、 str 虽然是 Iterable ,却不是 Iterator 。

    把 list 、 dict 、 str 等 Iterable 变成 Iterator 可以使用 iter() 函数:

     总结

    • 凡是可作用于 for 循环的对象都是 Iterable 类型;
    • 凡是可作用于 next() 函数的对象都是 Iterator 类型
    • 集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不过可以通过 iter() 函数获得一个 Iterator 对象。

    迭代器与生成器的区别

    参考资料:http://blog.csdn.net/jinixin/article/details/72232604

    生成器是一种特殊的迭代器,但迭代器不一定是生成器。

    生成器是一种特殊的迭代器,生成器自动实现了“迭代器协议”(即__iter__和next方法),不需要再手动实现两方法。

    生成器在迭代的过程中可以改变当前迭代值,而修改普通迭代器的当前迭代值往往会发生异常,影响程序的执行。

  • 相关阅读:
    安全攻防技能——安全基础概念
    解决linux下中文文件名显示乱码问题
    yaml封装
    IIS挂载网站一键更新备份
    MySQL 聚集索引和二级索引
    redolog落盘机制
    MySQL中Redo Log相关的重要参数总结
    mysql之innodb_buffer_pool
    xshell ssh 登录慢
    记录pg
  • 原文地址:https://www.cnblogs.com/ksunone/p/8572088.html
Copyright © 2020-2023  润新知