生成器

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

所以,如果列表元素可以按照某种算法推出,那么就不必创建完整的list,从而节省大量空间。在python中,这种机制为迭代器:generator

生成器只有在调用时才会生成相应的数据,它只记录当前位置,只有一个__next__()方法取得下一个数据(python2为next()方法)。而列表在没有调用它的情况下依然会生成数据.

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

L = [x*x for x in range(10)] #列表生成式

g = (x*x for x in range(10)) #生成器

所以,我们创建了一个generator后,基本上不会调用__next__()方法,而是通过for 循环来迭代它

for i in g:

  print i

generator非常强大。如果推算的算法比较复杂,用类似列表生成式的for循环无法实现的时候,还可以用函数来实现。

比如,著名的菲波那契数列(Fibonacci),出第一个和第二个数外,任意一个数都可由前两个数相加得到:

#!usr/bin/env python# -*- coding:utf-8 -*-

__author__ = "Samson"

def fib(max):    n,a,b = 0,0,1#注意,该句相当于t = (0,0,1),n=t[0],a=t[1],b=t[2]    while n < max:        print(b)        yield b#只要有yield存在,便是一个生成器        a,b = b,a+b        n+=1    return "done"f = fib(100)print(f.__next__())
还可以通过yield实现在单线程的情况下实现并发运算的效果,如:
#!usr/bin/env python# -*- coding:utf-8 -*-

__author__ = "Samson"

import timedef consumer(name):    print("%s 准备吃饺子啦!" %name)    while True:        jiaozi = yield#保存当前状态并返回

        print("饺子[%s]来了,被[%s]吃了!" %(jiaozi,name))

c = consumer("lixiang")c.__next__()# b1 = "韭菜馅"# c.send(b1)#调用yield的同时给jiaozi传值# #c.__next__()def producer(name):    c = consumer("A")#把函数变成生成器赋给c,里面还没执行    c2 = consumer("B")    c.__next__()    c2.__next__()    print("老子开始准备做饺子了")    for i in range(10):        time.sleep(1)        print("做了1个饺子,分两半!")        c.send(i)        c2.send(i)producer("samson")

转载于:https://www.cnblogs.com/cansun/p/8099892.html

python:生成器相关推荐

  1. python生成器使用场景桌面_Python – 如何更简洁地使用生成器?

    ( Python 3) 我正在使用Python生成器从队列中读取消息. 在消费者读取队列消息之后,它需要能够告诉生成器在成功处理后删除队列消息. 为了将.send()发送到Python生成器,似乎我必 ...

  2. python生成器和迭代器作用_浅谈Python中的生成器和迭代器

    迭代器 迭代器协议 对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么返回一个异常来终止本次迭代.(只能往前走,不能往后退!) 迭代器对象 遵循了(实现了)迭代器协议的对象.(对象内 ...

  3. python生成器杨辉三角_python 生成器生成杨辉三角的方法(必看)

    用Python写趣味程序感觉屌屌的,停不下来 #生成器生成展示杨辉三角 #原理是在一个2维数组里展示杨辉三角,空的地方用0,输出时,转化为' ' def yang(line): n,leng=0,2* ...

  4. js date 当前日志往后一个月_【应用实例】如何利用 Python 生成器 yield 监控日志?...

    Python 生成器 yield 是编写基于处理管道,流或数据流程序的一种极其强大的方式,在<Python参考手册>中有一则实例非常简单实用,略加修改,分享一下给大家.如果你对生成器yie ...

  5. 黄哥漫谈Python 生成器

    2019独角兽企业重金招聘Python工程师标准>>> 黄哥漫谈Python 生成器 何为生成器(Generators) 下面的黄哥用大白话说明. 当Python 函数不用retur ...

  6. Python 生成器(yield)

    Python 生成器 一.生成器(generator) Python 的生成器是一种特殊的程序,可以被用作控制循环的迭代行为.生成器可以暂时挂起函数,并保留函数的局部变量等数据,然后在再次调用它的时候 ...

  7. Python生成器(send,close,throw)方法详解

    <Python生成器>一节中,详细介绍了如何创建一个生成器,以及生成器的基础用法.本节将在其基础上,继续讲解和生成器有关的一些方法. Python生成器send()方法 我们知道,通过调用 ...

  8. python生成器yield原理_Python generator生成器和yield表达式详解

    前言 Python生成器(generator)并不是一个晦涩难懂的概念.相比于MetaClass和Closure等概念,其较为容易理解和掌握.但相对于程序结构:顺序.循环和分支而言其又不是特别的直观. ...

  9. python 生成器表达式_Python中的列表理解与生成器表达式

    python 生成器表达式 The list is a collection of different types of elements and there are many ways of cre ...

  10. python生成器迭代_python中的生成器和迭代器

    前言: 我们来了解一下什么是python中生成器.了解一下python生成器是什么,以及生成器在python编程之中能起到什么样的作用. 定义: 生成器和迭代器 通过列表生成式,我们可以直接创建一个列 ...

最新文章

  1. Windows Vista Beta 1试用体会
  2. 1.2开发文档简读,了解全貌.mp4
  3. c语言计算文件摘要值,c语言文件操作摘要.ppt
  4. 第六节: 六类Calander处理六种不同的时间场景
  5. 2016年度十大新兴技术出炉,你最看好哪个?
  6. Matplotlib作业3
  7. 计算机桌面打开图像管理,如何给电脑桌面设置几张图片自动播放
  8. R|数据处理|merge数据详解
  9. l298n电机哪一端为正_L298N是如何控制直流电机正反转的
  10. SQL Server 2008 R2安装
  11. 我的编程之路上的点滴记录【一】
  12. 如何重装系统(小白系列-超详细的手把手教你-图文并茂-WIN7,8,10,XP)
  13. 南京计算机类事业单位,南京市属事业单位公开招聘579人 3月25日起报名
  14. 纪念碑谷背后的故事:不差钱!8人团队研发十月
  15. linux下查看服务器型号
  16. latex如何更改某一段落的字体_LaTeX基础四:字体字号设置
  17. C++设计模式——观察者模式(高屋建瓴)
  18. 微软输入法 ——当前时间 快捷键
  19. TCP与UDP通信方式的实现
  20. IDEA创建的maven项目没有src目录问题解决

热门文章

  1. python导出百万数据到excel_Python 批量插入100万级数据到Excel文件(简洁版)
  2. python自定义修饰器_Python进阶自检清单:来自《Effective Python》的建议(二)
  3. 单元覆盖测试排除某些类烧苗_汽车嵌入式软件测试——嵌入式软件测试概述
  4. python调用程序压缩文件_Python在后台自动解压各种压缩文件的实现方法
  5. Unbuntu 出现无法解析或打开软件包的列表或是状态文件的解决办法
  6. 计算机控制技术证书可以考吗,计算机控制技术专业可考哪些资格证书
  7. .net from 关闭事件_libVLC 事件机制
  8. 关于如何理解链表结构体指针引用LinkNode * L的问题
  9. 易筋SpringBoot 2.1 | 第三十六篇:Spring Boot RestTemplate超时配置示例
  10. linux虚拟内存和win,linux下的vm(虚拟内存)和windows下的作用是一样的,均是防止真实内存资源不足准备的. linux的vm相关参数...