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程序员开发中常犯的10个错误
Jul 07 Python
Python日期的加减等操作的示例
Aug 15 Python
Python中的Numpy矩阵操作
Aug 12 Python
Python+selenium 获取浏览器窗口坐标、句柄的方法
Oct 14 Python
python实现简单登陆系统
Oct 18 Python
OpenCV搞定腾讯滑块验证码的实现代码
May 18 Python
Django框架 信号调度原理解析
Sep 04 Python
postman传递当前时间戳实例详解
Sep 14 Python
自适应线性神经网络Adaline的python实现详解
Sep 30 Python
tf.concat中axis的含义与使用详解
Feb 07 Python
python list等分并从等分的子集中随机选取一个数
Nov 16 Python
详解Python 中的 defaultdict 数据类型
Feb 22 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
cache_lite试用
2007/02/14 PHP
php关于array_multisort多维数组排序的使用说明
2011/01/04 PHP
浅析php插件 Simple HTML DOM 用DOM方式处理HTML
2013/07/01 PHP
php微信开发之批量生成带参数的二维码
2016/06/26 PHP
PHP实现的激活用户注册验证邮箱功能示例
2017/06/06 PHP
PHP面向对象五大原则之里氏替换原则(LSP)详解
2018/04/08 PHP
php基于Redis消息队列实现的消息推送的方法
2018/11/28 PHP
jQuery 各种浏览器下获得日期区别
2008/12/22 Javascript
jquery cookie实现的简单换肤功能适合小网站
2013/08/25 Javascript
使用jquery.validate自定义方法实现&quot;手机号码或者固话至少填写一个&quot;的逻辑验证
2014/09/01 Javascript
超棒的响应式布局jQuery插件Freetile.js
2014/11/17 Javascript
jquery实现鼠标拖拽滑动效果来选择数字的方法
2015/05/04 Javascript
Javascript vue.js表格分页,ajax异步加载数据
2016/10/24 Javascript
Jquery Easyui菜单组件Menu使用详解(15)
2016/12/18 Javascript
ES6中Proxy代理用法实例浅析
2017/04/06 Javascript
JS 验证密码 不能为空,必须含有数字、字母、特殊字符,长度在8-12位
2017/06/21 Javascript
JS简单实现点击跳转登陆邮箱功能的方法
2017/10/31 Javascript
实现单层json按照key字母顺序排序的示例
2017/12/06 Javascript
JavaScript设计模式之单例模式简单实例教程
2018/07/02 Javascript
vue-cli 构建骨架屏的方法示例
2018/11/08 Javascript
jquery无缝图片轮播组件封装
2020/11/25 jQuery
了解JavaScript中的选择器
2019/05/24 Javascript
python自然语言编码转换模块codecs介绍
2015/04/08 Python
Python实现的简单算术游戏实例
2015/05/26 Python
python实现web方式logview的方法
2015/08/10 Python
python3+PyQt5实现支持多线程的页面索引器应用程序
2018/04/20 Python
css3翻牌翻数字的示例代码
2020/02/07 HTML / CSS
荟萃全球保健品:维他购
2018/05/09 全球购物
雅诗兰黛加拿大官网:Estee Lauder加拿大
2019/07/31 全球购物
泰海淘:泰国king Power王权免税集团旗下跨境海淘综合型电商
2020/07/26 全球购物
四好少年事迹材料
2014/01/12 职场文书
军人违纪检讨书
2014/02/04 职场文书
房屋过户委托书范本
2014/10/07 职场文书
2014年学校总务处工作总结
2014/12/08 职场文书
《曹冲称象》教学反思
2016/02/20 职场文书
python中pandas对多列进行分组统计的实现
2021/06/18 Python