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中执行shell命令的几个方法小结
Sep 18 Python
完美解决python遍历删除字典里值为空的元素报错问题
Sep 11 Python
Python实现的微信公众号群发图片与文本消息功能实例详解
Jun 30 Python
Pycharm编辑器技巧之自动导入模块详解
Jul 18 Python
Python 多核并行计算的示例代码
Nov 07 Python
matplotlib绘制动画代码示例
Jan 02 Python
用TensorFlow实现戴明回归算法的示例
May 02 Python
django框架实现模板中获取request 的各种信息示例
Jul 01 Python
python 利用已有Ner模型进行数据清洗合并代码
Dec 24 Python
浅析python 通⽤爬⾍和聚焦爬⾍
Sep 28 Python
利用python爬取有道词典的方法
Dec 08 Python
Opencv 图片的OCR识别的实战示例
Mar 02 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
模拟SQLSERVER的两个函数:dateadd(),datediff()
2006/10/09 PHP
处理(php-cgi.exe - FastCGI 进程超过了配置的请求超时时限)的问题
2013/07/03 PHP
PHP中使用Memache作为进程锁的操作类分享
2015/03/30 PHP
再Docker中架设完整的WordPress站点全攻略
2015/07/29 PHP
PHP新特性之字节码缓存和内置服务器
2017/08/11 PHP
PHP实现的日历功能示例
2018/09/01 PHP
javascript KeyDown、KeyPress和KeyUp事件的区别与联系
2009/12/03 Javascript
不同浏览器对回车提交表单的处理办法
2010/02/13 Javascript
jquery中ajax函数执行顺序问题之如何设置同步
2014/02/28 Javascript
JQuery EasyUI的使用
2016/02/24 Javascript
Nodejs中解决cluster模块的多进程如何共享数据问题
2016/11/10 NodeJs
js遍历添加栏目类添加css 再点击其它删除css【推荐】
2018/06/12 Javascript
微信小程序非swiper组件实现的自定义伪3D轮播图效果示例
2018/12/11 Javascript
JQuery判断radio单选框是否选中并获取值的方法
2019/01/17 jQuery
微信小程序如何使用canvas二维码保存至手机相册
2019/07/15 Javascript
使用xampp将angular项目运行在web服务器的教程
2019/09/16 Javascript
解决vue组件中click事件失效的问题
2019/11/09 Javascript
jQuery实现鼠标拖拽登录框移动效果
2020/09/13 jQuery
探究python中open函数的使用
2016/03/01 Python
使用Python的Flask框架表单插件Flask-WTF实现Web登录验证
2016/07/12 Python
使用pyqt 实现重复打开多个相同界面
2019/12/13 Python
浅谈python量化 双均线策略(金叉死叉)
2020/06/03 Python
Python Flask框架实现简单加法工具过程解析
2020/06/03 Python
Python如何在bool函数中取值
2020/09/21 Python
美体小铺英国官网:The Body Shop英国
2017/01/24 全球购物
纽约著名的服装辅料来源:M&J Trimming
2017/07/26 全球购物
捷克浴室和厨房设备购物网站:SIKO
2018/08/11 全球购物
社区巾帼文明岗事迹材料
2014/06/03 职场文书
汉语言文学专业求职信
2014/06/19 职场文书
手机被没收的检讨书
2014/10/04 职场文书
运动会表扬稿范文
2015/05/05 职场文书
2015年节能降耗工作总结
2015/05/22 职场文书
2016年6月份红领巾广播稿
2015/12/21 职场文书
Pycharm 如何设置HTML文件自动补全代码或标签
2021/05/21 Python
vue实现水波涟漪效果的点击反馈指令
2021/05/31 Vue.js
Python超详细分步解析随机漫步
2022/03/17 Python