生成器

先从列表生成式说起

可以通过简单的式子,生成有规律的列表

如果把 [ ] 换为 ( ) 会发生什么呢?

看到 x 存的不再是列表,而是一个地址,而这个地址就是我们的生成器对象的地址

这东西有什么用呢? 当然时,节省内存啦

假设现在有很庞大的一组数据要处理,貌似不可能把它一次性载入内存再进行处理,这时候就体现出了生成器的好处,因为它只占用一个数据的内存空间,当需要访问下一个

数据时,当前的数据会被覆盖掉,所以有多少数据都无所谓啦,都是可以处理的。可以通过 next() 或 __next__() 方法访问下一个数据。

当然还是要借助循环来进行对元素的访问,100w个数据不可能敲一百万个 next() 吧。

当然如果这些数据不能用表达式表示怎么办?答案就是用函数 + yield 关键字,有yield关键字的函数就是一个生成器。

来个栗子(打印斐波那契数列):

yield a 可以理解为返回一个a,但会记下当前代码的位置,下次将从yield a 的下一句开始执行代码。拿这段代码来说,从最后的循环说起。

1.next() 方法启动生成器,生成器要执行一次

2.程序进入wile循环

3.遇到yield a 返回a值并几下断点

4.for 循环的print语句受到a的值打印a=1

5.for继续循环,有调用了next()方法,生成器再次启动

6.生成器找到上次断点的位置执行代码(a,b = b,a+b)...

7.再次遇到yield语句,回到步骤 3

......

除了 next()方法 ,send ( )也可以启动生成器,但是send可以给生成器传值,而这个值将强制替换上次断点的处的返回值

看到 send 传入的参数替换的是 res 的值,而不是 a 的值!!!,至于为什么会打印 ‘None’ 其实 next 默认传入一个 None 所以一调用 next() 就会打印 None,而调用 send 则

打印 sned 传入的参数。

最后来一个经典的生产者消费者问题吧

 import time
def consumer(name):
print("%s is ready to consume" % name)
while True:
res = yield
print("%s has consumed goods %d" % (name,res))
def producer(name):
print("%s is ready to produce" % name)
while True:
time.sleep(3)
succ = yield
print("produce goods %d and goods %d successfully" % (succ,succ+1))
c1 = consumer('c1')
c2 = consumer('c2')
c1.__next__()
c2.__next__()
p1 = producer('p1')
p1.__next__()
for i in range(10):
p1.send(i+1)
c1.send(i+1)
c2.send(i+2)

python(生成器)的更多相关文章

  1. python——生成器

    python——生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个 ...

  2. Python生成器-博文读后感

    Windows 10家庭中文版,Python 3.6.4, 上午看过了一篇讲Python生成器的博文: 提高你的Python: 解释‘yield’和‘Generators(生成器)’(英文原文) 这篇 ...

  3. 小学生都能学会的python(生成器)

    小学生都能学会的python(生成器) 1. 生成器 生成器的本质就是迭代器. 生成器由生成器函数来创建或者通过生成器表达式来创建 # def func(): # lst = [] # for i i ...

  4. Python 生成器 (generator) & 迭代器 (iterator)

    python 生成器 & 迭代器 生成器 (generator) 列表生成式 列表生成式用来生成一个列表,虽然写的是表达式,但是储存的是计算出来的结果,因此生成的列表受到内存大小的限制 示例: ...

  5. python生成器学习

    python生成器学习: 案例分析一: def demo(): for i in range(4): yield i g=demo() g1=(i for i in g) #(i for i in d ...

  6. 【python之路29】python生成器generator与迭代器

    一.python生成器 python生成器原理: 只要函数中存在yield,则函数就变为生成器函数 #!usr/bin/env python # -*- coding:utf-8 -*- def xr ...

  7. Generator - Python 生成器

    Generator, python 生成器, 先熟悉一下儿相关定义, generator function 生成器函数, 生成器函数是一个在定义体中存有 'yield' 关键字的函数. 当生成器函数被 ...

  8. python生成器原理剖析

    python生成器原理剖析 函数的调用满足"后进先出"的原则,也就是说,最后被调用的函数应该第一个返回,函数的递归调用就是一个经典的例子.显然,内存中以"后进先出&quo ...

  9. 什么是Python生成器?与迭代器的关系是什么?

    生成器是一个特殊的迭代器,它保存的是算法,每次调用next()或send()就计算出下一个元素的值,直到计算出最后一个元素,没有更多的元素时,抛出StopIteration.生成器有两种类型,一种是生 ...

  10. Python 生成器与迭代器 yield 案例分析

    前几天刚开始看 Python ,后因为项目突然到来,导致Python的学习搁置了几天.然后今天看回Python 发现 Yield 这个忽然想不起是干嘛用的了(所以,好记性不如烂笔头.).然后只能 花点 ...

随机推荐

  1. eclipse tomcat 热加载 免除重启

       Tomcat的热部署(以后就不用重起了)   1. tomcat上的部署问题,有时候也是个麻烦的问题,要是不采用热部署,我们就只能每次对原来的文件做一次改动的时候就要重新部署, 而每次重新部署都 ...

  2. 冰多多团队-第十次Scrum例会

    冰多多团队-alpha第十次Scrum会议 工作情况 团队成员 已完成任务 待完成任务 牛雅哲 修复了Iatdemo语音接口的bug,整个demo pipeline跑通 为词库设计更多的扩展模块和扩展 ...

  3. 【转】Android 破解视频App去除广告功能详解及解决办法总结

    Android 破解视频App去除广告功能 作为一个屌丝程序猿也有追剧的时候,但是当打开视频app的时候,那些超长的广告已经让我这个屌丝无法忍受了,作为一个程序猿看视频还要出现广告那就是打我脸,但是我 ...

  4. 字符串反转(java和js)

    写在前面 关于字符串反转的奇技淫巧很多, 会一种就行了, 但是解锁更多姿势可谓艺多不压身啊~~ 正文 java https://www.cnblogs.com/binye-typing/p/92609 ...

  5. Swift5升级遇到的AVCapturexxxDelegate的坑,写法换了

    升级到swift5之后,遇到关于AVCapture的两个代理都失效了, 找了一圈,发现原因是代理方法写法变了,如果不替换,代理事件就收不到了 解决方法: 替换新写法就可以了 我这边只举例我遇到的两个例 ...

  6. python2 手动安装更新pip

    现在对于python2版本,直接修改python.exe名字为python2.exe,命令python2 -m pip install --upgrade pip --force-reinstall可 ...

  7. java js ur特殊格式处理 json 特殊格式处理

    url特殊格式处理: js中使用 encodeURIComponent() 编码对应的value $.ajax({ type: "post", url: "/tb_are ...

  8. simplexml_load_string 转换xml为数组

    php simplexml_load_string 函数可以很简单转换 xml 字符串为 SimpleXMLElement 对象 但是,对象的值不好取,例如: result => SimpleX ...

  9. [PHP] Laravel 体现 MySQL、Sqlite 数据的大小写敏感

    要想实现数据比对的大小写敏感,方式是设置数据库字段类型 或者 字段校验字符集. MySQL 和 Sqlite 所支持的 collations 形式是不同的,你可以通过以下文档了解到. MySQL co ...

  10. vba实现工具的序列号验证框架

    对于密码破译方面笔者不太懂,之前对于各种序列号的激活也有些臆测,自己根据想法做了个序列号验证的小框架,以后做的工具也可以用之保护一下下... 主要思路是:用户打开小工具后,系统检测是否已激活,如果未激 ...