(补)4.生成器知识点补充和梳理

这篇文章是对上一篇讲生成器和迭代器的文章做的补充。

回顾一下概念,什么是生成器?

生成器就是一个包涵yield关键字的函数,当这个函数被调用的时候,函数体中的代码不会被执行!

而是返回了一个迭代器。

每请求一个值,就回执行一次生成器中的代码,直到遇到yield或者return。

其中yield意为着生成一个值,而return意为着生成器要停止执行,不再生成任何东西,这是yield和return本质上的区别。

其实函数式生成器,可以当做是分文两部分组成的,生成器的函数和生成器的迭代器。

下面是关于生成器常用方法详解:

next()老生常谈,没什么好说的了,从生成器中获取一个新的值,这个值是从生成器的yeild中返回出来的。

send() 和next方法作用很相似,都可以从生成器中取一个值,和next不同的是,send方法可以给yield传值,然后在通过yield传递给生成器中的变量,也就是间接的给生成器内部的变量赋值(通过下面的例子可以看到)

注意!!在使用send方法有一个特别的注意事项!就是第一次调用生成器时,请使用next方法或者是send(None)send一个空值,如果send其他的值会出错!!这是因为没有yield语句去接收这个值!

(简单的说,就是在函数的执行状态被“挂起”send方法才会起到相应的作用。)

最后,在细说下前面写的那个简化版的“生产者与消费者”模型。

1 import time

2 def consumer(name):

3     print ‘我是%s,准备开始吃包子了‘%(name)

4     while True:

5         stuffed_bun = yield

6         time.sleep(1)

7         print "%s很开心的把%s吃掉了" %(name,stuffed_bun)

8 def producer():

9     p1 = consumer("suhaozhi")

10    p2 = consumer("ayumi")

11    p1.next()   #执行next方法后,死循环开始

12    p2.next()

13    for i in range(10):

14        time.sleep(1)

15        p1.send("包子%s" %(i))  #通过send给yield赋值,yield在将值赋给stuffed_bun

16        p2.send("包子%s" %(i))

17 producer()

首先,第一步开始执行producer生产者函数,这个函数使用生成器生成了两个“消费者”,首先要明确一个概念!!其中第9行和第10行,只是定义了两个生成器,并不会执行consumer函数中的任何内容。

定义好了两个生成器之后,11行和12行执行的next方法,启动这两个生成器,这时,回到consumer函数,开始执行死循环,执行到yield时候开始将执行状态“挂起”准备接收producer函数(生产者)传的值。

15行16行的代码,就是将值传递给consumer函数中的yield对应的stuffed_bun变量,当yield收到了来15,16行的send方法传递值后,执行第6行和第7行,然后回到producer函数的for循环然后继续执行15行和16行的代码,继续通过yield接收send方法发来的值,给stuffed_bun这个变量赋值....一直到producer(生产者)中的for循环执行结束。

时间: 2024-10-13 14:52:58

(补)4.生成器知识点补充和梳理的相关文章

IE6下的怪异解析知识点补充

转载请注明出处:HTMl5自由者       IE6下的怪异解析知识点补充,布布扣,bubuko.com

第三方框架SDWebImage 知识点补充

1.SDWebImage相关知识点补充 01.SDWebImage接收到内存警告的时候如何处理?采用监听系统警告通知的方式处理,接收到警告后清空缓存 02.SDWebImage队列最大并发数为6 03.SDWebImage内部设置下载图片超时时间为15m 04.SDWebImage图片下载操作使用了NSURLConnection类发送网络请求实现 05.SDWebImage内部使用NSCache类来进行缓存处理 06.SDWebImage内部如何判断图片类型?判断该图片二进制数据的第一个字节 0

面向对象:继承,知识点补充

面向对象: ? 三大特性 : 继承 封装 多态 什么是继承: 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类. python中类的继承分为:单继承和多继承. ? 在开发程序的过程中,如果我们定义了一个类A,然后又想新建立另外一个类B,但是类B的大部分内容与类A的相同时,我们不可能从头开始写一个类B,这就用到了类的继承的概念. 通过继承的方式新建类B,让B继承A,B会'遗传'A的所有属性(数据属性和函数属性),实现代码重

python基础学习-迭代器+生成器(补充)

一:装饰器.生成器(补充了解***) 1.叠加多个装饰器的加载.运行分析(了解***) def deco1(func1): #func1 = wrapper2的内存地址 def wrapper(*args,**kwargs): print('正在运行======>deco1.wrapper1') res1 = func1(*args,**kwargs) # func1是wrapper2 return res1 return wrapper ? def deco2(func2): #func2 =

Docker容器学习梳理--小知识点补充

之前已经梳理了Docker的相关使用事项,这里再补充一些,以便加深掌握程度.1)docker run指令 [[email protected] ~]# docker run --help : docker run [OPTIONS] IMAGE [COMMAND] [ARG...] Run a command in a new container -a, --attach=[] Attach to STDIN, STDOUT or STDERR --add-host=[] Add a custo

Mysql学习笔记(十)存储过程与函数 + 知识点补充(having与where的区别)

学习内容:存储程序与函数...这一章学的我是云里雾里的... 1.存储过程...   Mysql存储过程是从mysql 5.0开始增加的一个新功能.存储过程的优点其实有很多,不过我觉得存储过程最重要的优点就是实现了SQL代码的封装,那么我们为什么需要封装SQL语句呢?原因就是当我们在面对一个庞大的数据库的时候,当我们使用外部程序去访问数据库的时候...我们总不能在外部程序中内嵌很多的SQL语句吧...那样执行的效率不高,并且也不容易维护...因此存储过程将我们的操作进行封装,当我们需要对其进行操

day-3 小知识点补充 编码 集合 文件及函数初识

1. 小知识点的补充 ==数值比较 is比较两边的内存地址 id获取内存地址 小数据池str int,公用一个内存,目的节省内存空间. 要求:A. int范围是-5到256,指向一个地址空间 B. str: 1.不能含有特殊字符 2.单个元素乘以数字不能超过21 2. 编码 字符:看到内容的最小单位.比如: abc:a一个字符 中国:中 Ascii码:1个字节,字母,数字,特殊字符 Unicode:也称万国码,最开始2个字节表示一个字符,后升级到4个字节表示一个字节 Utf-8:最后用8位表示一

知识点补充 set 深浅拷贝

一 对前面知识点的补充 1.str中的join()方法是将列表转换成字符串 lst = ["韩雪","赵丽颖","黄渤","李连杰"] print("_".join(lst)) # 韩雪_赵丽颖_黄渤_李连杰 将每个元素用_进行拼接 s = "马化腾" print("-".join(s)) # 马-化-腾 2.把字符串转换成列表  用split() ss = &quo

07.Pythonset集合,深浅拷?以及部分知识点补充

?. 基础数据类型补充 ?先关于int和str在之前的学习中已经讲了80%以上了. 所以剩下的??看?看就可以了. 我们补充给?个字符串基本操作 列表: 循环删除列表中的每?个元素 分析原因: for的运?过程. 会有?个指针来记录当前循环的元素是哪?个, ?开始这个指针指向第0 个. 然后获取到第0个元素. 紧接着删除第0个. 这个时候. 原来是第?个的元素会?动的变成 第0个. 然后指针向后移动?次, 指向1元素. 这时原来的1已经变成了0, 也就不会被删除了. ?pop删除试试看: 经过分