分享好友 资讯首页 资讯分类 切换频道
编写高质量Python (第33条) 通过 yield from 把多个生成器连起来用
2024-12-25 03:22  浏览:53

第 33 条 通过 yield from 把多个生成器连起来用

​ 生成器有很多好处(参见第 30 条,而且能够解决许多常见的问题(参见第 31 条)。生成器的用途特别广,所以很多程序都会频繁使用它们,而且是一个连着一个地用。

​ 例如,我们要编写一个图形程序,让它在屏幕上面移动图像,从而形成动画效果。假如要实现这样一段动画:图片先快速移动一段时间,然后暂停,接下来慢速移动一段时间。为了把移动与暂停表示出来,笔者定义了下面两个生成器函数,让它们分别给出图片在当前时间段内应该保持的速度。

 

​ 为了把完整的动画制作出来,需要将 move 与 pause 连起来使用,从而算出这张图片当前的位置与上一个位置之差。下面的函数用三个 for 循环来表示动画的三个环节,在每个环节里,它都通过 yield 把图片当前的位置与上一次的位置之差 delta 返回给调用者。根据 animate 函数返回的 delta 值,即可把整段动画做好。

 

​ 接下来,我们就根据 animate 生成器所给出的 delta 值,把整个动画效果渲染出来。

 

​ 这种写法的问题在于,animate 函数里面有很多重复的地方。比如它反复使用 for 结构来操纵生成器,而且每个 for 结构都使用相同的 yield 表达式,这样看起来很啰嗦。这个例子仅仅用了三个生成器,就让代码变得如此烦琐,若是动画里面有十几或几十个环节,那么代码读起来会更加困难。

​ 为了解决这个问题,我们可以改用 yield from 形式的表达式来实现。这种形式,会先从嵌套进去的小生成器里面取值,如果生成器已经用完,那么程序的控制流程会回到 yield from 这个函数中,然后它有可能进入下一套 yield from 逻辑。下面这段代码,用 yield from 语句重新实现了 animate 函数。

 

​ 它的运行结果与刚才一样,但是代码看起来更清晰、更直观了。Python 解释器看到 yield from 形式的表达式后,会自己想办法实现带有普通 yield 语句的 for 循环相同的效果,而且这种实现方式要更快。下面采用内置的 timeit 模块编写并运行一个 mirco-benchmark 试试。

​ 它的运行结果和刚才一样,但是代码看起来更清晰、更直观了。Python 解释器看到 yield from 形式的表达式后,会自己想办法实现与带有普通 yield 语句的 for 循环相同的结果,而且这种实现方式要更快。下面采用内置的 timeit 模块编写并运行一个 micro-benchmark 试试。

    以上就是本篇文章【编写高质量Python (第33条) 通过 yield from 把多个生成器连起来用】的全部内容了,欢迎阅览 ! 文章地址:http://w.yusign.com/news/3546.html 
     资讯      企业新闻      行情      企业黄页      同类资讯      首页      网站地图      返回首页 述古往 http://w.yusign.com/mobile/ , 查看更多   
最新新闻
小花分期统一客服电话-小花分期人工客服服务热线电话
小花分期全国人工24小时客服电话;00861-52707-22671,二线:00861-78796-93757—请注意,在拨打客服电话时,请保持耐心并详细描
悦分期全国客服电话是多少-悦分期强制下款怎么解决
悦分期全国人工24小时客服电话;00861-52707-22671,二线:00861-78796-93757—请注意,在拨打客服电话时,请保持耐心并详细描述
广源优品全国客服电话是多少-广源优品强制下款怎么解决
广源优品全国人工24小时客服电话;00861-52707-22671,二线:00861-78796-93757—请注意,在拨打客服电话时,请保持耐心并详细描
广源优品全国客服电话是多少-广源优品强制下款怎么解决
获取全网一手热点首页新闻无障碍金融街论坛丨持续提升巨灾保险保障水平2024金融街论坛年会观察v新华网2024年10月21日15:25北京新
众享贷全国客服电话是多少-众享贷强制下款怎么解决
获取全网一手热点首页新闻无障碍金融街论坛丨持续提升巨灾保险保障水平2024金融街论坛年会观察v新华网2024年10月21日15:25北京新
来趣花全国客服电话全新升级-来趣花24小时在线客服电话
来趣花全国人工24小时客服电话00861-52971-57932二线00861-56399-67714【来趣花:金融创新与普惠金融的双刃剑】在当今快速发展的
米来花全国客服电话全新升级-米来花24小时在线客服电话
米来花全国人工24小时客服电话00861-52971-57932二线00861-56399-67714【米来花:金融创新与普惠金融的双刃剑】在当今快速发展的
微米花贝全国客服电话全新升级-微米花贝24小时在线客服电话
微米花贝全国人工24小时客服电话00861-52971-57932二线00861-56399-67714【微米花贝:金融创新与普惠金融的双刃剑】在当今快速发
享趣花呗全国客服电话全新升级-享趣花呗24小时在线客服电话
享趣花呗全国人工24小时客服电话00861-52971-57932二线00861-56399-67714【享趣花呗:金融创新与普惠金融的双刃剑】在当今快速发
鱼享花全国客服电话全新升级-鱼享花24小时在线客服电话
鱼享花全国人工24小时客服电话00861-52971-57932二线00861-56399-67714【鱼享花:金融创新与普惠金融的双刃剑】在当今快速发展的