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.不 ...
随机推荐
- 【DP】【P5080】 Tweetuzki 爱序列
Description Tweetuzki 有一个长度为 \(n\) 的序列 \(a_1~,~a_2~,~\dots~,a_n\). 他希望找出一个最大的 \(k\),满足在原序列中存在一些数 \(b ...
- C++堆和栈详解(转)
一.预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其 操 ...
- Mysql外键设置中的CASCADE、NO ACTION、RESTRICT、SET NULL
转: Mysql外键设置中的CASCADE.NO ACTION.RESTRICT.SET NULL 2017年06月11日 10:03:13 雅静8 阅读数:5491 版权声明:本文为博主原创文章 ...
- python学习笔记(四) 思考和准备
一.zip的坑 zip()函数接收多个可迭代数列,将数列中的元素重新组合,在3.0中返回迭代器指向 数列首地址,在3.0以下版本返回List类型的列表数列.我用的是3.5版本python, 所以zip ...
- mysql cpu 占用高
vi /etc/my.cnf [mysqld]tmp_table_size=200M mysql> show global status like ‘created_tmp%‘; +—————— ...
- input file 图片上传展示重新上传
html <div> <label class="imgMark">说明:</label> <div class="erWeiM ...
- Java设计模式の模版方法模式
概述 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的 ...
- cmd下常用命令汇总
1.获得文件夹内所有文件的文件名列表 dir *.png /b>list.txt 其中: (1)*.png表示筛选后缀为.png的文件 (2)/b为输出的模式.如下: 引用 /b 只有文件名 ...
- 用C++写一个没人用的ECS
github地址:https://github.com/yangrc1234/Resecs 在做大作业的时候自己实现了一个简单的ECS,起了个名字叫Resecs. 这里提一下一些实现的细节,作为回顾. ...
- Python3 re模块正则表达式中的re.S
在Python的正则表达式中,有一个参数为re.S.它表示"."(不包含外侧双引号,下同)的作用扩展到整个字符串,包括"\n".看如下代码: import re ...