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

    有个需求,把列表[0,1,2,3,4,5,6,7,8,9],要求你把列表里面的每个值加1。

    什么是生成器?

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

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

     生成器是一种特殊程序,可用被用作控制循环的迭代行为,python中生成器是迭代器的一种,使用yield返回值函数,每次调用yield会暂停,而可用使用next()函数和send()函数恢复生成器。

     生成器累死于返回值为数组的一个函数这个函数可用接收参数,可以被调用,但是,不同于一般的函数会一次性返回包含了所有数值的数组,生成器一次只能产生一个值,这样消耗的内存数量将大大减少,而且允许调用函数可用很快的处理前几个返回值,因此生成器看起来像是一个函数,但是表现的却像是迭代器。

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

    a=[0,1,2,3,4,5,6,7,8,9]
    result=[i+1 for i in a ]
    print(result) #列表生成式

    generator_ex=(i+1 for i in a )
    print(generator_ex) #生成器 <generator object <genexpr> at 0x0000023904A99258>

    list和generator_ex的区别是:从表面看是[]和(),但结果却不一样,一个打印出来是列表(因为是列表生成式),而第二个打印出来是
    <generator object <genexpr> at 0x0000023904A99258>,如果需要打印出generator—_ex的每一个元素,那么可以使用next()函数
    #如果要一个个打印出来,可以通过next()函数获得generator的下一个返回值:
    print(next(generator_ex))
    print(next(generator_ex))
    print(next(generator_ex))
    print(next(generator_ex))
    print(next(generator_ex))
    print(next(generator_ex))
    print(next(generator_ex))
    print(next(generator_ex))
    print(next(generator_ex))
    print(next(generator_ex))

     

  • 相关阅读:
    04: vue生命周期和实例属性和方法
    03: vuejs 事件、模板、过滤器
    (打补丁 )patch
    zabbix安装
    zabbix简介
    linux 虚拟网络模型介绍
    虚拟化
    虚拟化分类(半虚拟化和全虚拟化)
    playbook详解—YAML格式的文本
    ansible的介绍和一些基本模块介绍
  • 原文地址:https://www.cnblogs.com/lanyy/p/10706962.html
Copyright © 2011-2022 走看看