python 生成器协程运算实例

发布时间 - 2026-01-11 03:06:08    点击率:

一、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 协程中的迭代器  # 生成器原理及应用实例详解  # python生成器/yield协程/gevent写简单的图片下载器功能示例  # 基于python生成器封装的协程类  # python学习之可迭代对象、迭代器、生成器  # python 生成器需注意的小问题  # 浅谈Python中的生成器和迭代器  # 详解Python生成器和基于生成器的协程  # 来了  # 搬到  # 两件  # 给大家  # 当我们  # 的是  # 是个  # 我们可以  # 只会  # 希望能  # 如果没有  # 会给  # 这篇  # 能给  # 转换成  # 才可  # 转换为  # 小编  # 说成  # 大家多多 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  Laravel如何使用Gate和Policy进行授权?(权限控制)  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  公司网站制作需要多少钱,找人做公司网站需要多少钱?  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  如何快速查询网站的真实建站时间?  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  中山网站制作网页,中山新生登记系统登记流程?  如何在阿里云购买域名并搭建网站?  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  如何在阿里云香港服务器快速搭建网站?  Laravel Fortify是什么,和Jetstream有什么关系  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  实例解析Array和String方法  Laravel如何使用Collections进行数据处理?(实用方法示例)  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  如何在IIS中新建站点并解决端口绑定冲突?  Laravel如何实现API速率限制?(Rate Limiting教程)  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  Python自动化办公教程_ExcelWordPDF批量处理案例  如何在Windows虚拟主机上快速搭建网站?  智能起名网站制作软件有哪些,制作logo的软件?  Laravel观察者模式如何使用_Laravel Model Observer配置  Python图片处理进阶教程_Pillow滤镜与图像增强  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  javascript日期怎么处理_如何格式化输出  微信小程序 配置文件详细介绍  非常酷的网站设计制作软件,酷培ai教育官方网站?  创业网站制作流程,创业网站可靠吗?  jQuery validate插件功能与用法详解  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  Laravel怎么在Blade中安全地输出原始HTML内容  Laravel如何实现多对多模型关联?(Eloquent教程)  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  详解CentOS6.5 安装 MySQL5.1.71的方法  Python文件流缓冲机制_IO性能解析【教程】  网站建设整体流程解析,建站其实很容易!  新三国志曹操传主线渭水交兵攻略  怎么用AI帮你设计一套个性化的手机App图标?  Laravel如何升级到最新版本?(升级指南和步骤)