zoukankan      html  css  js  c++  java
  • python生成器

    通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

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

    创建一个生成器

    l = [ i*2 for i in range(10)]
    print(l) #[0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 列表生成式
    G = (i*2 for i in range(10))
    print(G) #生成器
    

     创建Lg的区别仅在于最外层的[]()L是一个list,而g是一个generator。

    循环generator

    可以用for对generator遍历。

    for j in G:
        print(j)
    
    0
    2
    4
    6
    8
    10
    12
    14
    16
    18
    

     对于列表,我们可以在长度内任意取值,而生成器只有在循环到这一次了才有值。

    l = [ i*2 for i in range(10)]
    G = (i*2 for i in range(10))
    print(l[4]) #8
    print(G[4]) #TypeError: 'generator' object is not subscriptable
    

    generator中有一个next()方法可以直接使用。第一次使用返回第一个值,第二次使用返回第二个值,以此类推。这个是获取下一个值,generator中没有获取上一个值的方法。

    G = (i*2 for i in range(10))
    print(G.__next__()) #0
    print(G.__next__()) #2
    print(next(G)) #4
    print(next(G)) #6
    

    参考文档: 生成器---廖老师博客

  • 相关阅读:
    Linux安装RabbitMQ3.8.7
    VS安装Resharper,使用IDEA风格的快捷键,还需修改的快捷键
    Spring Boot Starter开发
    windows安装redis集群
    spring为bean指定InitMethod和DestroyMethod的三种方法
    spring注入的方式总结
    bean运行时值注入
    CodeForces 1569C Jury Meeting
    CodeForces 1569B Chess Tournament
    CodeForces 1569A Balanced Substring
  • 原文地址:https://www.cnblogs.com/qing-chen/p/7267113.html
Copyright © 2011-2022 走看看