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判断端口是否打开的实现代码
Feb 10 Python
python访问sqlserver示例
Feb 10 Python
Python中使用socket发送HTTP请求数据接收不完整问题解决方法
Feb 04 Python
Python 的 Socket 编程
Mar 24 Python
Python使用正则表达式获取网页中所需要的信息
Jan 29 Python
用Python编写一个简单的CS架构后门的方法
Nov 20 Python
手把手教你如何安装Pycharm(详细图文教程)
Nov 28 Python
PyQt5实现五子棋游戏(人机对弈)
Mar 24 Python
Pycharm 2019 破解激活方法图文详解
Oct 11 Python
python循环嵌套的多种使用方法解析
Nov 29 Python
如何利用Python给自己的头像加一个小国旗(小月饼)
Oct 02 Python
python Tkinter的简单入门教程
Apr 11 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 向访客和爬虫显示不同的内容
2009/11/09 PHP
php下连接mssql2005的代码
2011/01/17 PHP
php设置session值和cookies的学习示例
2014/03/21 PHP
关于PHP5.6+版本“No input file specified”问题的解决
2019/12/11 PHP
jquery动态加载js三种方法实例
2013/08/03 Javascript
jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮
2013/10/11 Javascript
深入理解JSON数据源格式
2014/01/10 Javascript
JavaScript操作cookie类实例
2015/03/31 Javascript
JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
2015/11/06 Javascript
jQuery Validate插件实现表单强大的验证功能
2015/12/18 Javascript
动态生成的DOM不会触发onclick事件的原因及解决方法
2016/08/06 Javascript
JS对象深度克隆实例分析
2017/03/16 Javascript
Vue.js实例方法之生命周期详解
2017/07/03 Javascript
使用pm2部署node生产环境的方法步骤
2019/03/09 Javascript
使用Vue.observable()进行状态管理的实例代码详解
2019/05/26 Javascript
jQuery设置下拉框显示与隐藏效果的方法分析
2019/09/15 jQuery
SpringBoot+Vue 前后端合并部署的配置方法
2020/12/30 Vue.js
[02:12]2015国际邀请赛 SHOWOPEN
2015/08/05 DOTA
Python使用剪切板的方法
2017/06/06 Python
python通过微信发送邮件实现电脑关机
2018/06/20 Python
Python-Seaborn热图绘制的实现方法
2019/07/15 Python
pytorch 实现模型不同层设置不同的学习率方式
2020/01/06 Python
Python3的socket使用方法详解
2020/02/18 Python
全网最全python库selenium自动化使用详细教程
2021/01/12 Python
AmazeUI 面板的实现示例
2020/08/17 HTML / CSS
俄罗斯厨房产品购物网站:COOK HOUSE
2021/03/15 全球购物
试述DBMS的主要功能
2016/11/13 面试题
干部行政关系介绍信
2014/01/17 职场文书
《兰亭集序》教学反思
2014/02/11 职场文书
幼儿园安全责任书
2014/04/14 职场文书
2014年技术部工作总结
2014/12/12 职场文书
中标通知书
2015/04/17 职场文书
昆虫记读书笔记
2015/06/26 职场文书
商务宴会祝酒词
2015/08/11 职场文书
李清照的诗词赏析(20首)
2019/08/22 职场文书
在虚拟机中安装windows server 2008的图文教程
2022/06/28 Servers