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中函数的参数与作用域
Mar 20 Python
Python的标准模块包json详解
Mar 13 Python
Python将多个excel表格合并为一个表格
Feb 22 Python
python爬虫基本知识
Mar 05 Python
transform python环境快速配置方法
Sep 27 Python
Python实现查找数组中任意第k大的数字算法示例
Jan 23 Python
Python Django 前后端分离 API的方法
Aug 28 Python
Python多线程获取返回值代码实例
Feb 17 Python
Django调用支付宝接口代码实例详解
Apr 04 Python
OpenCV图片漫画效果的实现示例
Aug 18 Python
Python 开发工具通过 agent 代理使用的方法
Sep 27 Python
彻底弄懂Python中的回调函数(callback)
Jun 25 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 curl 上传文件代码实例
2015/04/27 PHP
Smarty分页实现方法完整实例
2016/05/11 PHP
使用git迁移Laravel项目至新开发环境的步骤详解
2020/04/06 PHP
详解new function(){}和function(){}() 区别分析
2008/03/22 Javascript
ajax 同步请求和异步请求的差异分析
2011/07/04 Javascript
几种设置表单元素中文本输入框不可编辑的方法总结
2013/11/25 Javascript
jquery动态添加元素事件失效问题解决方法
2014/05/23 Javascript
javascript十六进制及二进制转化的方法
2015/05/06 Javascript
js实现兼容性好的微软官网导航下拉菜单效果
2015/09/07 Javascript
iscroll.js的上拉下拉刷新时无法回弹的解决方法
2016/02/18 Javascript
BootStrap的弹出框(Popover)支持鼠标移到弹出层上弹窗层不隐藏的原因及解决办法
2016/04/03 Javascript
全国省市二级联动下拉菜单 js版
2016/05/10 Javascript
详解Vue中使用v-for语句抛出错误的解决方案
2017/05/04 Javascript
微信小程序实现tab和swiper切换结合效果
2020/07/17 Javascript
JavaScript数组排序reverse()和sort()方法详解
2017/12/24 Javascript
Vue自定义toast组件的实例代码
2018/08/15 Javascript
深入理解 Koa 框架中间件原理
2018/10/18 Javascript
微信小程序页面间值传递的两种方法
2018/11/26 Javascript
使用layui监听器监听select下拉框,事件绑定不成功的解决方法
2019/09/28 Javascript
python中list循环语句用法实例
2014/11/10 Python
简化Python的Django框架代码的一些示例
2015/04/20 Python
tensorflow训练中出现nan问题的解决
2018/02/10 Python
详解Python 数据库的Connection、Cursor两大对象
2018/06/25 Python
django页面跳转问题及注意事项
2019/07/18 Python
python yield关键词案例测试
2019/10/15 Python
python闭包、深浅拷贝、垃圾回收、with语句知识点汇总
2020/03/11 Python
移动通信行业实习自我鉴定
2013/09/28 职场文书
自荐信要包含哪些内容
2013/11/06 职场文书
国贸类专业毕业生的求职信分享
2013/12/08 职场文书
工程技术员岗位职责
2014/03/02 职场文书
法人授权委托书范本
2014/04/04 职场文书
初三毕业评语
2014/12/26 职场文书
总经理检讨书范文
2015/02/16 职场文书
2015年社区科普工作总结
2015/05/13 职场文书
react中的DOM操作实现
2021/06/30 Javascript
vue实现在data里引入相对路径
2022/06/05 Vue.js