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 base64 decode incorrect padding错误解决方法
Jan 08 Python
Python抓取淘宝下拉框关键词的方法
Jul 08 Python
Python实现多线程抓取妹子图
Aug 08 Python
django 修改server端口号的方法
May 14 Python
python+selenium 定位到元素,无法点击的解决方法
Jan 30 Python
[机器视觉]使用python自动识别验证码详解
May 16 Python
python 列表转为字典的两个小方法(小结)
Jun 28 Python
Python3 执行系统命令并获取实时回显功能
Jul 09 Python
python3-flask-3将信息写入日志的实操方法
Nov 12 Python
python判断两个序列的成员是否一样的实例代码
Mar 01 Python
Python try except异常捕获机制原理解析
Apr 18 Python
Django2.1.7 查询数据返回json格式的实现
Dec 29 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 高性能书写
2010/12/11 PHP
php基于socket实现SMTP发送邮件的方法
2015/03/05 PHP
PHP使用SWOOLE扩展实现定时同步 MySQL 数据
2017/04/09 PHP
深入理解PHP+Mysql分布式事务与解决方案
2020/12/03 PHP
javascript实现 在光标处插入指定内容
2007/05/25 Javascript
如何让页面在打开时自动刷新一次让图片全部显示
2012/12/17 Javascript
javascript使用smipleChart实现简单图表
2015/01/02 Javascript
js实现图片从左往右渐变切换效果的方法
2015/02/06 Javascript
js window对象属性和方法相关资料整理
2015/11/11 Javascript
BootStrap+Angularjs+NgDialog实现模式对话框
2016/08/24 Javascript
移动端脚本框架Hammer.js
2016/12/15 Javascript
Vue 过渡(动画)transition组件案例详解
2017/01/22 Javascript
js继承的这6种方式!(上)
2019/04/23 Javascript
vue2.x 对象劫持的原理实现
2020/04/19 Javascript
JS实现页面鼠标点击出现图片特效
2020/08/19 Javascript
JS如何判断对象是否包含某个属性
2020/08/29 Javascript
[00:13]天涯墨客二技能展示
2018/08/25 DOTA
[01:32]完美世界DOTA2联赛10月29日精彩集锦
2020/10/30 DOTA
Windows和Linux下Python输出彩色文字的方法教程
2017/05/02 Python
python学习必备知识汇总
2017/09/08 Python
python 自定义装饰器实例详解
2019/07/20 Python
python Dijkstra算法实现最短路径问题的方法
2019/09/19 Python
TensorFLow 不同大小图片的TFrecords存取实例
2020/01/20 Python
基于pygame实现童年掌机打砖块游戏
2020/02/25 Python
Python bytes string相互转换过程解析
2020/03/05 Python
jupyter notebook 的工作空间设置操作
2020/04/20 Python
基于python实现对文件进行切分行
2020/04/26 Python
CSS3 text-shadow实现文字阴影效果
2016/02/24 HTML / CSS
mui几种页面跳转方式对比总结概括
2017/08/18 HTML / CSS
Vision Directa智利眼镜网:框架眼镜、隐形眼镜和名牌太阳眼镜
2016/11/23 全球购物
车贷收入证明范本
2014/01/09 职场文书
市场营销方案范文
2014/03/11 职场文书
征兵宣传标语
2014/06/20 职场文书
人事主管岗位职责说明书
2014/07/30 职场文书
MySQL 聚合函数排序
2021/07/16 MySQL
javascript条件式访问属性和箭头函数介绍
2021/11/17 Javascript