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 相关文章推荐
linux系统使用python获取内存使用信息脚本分享
Jan 15 Python
python对配置文件.ini进行增删改查操作的方法示例
Jul 28 Python
用Python实现数据的透视表的方法
Nov 16 Python
带你认识Django
Jan 15 Python
对Python3中列表乘以某一个数的示例详解
Jul 20 Python
python 环境搭建 及python-3.4.4的下载和安装过程
Jul 20 Python
pytorch 输出中间层特征的实例
Aug 17 Python
Series和DataFrame使用简单入门
Nov 13 Python
Python图像处理库PIL的ImageGrab模块介绍详解
Feb 26 Python
Python优秀开源项目Rich源码解析的流程分析
Jul 06 Python
Python3爬虫中pyspider的安装步骤
Jul 29 Python
python基础之错误和异常处理
Oct 24 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+mysql来做一个功能强大的在线计算器
2010/10/12 PHP
php 按指定元素值去除数组元素的实现方法
2011/11/04 PHP
在win系统安装配置 Memcached for PHP 5.3 图文教程
2015/03/03 PHP
thinkPHP2.1自定义标签库的导入方法详解
2016/07/20 PHP
PHP 根据key 给二维数组分组
2016/12/09 PHP
PHP新特性之字节码缓存和内置服务器
2017/08/11 PHP
PHP使用PDO调用mssql存储过程的方法示例
2017/10/07 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
用js解决数字不能换行问题
2010/08/10 Javascript
根据IP的地址,区分不同的地区,查看不同的网站页面的js代码
2013/02/26 Javascript
jQuery ajax MD5实现用户注册即时验证功能
2016/10/11 Javascript
js实现界面向原生界面发消息并跳转功能
2016/11/22 Javascript
JavaScript实现图片拖曳效果
2017/09/08 Javascript
Javascript 严格模式use strict详解
2017/09/16 Javascript
重学 JS:为啥 await 不能用在 forEach 中详解
2019/04/15 Javascript
VUE+node(express)实现前后端分离
2019/10/13 Javascript
[50:59]2018DOTA2亚洲邀请赛 4.7 总决赛 LGD vs Mineski第四场
2018/04/10 DOTA
Python闭包实现计数器的方法
2015/05/05 Python
解决Python中导入自己写的类,被划红线,但不影响执行的问题
2020/07/13 Python
Python ellipsis 的用法详解
2020/11/20 Python
你正在寻找的CSS3 动画技术
2011/07/27 HTML / CSS
CSS3 icon font完全指南(CSS3 font 会取代icon图标)
2013/01/06 HTML / CSS
使用CSS3实现圆角,阴影,透明
2014/12/23 HTML / CSS
Bonprix法国:时尚、鞋子、家居
2020/12/29 全球购物
网络通讯中,端口有什么含义,端口的取值范围
2012/11/23 面试题
教育课题研究自我鉴定范文
2013/12/28 职场文书
火灾现场处置方案
2014/05/28 职场文书
群众路线剖析材料(四风问题)
2014/10/08 职场文书
幼儿园教师师德承诺书
2015/04/28 职场文书
小学德育工作总结2015
2015/05/12 职场文书
写作技巧:怎样写好一份优秀工作总结?
2019/08/14 职场文书
发工资啦!教你用Python实现邮箱自动群发工资条
2021/05/10 Python
Python django中如何使用restful框架
2021/06/23 Python
抖音动画片,皮皮虾,《治愈系》动画在用这首REMIX作为背景音乐,Anak ,The last world with you完整版
2022/03/16 杂记
DIY胆机必读:各国电子管评价
2022/04/06 无线电
Python实现视频自动打码的示例代码
2022/04/08 Python