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的chardet库获得文件编码并修改编码
Jan 22 Python
python类的继承实例详解
Mar 30 Python
Django视图和URL配置详解
Jan 31 Python
TensorFlow高效读取数据的方法示例
Feb 06 Python
python使用numpy读取、保存txt数据的实例
Oct 14 Python
python elasticsearch从创建索引到写入数据的全过程
Aug 04 Python
python 3.8.3 安装配置图文教程
May 21 Python
Tensorflow使用Anaconda、pycharm安装记录
Jul 29 Python
python3环境搭建过程(利用Anaconda+pycharm)完整版
Aug 19 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
Jan 28 Python
Python面向对象之内置函数相关知识总结
Jun 24 Python
Python使用mitmproxy工具监控手机 下载手机小视频
Apr 18 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合并两个数组的两种方式的异同
2012/09/14 PHP
php中AES加密解密的例子小结
2014/02/18 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
jQuery DIV弹出效果实现代码
2009/07/03 Javascript
jQuery对象与DOM对象之间的转换方法
2010/04/15 Javascript
dreamweaver 安装Jquery智能提示
2011/04/02 Javascript
浅析Js中的单引号与双引号问题
2013/11/06 Javascript
优化Jquery,提升网页加载速度
2013/11/14 Javascript
jquery解析XML字符串和XML文件的方法说明
2014/02/21 Javascript
AngularJs Dependency Injection(DI,依赖注入)
2016/09/02 Javascript
几句话带你理解JS中的this、闭包、原型链
2016/09/26 Javascript
JS实现淡入淡出图片效果的方法分析
2016/12/20 Javascript
JS编写兼容IE6,7,8浏览器无缝自动轮播
2018/10/12 Javascript
echarts 使用formatter 修改鼠标悬浮事件信息操作
2020/07/20 Javascript
Vue页面跳转传递参数及接收方式
2020/09/09 Javascript
django model去掉unique_together报错的解决方案
2016/10/18 Python
Python实现抓取网页生成Excel文件的方法示例
2017/08/05 Python
快速了解Python中的装饰器
2018/01/11 Python
详解Python核心对象类型字符串
2018/02/11 Python
python实战教程之自动扫雷
2018/07/13 Python
python使用pdfminer解析pdf文件的方法示例
2018/12/20 Python
python将处理好的图像保存到指定目录下的方法
2019/01/10 Python
利用ctypes获取numpy数组的指针方法
2019/02/12 Python
pandas 缺失值与空值处理的实现方法
2019/10/12 Python
pytorch对梯度进行可视化进行梯度检查教程
2020/02/04 Python
Keras实现DenseNet结构操作
2020/07/06 Python
购买瑞典当代设计的腕表和太阳眼镜:TRIWA
2016/10/30 全球购物
波兰数码相机及配件网上商店: Cyfrowe.pl
2017/06/19 全球购物
马来西亚最热门的在线时尚商店:FashionValet
2018/11/11 全球购物
英文版销售经理个人求职信
2013/11/20 职场文书
食品安全工作实施方案
2014/03/26 职场文书
《长江之歌》教学反思
2014/04/17 职场文书
2015年度个人思想工作总结
2015/04/08 职场文书
2020年元旦祝福语录,总有适合你的
2019/12/31 职场文书
浅谈MySQL next-key lock 加锁范围
2021/06/07 MySQL
Java十分钟精通进阶适配器模式
2022/04/06 Java/Android