生成器

先从列表生成式说起

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

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

看到 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. CAP原则 (阿里)

    CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency).可用性(Availability).分区容错性(Partition tolerance).CAP 原则指的是,这三 ...

  2. 20190815网络与信息安全领域专项赛线上赛misc WriteUp

    目录 签到题 题目内容 使用工具 解题步骤 七代目 题目下载地址 使用工具 解题步骤 亚萨西 题目下载链接 使用工具 解题步骤 24word 题目下载链接 使用工具 解题步骤 感想 几星期前报了名却完 ...

  3. 【Beta】Phylab 发布说明

    Phylab Beta阶段发布说明 一.发布地址 Phylab 二.新功能 1. Markdown(Html)报告生成 在生成报告界面可以选择报告生成方式:Latex或Markdown模板.目前支持M ...

  4. maven 工具

    maven 工具 1.打包:mvn clean package 2.打包并安装到本地仓库:mvn clean install 3.利用maven下载源代码:mvn dependency:sources ...

  5. 启用IIS Express SSL(Https)的注意事项

    2年前搞国外的信用卡支付对接,必须用SSL方式调用第三方支付公司的接口,本地调试需要启用IIS Express的SSl,最近又搞类似需要SSL的项目,忘记怎么设置的了,本以为直接将原来的http后面加 ...

  6. 【JavaScript】frame跨域访问元素

    什么是跨frame访问元素呢?比如main.html中有如下代码: <frameset cols="50%,*"> <frame src="frame1 ...

  7. essay sundry

    感觉很多单词, 即使是所谓的抽象名词都有复数形式,是习惯用法,比如, details, comments, ads等 ad: 广告, advertise的缩写? advertise. advertis ...

  8. Xamarin.FormsShell基础教程(9)Shell相关类体系

    Xamarin.FormsShell基础教程(9)Shell相关类体系 在Shell中,最为主要的类是Shell类.Shell类实现了大多数应用程序所需的基本UI功能的页面.除此以外,常用的类还有Sh ...

  9. [转]TrueType字体结构

    TrueType字体通常包含在单个TrueType字体文件中,其文件后缀为.TTF. OpenType字体是以类似于TrueType字体的格式编码的POSTSCRIPT字体.OPENTYPE字体使用. ...

  10. idea 出现 bootstrap.properties 中的内容不能识别

    错误截图如下 依赖库引用问题 第一种: <dependency> <groupId>org.springframework.cloud</groupId> < ...