python 生成器协程运算实例


Posted in Python onSeptember 04, 2017

一、yield运行方式

我们定义一个如下的生成器:

def put_on(name):
 print("Hi {}, 货物来了,准备搬到仓库!".format(name))
 while True:
  goods = yield
  print("货物[%s]已经被%s搬进仓库了。"%(goods,name))
 
p = put_on("bigberg")
 
#输出
G:\python\install\python.exe G:/python/untitled/study4/test/double.py
 
Process finished with exit code 0

当我们把一个函数通过yield转换成生成器,直接运行函数是不会出现结果返回的。因为此时函数已经是个生成器了,我们要通过next()来取得值,并且在遇到yield时再次跳出函数。

print(type(p))
 
#输出
<class 'generator'>

我们添加next()方法:

def put_on(name):
 print("Hi {}, 货物来了,准备搬到仓库!".format(name))
 while True:
  goods = yield  #遇到yield中断
  print("货物[%s]已经被%s搬进仓库了。"%(goods,name)) #中断后运行部分
 
p = put_on("bigberg")
p.__next__()
 
#输出
Hi bigberg, 货物来了,准备搬到仓库!

此时函数中断在 goods = yield 的地方,当我们再次调用next()函数时,函数只会运行中断以后的内容,即上例中的yield下面部分。

我们再添加一个next():

def put_on(name):
 print("Hi {}, 货物来了,准备搬到仓库!".format(name))
 while True:
  goods = yield
  print("货物[%s]已经被%s搬进仓库了。"%(goods,name))
 
p = put_on("bigberg")
p.__next__()
p.__next__()
 
#输出
Hi bigberg, 货物来了,准备搬到仓库!
货物[None]已经被bigberg搬进仓库了。

我们可以第二次next()运行的是yield下面的部分内容,但是并没有给goods传值,所以货物是 None。

小结:

通过yield将函数转换为生成器,需要使用next()方法才能运行

yield只是保留函数的中断状态,再次调用next()会执行yield后面的部分

yield如果没有返回值,会返回一个None空值

二、send()传值

def put_on(name):
 print("Hi {}, 货物来了,准备搬到仓库!".format(name))
 while True:
  goods = yield
  print("货物[%s]已经被%s搬进仓库了。"%(goods,name))
 
p = put_on("bigberg")
p.__next__()
p.send("瓜子")
 
#输出
Hi bigberg, 货物来了,准备搬到仓库!
货物[瓜子]已经被bigberg搬进仓库了。

小结:

__next__()只是调用这个yield,也可以说成是唤醒yield,但是不不会给yield传值。

send()方法调用yield是,能给yield传值

使用send()函数之前必须使用__next__(),因为先要中断,当第二次调用时,才可传值。

def put_on(name):
 print("Hi {}, 货物来了,准备搬到仓库!".format(name))
 while True:
  goods = yield
  print("货物[%s]已经被%s搬进仓库了。"%(goods,name))
 
p = put_on("bigberg")
p.__next__()
p.send("瓜子")
p.send("花生")
p.send("饼干")
p.send("牛奶")
 
#多次调用send()
Hi bigberg, 货物来了,准备搬到仓库!
货物[瓜子]已经被bigberg搬进仓库了。
货物[花生]已经被bigberg搬进仓库了。
货物[饼干]已经被bigberg搬进仓库了。
货物[牛奶]已经被bigberg搬进仓库了。

三、单线程实现并行效果(协程)

import time
 
 
def put_on(name):
 print("Hi {}, 货物来了,准备搬到仓库!".format(name))
 while True:
  goods = yield
  print("货物[%s]已经被%s搬进仓库了。"%(goods,name))
 
 
def transfer(name):
 p = put_on('A')
 p2 = put_on('B')
 p.__next__()
 p2.__next__()
 print("%s将货物送来了!"%name)
 for i in range(5):
  time.sleep(1)
  print("%s递过来两件货物"%name)
  p.send("瓜子")
  p2.send("花生")
 
transfer("bigberg")
 
#输出
Hi A, 货物来了,准备搬到仓库!
Hi B, 货物来了,准备搬到仓库!
bigberg将货物送来了!
bigberg递过来两件货物
货物[瓜子]已经被A搬进仓库了。
货物[花生]已经被B搬进仓库了。
bigberg递过来两件货物
货物[瓜子]已经被A搬进仓库了。
货物[花生]已经被B搬进仓库了。
bigberg递过来两件货物
货物[瓜子]已经被A搬进仓库了。
货物[花生]已经被B搬进仓库了。
bigberg递过来两件货物
货物[瓜子]已经被A搬进仓库了。
货物[花生]已经被B搬进仓库了。
bigberg递过来两件货物
货物[瓜子]已经被A搬进仓库了。
货物[花生]已经被B搬进仓库了。

以上这篇python 生成器协程运算实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Python中用keys()方法返回字典键的教程
May 21 Python
详解Python之unittest单元测试代码
Jan 24 Python
python3+requests接口自动化session操作方法
Oct 13 Python
Python中Unittest框架的具体使用
Aug 27 Python
解决Pytorch训练过程中loss不下降的问题
Jan 02 Python
如何使用python传入不确定个数参数
Feb 18 Python
python编程进阶之类和对象用法实例分析
Feb 21 Python
Python如何省略括号方法详解
Mar 21 Python
Python中Selenium模块的使用详解
Oct 09 Python
Python通过Schema实现数据验证方式
Nov 12 Python
Pycharm安装第三方库失败解决方案
Nov 17 Python
Pytorch 如何加速Dataloader提升数据读取速度
May 28 Python
python 文件操作删除某行的实例
Sep 04 #Python
Django数据库操作的实例(增删改查)
Sep 04 #Python
python中Matplotlib实现绘制3D图的示例代码
Sep 04 #Python
Python2实现的LED大数字显示效果示例
Sep 04 #Python
Python2随机数列生成器简单实例
Sep 04 #Python
开源软件包和环境管理系统Anaconda的安装使用
Sep 04 #Python
Python基于回溯法子集树模板解决取物搭配问题实例
Sep 02 #Python
You might like
php获取表单中多个同名input元素的值
2014/03/20 PHP
php中用memcached实现页面防刷新功能
2014/08/19 PHP
PHP共享内存用法实例分析
2016/02/12 PHP
PHP pear安装配置教程
2016/05/14 PHP
javascript 写的一个简单的timer
2009/07/30 Javascript
浅谈javascript回调函数
2014/12/07 Javascript
轻松创建nodejs服务器(8):非阻塞是如何实现的
2014/12/18 NodeJs
jQuery基本选择器(实例及表单域value的获取方法)
2016/05/20 Javascript
Javascript实现倒计时(防页面刷新)实例
2016/12/13 Javascript
jQuery实现图片滑动效果
2017/03/08 Javascript
详解JS获取HTML DOM元素的8种方法
2017/06/17 Javascript
vue.js中$set与数组更新方法
2018/03/08 Javascript
vue使用el-upload上传文件及Feign服务间传递文件的方法
2019/03/15 Javascript
vue分页插件的使用方法
2019/12/25 Javascript
vue 虚拟DOM的原理
2020/10/03 Javascript
[01:01:36]Optic vs paiN 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
从零学Python之引用和类属性的初步理解
2014/05/15 Python
Python库urllib与urllib2主要区别分析
2014/07/13 Python
简单的编程0基础下Python入门指引
2015/04/01 Python
Python中 Lambda表达式全面解析
2016/11/28 Python
python数据结构之线性表的顺序存储结构
2018/09/28 Python
Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法详解
2019/02/28 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
2019/03/20 Python
python实现计算器功能
2019/10/31 Python
python json 递归打印所有json子节点信息的例子
2020/02/27 Python
用CSS3和table标签实现一个圆形轨迹的动画的示例代码
2019/01/17 HTML / CSS
HTML5 WebSocket实现点对点聊天的示例代码
2018/01/31 HTML / CSS
AT&T Wireless:手机、无限数据计划和配件
2018/06/03 全球购物
洲际酒店集团英国官网:IHG英国
2019/07/10 全球购物
教育专业个人求职信
2013/12/02 职场文书
小学运动会表扬稿
2014/01/19 职场文书
住宅质量保证书
2014/04/29 职场文书
小人国观后感
2015/06/11 职场文书
2016年敬老月活动总结
2016/04/05 职场文书
全家福照片寄语怎么写?
2019/04/02 职场文书
Mac环境Nginx配置和访问本地静态资源的实现
2021/03/31 Servers