day4 使用yield实现单线程
一、yield生成器(yield)
yield用来结束while循环,并且能够保持之前循环的状态,下一次调用的时候直接从yield开始执行,执行yield后面的程序,并且重新进行循环;另外,yield还可用来接收参数,接收send()传递来的参数,并赋给一个变量。
- import time
- #导入time模块,用于给生产者生成包子定义时间,比如银行处理完成之后告诉用户信息
- def consumer(name):
- #消费者模块
- print("准备吃包子了!....")
- while True:
- #循环,死循环,可以使用yield来处理,并且保持在某一个状态
- baozi = yield
- #使用yield来接收send()传递过来的参数,yield与send()结合使用
- print("包子[%s]来了,被[%s]吃了!" %(baozi,name))
- def producer(name):
- #定义生成这模型
- c = consumer("A")
- #消费者来买包子
- c2 = consumer("B")
- c.__next__()
- #调用consumer()函数
- c2.__next__()
- print("老子开始做包子啦!...")
- for i in range(,):
- time.sleep()
- #生产者每秒钟做两个包子
- print("做了2个包子!")
- c.send(i)
- #把生产者生成的包子传递给yield
- c2.send(i)
- producer("alex")
上面,我们导入了时间time模块,time.sleep()让程序停止一定时间。上面代码消费者吃包子,生产者生成包子,并且生成了包子之后发给消费者(send())来传递,消费者中的yield来接收。这样就能够实现,生产者生成包子,并且把包子传递给消费者,实现了两个函数之间的关联。没有再次调用函数就实现了两个函数之间的关联。
上面程序运行结果如下:
准备吃包子了!....
准备吃包子了!....
老子开始做包子啦!...
做了2个包子!
包子[1]来了,被[A]吃了!
包子[1]来了,被[B]吃了!
做了2个包子!
包子[2]来了,被[A]吃了!
包子[2]来了,被[B]吃了!
做了2个包子!
包子[3]来了,被[A]吃了!
包子[3]来了,被[B]吃了!
做了2个包子!
包子[4]来了,被[A]吃了!
包子[4]来了,被[B]吃了!
做了2个包子!
包子[5]来了,被[A]吃了!
包子[5]来了,被[B]吃了!
做了2个包子!
包子[6]来了,被[A]吃了!
包子[6]来了,被[B]吃了!
做了2个包子!
包子[7]来了,被[A]吃了!
包子[7]来了,被[B]吃了!
做了2个包子!
包子[8]来了,被[A]吃了!
包子[8]来了,被[B]吃了!
做了2个包子!
包子[9]来了,被[A]吃了!
包子[9]来了,被[B]吃了!
我们在使用while循环的时候,可以使用yield终止循环,当我们想再次运行的时候只需调用即可,程序会记住上一次运行的位置,在系统里面保存,当下一次运行的时候,从yield开始执行。
上面是yield执行函数的过程,第一次遇到yield的时候退出,并返回yield后面的返回的结果;第n>1次循环的时候从yield这里开始这行,先执行yield后面的语句,然后在重新执行while循环,再次遇到yield时终止循环。我们知道,yield也可以接收参数,但是要与send结合一起只用。重新执行函数。
day4 使用yield实现单线程的更多相关文章
- python学习,day4:生成器,通过yield实现单线程情况下的并发运算
首先了解一个斐波那契函数的实现,了解下生成器的工作流程 # coding=utf-8 # Author: RyAn Bi def fib(max): n,a,b=0,0,1 while n < ...
- 通过生成器yield实现单线程的情况下实现并发运算效果(异步IO的雏形)
一.协程: 1.生成器只有在调用时才会生成相应的数据 2.调用方式有 " str__next__.() str.send() ", 3.并且每调用一次就产生一个值调用到最后一个 ...
- python2.0 s12 day4
python2.0 s12 day404 python s12 day4 TengLan回顾上节内容 05 python s12 day4 迭代器原理及使用 本节大纲介绍: 1.迭代器&生成器 ...
- Python之路 - Day4 - Python基础4 (新版)
本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...
- Day5-python基础之函数(二)
生成器 迭代器 装饰器 模块 来个需求,一个列表中所有元素都+1 1.最容易想到的方法 for循环,找列表索引,对应每个值+1 list_old = [1,2,3,4,5,6,7,8,9] for ...
- Python 从零学起(纯基础) 笔记 之 迭代器、生成器和修饰器
Python的迭代器. 生成器和修饰器 1. 迭代器是访问集合元素的一种方式,从第一个到最后,只许前进不许后退. 优点:不要求事先准备好整个迭代过程中的所有元素,仅仅在迭代到某个元素时才计算该元素,而 ...
- python3.5-day5_迭代器_生成器_装饰器_模块
笔者QQ 360212316 迭代器&生成器 生成器: 一个函数调用返回一个迭代器,那这个函数叫做生成器,如果函数中包含yield语法,那么这个函数就会变成生成器 生成器的特点: 1.生成器必 ...
- Python3
1.上节内容回顾 递归: 明确的结束条件 问题规模每递归一次都应该比上一次的问题规模有所减少 效率低 高阶函数 文件: rb.wb.ab 一般用在不同系统之间传数据,和传视频流的时候用到,一般以这种形 ...
- Python之路-python(装饰器、生成器、迭代器、Json & pickle 数据序列化、软件目录结构规范)
装饰器: 首先来认识一下python函数, 定义:本质是函数(功能是装饰其它函数),为其它函数添加附件功能 原则: 1.不能修改被装饰的函数的源代码. 2.不 ...
随机推荐
- input 拍照上传
<input id="up2" type="file" accept="image/*" capture="camera&q ...
- Stanford机器学习---第十四讲.机器学习应用举例之Photo OCR
http://blog.csdn.net/l281865263/article/details/50278745 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归.Oc ...
- Codeforces 932.F Escape Through Leaf
F. Escape Through Leaf time limit per test 3 seconds memory limit per test 256 megabytes input stand ...
- window.location.hash在firefox下中文自动转码为UTF-8问题
1.window.location.hash window.location.hash这个属性主要是读取和写入网页位置的,我们经常会用来控制网页单页面跳转或者是控制网页位置.然而这个属性在firefo ...
- Emacs ^ Vim
Emacs存活: http://files.cnblogs.com/files/TheRoadToTheGold/Emacs%E2%80%94%E2%80%94%E5%AD%98%E6%B4%BB.z ...
- Linux 操作系统下 VI 编辑器常用命令详细介绍
一.Vi 简介 vi是unix世界中最通用的全屏编辑器,linux中是用的是vi的加强版vim,vim同vi完全兼容,vi就是"visual interface"的缩写.它可以执行 ...
- 巧用Javascript将相对路径地址转换为绝对路径
这里介绍的其实本质上是两种方法,通过创建DOM或通过JavaScript计算: 1)通过新创建的Image, 经测试会发送一个Aborted的请求,并且IE6不支持, 将new Image改成docu ...
- IO流-LineNumberReader
LineNumberReader继承自BufferedReader,比其多了两个方法,用于设置和获取当前行号, setLineNumber(); getLineNumber();
- bzoj3524/2223 [Poi2014]Couriers
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3524 http://www.lydsy.com/JudgeOnline/problem.ph ...
- 【不能继续浪啦】BZ做题记录[7.01~7.06]
距离上次提交..><居然已经过去一个半月了... 然后再去看看人家RXDoi.. 差距越来越大啦... 最后更新时间:7.06 19:06 [07.03 21:02]夏令营自修课逃逃真爽. ...