• python学习之路 七 :生成器、迭代器


    本节重点:

    • 掌握列表生成式、生成器、迭代器

     一.生成式

        ​现在有个需求,把[1,2,3,4,5,6,7,8,9,10]中的每个值加1。

    # 二逼青年版
    a = [0,1,2,3,4,5,6,7,8,9,10]
    b = []
    for i in a:
        b.append(i+1)
    print(b)
    # 普通青年版
    a = [1,2,3,4,5,6,7,8,9,10]
    for index,i in enumerate(a):
        a[index] = i+1
    print(a)
    # 文艺青年版
    a = [1,2,3,4,5,6,7,8,9,10]
    a = map(lambda x:x+1,a)
    print(list(a))
    # 装逼青年版 列表生成式
    a = [1,2,3,4,5,6,7,8,9,10]
    g = [i+1 for i in a]
    print(g) 

     二.生成器

        通过列表生成式,我们可以直接创建一个列表。但是,受到内存显示,列表容量肯定是有限的。

    而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

        ​所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

        ​要创建generator有很多种方法,其中一种很简单,将列表生成式的[]改成(),就创建了一个generator。

    l = (x for x in range(10))
    print(l)

    ​    ​创建 l和 g的区别仅在于最外城的[]和(),l是一个list,而g是一个generator。

        ​我们可以直接打印出list的每一个元素,但我们怎么打印出generator的每一个元素呢?

        ​如果要一个一个打印出来,可以使用next()函数获取generator的下一个返回值

    next(g)
    next(g)
    next(g)
    next(g)

        ​generator保存的是算法,每次调用 next(g)就计算出g的下一个元素的值,知道计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。

        ​当然,上面这种不断调用next(g)实在是太变态了,正确的方法使使用for循环,因为generator也是可迭代对象。

    g = (x * x for x in range(10))
    for n in g:
        print(n)
  • 相关阅读:
    【BZOJ1345】[Baltic2007] 序列问题(单调栈大水题)
    【BZOJ2940】[POI2000] 条纹(Multi-SG)
    【BZOJ4589】Hard Nim(FWT+快速幂)
    【CF438E】The Child and Binary Tree(生成函数+多项式开根)
    【洛谷5205】【模板】多项式开根
    【BZOJ4036】[HAOI2015] 按位或(Min-Max容斥+FWT)
    【BZOJ4381】[POI2015] ODW(设阈值+倍增)
    【BZOJ3328】PYXFIB(矩乘+单位根反演)
    【BZOJ2674】Attack(整体二分+树状数组套线段树)
    单纯看懂公式的单位根反演
  • 原文地址:https://www.cnblogs.com/LTEF/p/9431635.html
Copyright © 2020-2023  润新知