python 生成器协程运算实例
作者:Bigberg 发布时间:2021-11-22 05:27:51
标签:python,生成器,协程
一、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搬进仓库了。
来源:http://www.cnblogs.com/bigberg/p/6714598.html
0
投稿
猜你喜欢
- 前提搭建钉钉应答机器人,需要先准备或拥有以下权限:钉钉企业的管理员或子管理员(如果不是企业管理员,可以自己创建一个企业,很方便的)有公网通信
- skimage包的exposure模块图像亮度与对比度的调整,是放在skimage包的exposure模块里面1、gamma调整对原图像的像
- 简介CSS Sprites并没有一个确定的中文翻译,通常被意译为“CSS图像拼合”或“CSS贴图定位”。CSS Sprites并不是一门新技
- 学习目的:掌握下拉列表框的用法,并理解AutoPostBack属性; 理解IsPoskBack及用法; 初识DataTable的
- 之前用Crystal做了一个数字转English Word的Formula刚刚心血来潮, 大半个晚上写了JS版本的数字转换, 由于JS的Bu
- 1.安装Apache 在终端中输入下面的命令就可以安装Apache了:sudo yum install httpdsudo的意思是
- 网站设计似乎朝着越来越复杂的方向发展。这部分源于显示器的逐步增大,随着宽屏显示器的增多,更有加剧网站页面复杂程度的趋势。但是我接触网站设计近
- 前言本文主要介绍的是基于centos7进行yum安装lnmp(linux+nginx+php7.1+mysql5.7)的相关教程,文中将一步
- 现在大家都在讨论Web2.0 ,大家都在搞用户行为前端设计,现在注册一个ID一般只需要几秒钟,站长期望其产生高价值的UGC,形成一个只需要审
- 使用ewebeditor作为后台编辑器时,尤其是一个页面中使用多次该编辑器时,在提交数据时,可能会遇到数据被重复提交的情况。搜索找来一些解决
- 本文为大家分享了python数据分析数据标准化及离散化的具体内容,供大家参考,具体内容如下标准化1、离差标准化是对原始数据的线性变换,使结果
- 认为整理的还比较详细的,亲们,就快点收藏起来吧!PHP系统类函数assert函数:检查assertion声明是否错误extension_lo
- asp网站程序在国内运用很广,但是类似于im286.asp?id=20050307213811这样的url有点不利于搜索引擎的收录,也就是说
- 今年年初,新一季的《最强大脑》开播了,第一集选拔的时候大家做了一个数字游戏,名叫《数字华容道》,当时何猷君以二十几秒的成绩夺得该项目的冠军,
- 一、避免Firefox 背景图不显示的兼容问题,定义background 属性,先后顺序不能随意变动。background : backgr
- 需求说明当用户申请售后,商家未在n小时内处理,系统自动进行退款。商家拒绝后,用户可申请客服介入,客服x天内超时未处理,系统自动退款。用户收到
- 复制目录: 包含多层子目录方法: 递归, 深度遍历,广度遍历深度遍历&广度遍历:思路:1.获得源目录子级目录,并设置目标目录的子级路
- 打开php.ini,首先找到;;;;;;;;;;;;;;;;; file uploads ;;;;;;;;;;;;;;;;;区域,有影响文件
- 想查找mac下python的site-packages目录,如果用网上搜的安装目录之类的去找,进去每一层很多都是软链接形式存在,比较浪费时间
- 我们有时候希望回车键敲在文本框(input element)里来提交表单(form),但有时候又不希望如此。比如搜索行为,希望输入完关键词之