新闻详情

新闻详情

首页 / 资讯中心 / 详情

yield与yieldfrom:迭代器的魔法之匙

发布时间:2026/9/28 4:40:14来源:尧图网络
yield与yieldfrom:迭代器的魔法之匙
yield和yield from用法迭代器()讲到迭代器就需要区别几个概念, , , 看着都差不多其实不然。下面区分一下。凡是能够用来作用于for循环的对象, 它们都属于一种类型, 凡是能够用来作用于next()函数的对象, 它们也同样属于一种这样的类型, 这两种类型表示的是一个惰性的计算序列集合, 至于如list、dict、str这样的常见数据类型来说, 它们并不直接是上述两种类型, 但是可以通过调用iter()函数来获取一个具备相关功能的对象。yield这个函数会在每次有人去调用它里面的next()方法的时候, 实际地去执行起来。要是碰到了yield这一句语句, 那么它就会停止当前的运行并且把结果返回给调用者, 而当下一次再进来的时候, 它会紧接着从上一步返回的那个yield语句的具体位置开始接着往后执行下去。有一点是需要给大家一下的, 就是异常的产生, 它意味着生成器对象的生命周期已经彻底结束了。所以说一旦产生了某种异常呢在生成器方法后续去执行的语句当中就绝对不允许出现yield语句了不然的话就会产生一些莫名其妙的问题哦。yield fromdef g(x):yield from range(x , 0, -1)yield from range(x)print(list(g(5)))def accumulate(): #子生成器tally 0while True:next yieldif next is None:return tallytally tally nextdef gather_tallies(tallies):while True:tally yield from accumulate()tallies.append(tally)tallies []acc gather_tallies(tallies)next(acc) # 激活生成器for i in range(4):acc.send(i)acc.send(None) # 结束for i in range(5):acc.send(i)acc.send(None)print(tallies)def reader():# 模拟从文件读取数据的生成器for i in range(4):yield ***{}***.format(i)def reader_wrapper(g):# 循环迭代从reader产生的数据for v in g:yield vwrap reader_wrapper(reader())for i in wrap:print(i)# 输出结果***1******2******3******4***咱们能够通过运用yield from这般的语句, 来对位于函数g当中的那些循环执行部分实施对应的代替操作, 其所呈现出来的具体效果, 与直接使用原始的方式是完全一致的, 这一点需要大家明确知道。def writer():# 读取send传进的数据并模拟写进套接字或文件while True:w (yield) #w接收send传进的数据print(, w)def writer_wrapper(coro1):coro1.send(None) #生成器准备好接收数据while True:try:x (yield) # x接收send传进的数据coro1.send(x) #然后将x在send给writer子生成器except StopIteration: #处理子生成器返回的异常pass# 包装器也是个生成器上面所有复杂的写法也可以用yield from替换def writer_wrapper(coro2):yield from coro2class SpamException(Exception):passdef writer():while True:try:w (yield)except SpamException:print(***)else:print(, w)def writer_wrapper(coro1):# 手工处理异常被抛给子生成器coro1.send(None) # 生成器准备好接收数据while True:try:try:x (yield)except Exception as e: #捕获异常coro1.throw(e)else:coro1.send(x)except StopIteration:passw writer()wrap writer_wrapper(w)wrap.send(None) # prime the coroutinefor i in [0, 1, 2, spam, 4]:if i spam:wrap.throw(SpamException)else:wrap.send(i)# 同样的可以把writer_wrapper方法协成def writer_wrapper(coro):yield from coro看到这个地方, 你大体上可以弄明白, 关于把传递过去的值送进子生成器, 还有把异常扔回给子生成器, 这其中的意思是什么了。总而言之, 这个东西被叫做魔法语句, 它同时也是构成协成的一份子, 而关于协成的详细情况, 还得往后接着学。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

PON全光网络深度解析:从GPON到XG-PON的配置与排障实战 2026/9/28 5:44:18

PON全光网络深度解析:从GPON到XG-PON的配置与排障实战

以前给朋友排查宽带问题,发现一个挺普遍的现象:家里明明升级了千兆宽带,光猫也换成了千兆口,可一到晚上用网高峰,测速还是跑不满,游戏延迟忽高忽低。路由器换了好几台,网线也全部换成六类线&…

阅读更多 →
做app网站需要什么条件:5万块避坑,拒绝被黑挂马 2026/9/28 5:44:18

做app网站需要什么条件:5万块避坑,拒绝被黑挂马

做app网站需要什么条件:5万块避坑,拒绝被黑挂马 上周一个做跨境电商的朋友半夜给我打电话,声音都劈了。他那个刚上线不到一周的官网,首页突然变成了一片黑色,中间跳出一行血红色的字:“你的服务器已中毒,点击购买解药”。后台更是乱成一锅粥,数据…

阅读更多 →
Emacs核心能力拆解:从Lisp到org-mode,打造高效文本处理工作流 2026/9/28 5:44:18

Emacs核心能力拆解:从Lisp到org-mode,打造高效文本处理工作流

如果你点进这篇文章,说明你多半已经听人提过 Emacs,或者正处在“想认真挑一个编辑器”的十字路口。再直白一点,你可能真的好奇:在 VS Code、Cursor、Jupyter 满天飞的 2020 年代,为什么还有人抱着一个 1980 年代诞生的…

阅读更多 →
一人创业工具链怎么搭?用 TaoToken 统一 Key 打通内容、开发与客户跟进 2026/9/28 5:44:18

一人创业工具链怎么搭?用 TaoToken 统一 Key 打通内容、开发与客户跟进

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
工作流核心原理与AI工作流实战:从节点要素到工具选型 2026/9/28 5:44:18

工作流核心原理与AI工作流实战:从节点要素到工具选型

工作流,Workflow,这个名词这几年几乎随处可见。不管你是后端工程师、运营、设计师,还是做跨境电商,总能听到“搭一个工作流”“把流程做成 workflow”的说法。尤其是 AI 工作流爆火之后,Dify、Coze、n8n、ComfyUI 这些…

阅读更多 →
电池健康度模型实战:从充放电曲线到SOH预测器 2026/9/28 5:44:11

电池健康度模型实战:从充放电曲线到SOH预测器

简介:这份资源围绕锂离子电池健康度(SOH)估算展开,利用神经网络与实测数据集训练电池老化模型,适合计算机、人工智能、自动化、电子信息等专业的在校学生、教师及企业员工学习,也可作为毕设、课程设计或项目…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉