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使用marshal模块序列化实例
Sep 25 Python
Python中time模块与datetime模块在使用中的不同之处
Nov 24 Python
TensorFlow在MAC环境下的安装及环境搭建
Nov 14 Python
Python实现一个Git日志统计分析的小工具
Dec 14 Python
Flask Web开发入门之文件上传(八)
Aug 17 Python
对python实现合并两个排序链表的方法详解
Jan 23 Python
python logging模块书写日志以及日志分割详解
Jul 22 Python
python求最大公约数和最小公倍数的简单方法
Feb 13 Python
Python动态导入模块和反射机制详解
Feb 18 Python
解决echarts中饼图标签重叠的问题
May 16 Python
解决Keras 中加入lambda层无法正常载入模型问题
Jun 16 Python
Django rest framework分页接口实现原理解析
Aug 21 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
二次元帅气男生排行榜,只想悄悄收藏系列
2020/03/04 日漫
PHP变量赋值、代入给JavaScript中的变量
2015/06/29 PHP
Joomla实现组件中弹出一个模式(modal)窗口的方法
2016/05/04 PHP
PHP运行模式汇总
2016/11/06 PHP
PHP延迟静态绑定的深入讲解
2018/04/02 PHP
用JS控制回车事件的代码
2011/02/20 Javascript
jquery.cookie.js 操作cookie实现记住密码功能的实现代码
2011/04/27 Javascript
jQuery插件开发详细教程
2014/06/06 Javascript
javascript刷新父页面的各种方法汇总
2014/09/03 Javascript
如何用JS判断两个数字的大小
2016/07/21 Javascript
浅谈js中子页面父页面方法 变量相互调用
2016/08/04 Javascript
jquery网页日历显示控件calendar3.1使用详解
2016/11/24 Javascript
canvas实现动态小球重叠效果
2017/02/06 Javascript
Javascript中 toFixed四舍六入方法
2017/08/21 Javascript
解决vue中无法动态修改jqgrid组件 url地址的问题
2018/03/01 Javascript
动态加载、移除js/css文件的示例代码
2018/03/20 Javascript
Vue框架里使用Swiper的方法示例
2018/09/20 Javascript
在vue中对数组值变化的监听与重新响应渲染操作
2020/07/17 Javascript
angular8.5集成TinyMce5的使用和详细配置(推荐)
2020/11/16 Javascript
详解Python pygame安装过程笔记
2017/06/05 Python
python实现对excel进行数据剔除操作实例
2017/12/07 Python
Django 使用Ajax进行前后台交互的示例讲解
2018/05/28 Python
Python 异常的捕获、异常的传递与主动抛出异常操作示例
2019/09/23 Python
python闭包、深浅拷贝、垃圾回收、with语句知识点汇总
2020/03/11 Python
python logging模块的使用
2020/09/07 Python
PyCharm2020最新激活码+激活码补丁(亲测最新版PyCharm2020.2激活成功)
2020/11/25 Python
Python 爬取淘宝商品信息栏目的实现
2021/02/06 Python
巴西Mr. Cat在线商店:购买包包和鞋子
2019/09/08 全球购物
大学系主任推荐信范文
2013/12/24 职场文书
社区敬老月活动实施方案
2014/02/17 职场文书
送餐员岗位职责范本
2014/02/21 职场文书
大学新生军训感言
2014/02/25 职场文书
小学社团活动总结
2014/06/27 职场文书
企业愿景口号
2015/12/25 职场文书
Java Socket实现多人聊天系统
2021/07/15 Java/Android
忘记Grafana不要紧2种Grafana重置admin密码方法详细步骤
2022/04/07 Servers