显然,要理解yield,首先要了解迭代器(iterator),接着了解什么是生成器(generator)。

迭代器

通俗的讲,迭代器就是可以逐个访问的容器,而逐个逐步访问的过程成为迭代。

iterator = [item for item in range(5)]
for i in iterator:print(i)
0
1
2
3
4

生成器

上述代码中,iterator就是一个迭代器,for循环部分就是迭代过程。生成器同样也是可供迭代访问的容器,与迭代器不同的是,生成器中的元素不会一次性存入内润中,而是一边迭代一边生成。

generator = (item for item in range(5))
for i in generator:print(i)
0
1
2
3
4

迭代器和生成器的执行效率

因为生成器边迭代边生成,所以占用内存极少,执行效率也更高。

def go_thru_iterator(item_len):iterator = [item for item in range(item_len)]for i in iterator:pass
def go_thru_generator(item_len):generator = (item for item in range(item_len))for i in generator:pass
%time go_thru_iterator(100000000)
CPU times: user 12 s, sys: 11.8 s, total: 23.8 s
Wall time: 23.8 s
%time go_thru_generator(100000000)
CPU times: user 12.7 s, sys: 0 ns, total: 12.7 s
Wall time: 12.6 s

yield

yield的使用和return的使用没有什么区别,只是yield会返回一个生成器。当代码执行到yield时,该函数会返回yield之后的值,并在原地等待下一次迭代;当执行到下一次迭代时,代码接着上一次等待的地方执行:

  • 若使用生成器的send方法,则yield语句的返回值send中的参数
  • 若使用next函数迭代,则在yield的返回值为None

注: next相当于mgen.send(None),但mgen.send在生成器第一次迭代时不可调用

def create_generator():mylist = range(3)for i in mylist:ret = yield i * iprint('ret:', ret)
mgen = create_generator()
next(mgen)
0
next(mgen)
ret: None
1
mgen.send('The yield return value.')
ret: The yield return value.
4
try:next(mgen)
except StopIteration:print('Already arrive the end of the generator element.')
ret: None
Already arrive the end of the generator element.

原文地址:github:jasonTu/python-material-collection 当我们调用yield,它究竟做了什么

当我们调用yield,它究竟做了什么相关推荐

  1. 异步编程系列第05章 Await究竟做了什么?

    写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提高下英文,用我拙劣的英文翻译一些重要的部分,纯属娱乐,简单分享,保持学习,谨记谦虚. 如果你觉得 ...

  2. join方法及其调用yield sleep wait notify方法会对锁产生的影响

    join方法 线程A执行了线程B的join方法,,线程A必须要等线程B执行完成后,线程A才能继续执行 感觉像是插队[捂脸] package org.dance.day1;import org.danc ...

  3. python -m spacy download en”究竟做了什么?(What does “python -m spacy download en” exactly do?

    python -m spacy download en"究竟做了什么?(What does "python -m spacy download en" exactly d ...

  4. arnold 调用 mantra的光子 做GI全局光和caustic焦散

    arnold 调用 mantra的光子 做GI全局光和caustic焦散 关键字:arnold;mantra;photon;GI;caustic;光子;全局光;焦散;global illuminati ...

  5. bind函数怎么用JAVA_JavaScirpt 的 bind 函数究竟做了哪些事

    JavaScirpt 的 bind 函数究竟做了哪些事 文章原地址: https://github.com/catchonme/blog/issues/2 ES5 实现 bind 函数如下Functi ...

  6. 混合模式程序matlab,VS2013 C# 调用 cognex 的QuickBuild做程序时发生一个错误

    今天在用 VS2013 C# 调用 cognex 的QuickBuild做程序时发生一个错误,如下所示 混合模式程序集是针对"v2.0.50727"版的运行时生成的,在没有配置其他 ...

  7. 多个联盟广告调用代码,这样做可以做到打开页面,随机显示一个联盟广告代码

    多个联盟广告调用代码,这样做可以做到打开页面,随机显示一个联盟广告代码: 现在很多站长所经营的网站都挂有很多联盟广告,但是同一个广告位不好同时挂好几个联盟广告,下面我来给大家写一点简单JS广告随机显示 ...

  8. 当我们打开网页时,浏览器究竟做了什么

    面试的时候经常被问到:在浏览器中输入https://www.baidu.com/index.html会发生什么?那么就利用这篇博客来总结一下,在这个过程中浏览器究竟做了什么 对URL的理解,请参考博客 ...

  9. 当我们按下电源键,Android 究竟做了些什么?

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由goo发表于云+社区专栏 相信我们对Android系统都不陌生,而Android系统博大精深,被各种各样的智能设备承载的同时,我们会否 ...

  10. [译]yield关键字都做了什么?

    原文:https://stackoverflow.com/que... 我的微信公众号:python每日一练 要理解什么是 yield,必须理解什么是生成器(generator).在理解生成器之前,让 ...

最新文章

  1. 解决ScrollView嵌套ListView高度的问题
  2. php动态加载js,动态加载script文件的两种方法_javascript技巧
  3. linux调小根目录,Linux根目录分区大小调整教程
  4. 关于JUnit5 你必须知道的(二)JUnit 5的新特性
  5. Spring5参考指南:Bean作用域
  6. java中你知道的这四种代码块吗?
  7. 设置ORACLE_HOME环境变量
  8. django-上传图片-后台上传
  9. ios 隔空投安装ipa_iOS 安装自己服务器上的IPA包
  10. 华为或向苹果出售 5G 芯片;拼多多回应苹果停止供货;微信再推新功能! | 极客头条...
  11. 30首优秀奥运歌曲获奖作品出炉
  12. 【好文翻译】二十年来我得到的20条编程经验
  13. F12开发者工具自带取色器
  14. 香港十大外汇交易平台排名(2021最新版)
  15. win10支持8t 硬盘_详解win10硬盘如何直接安装
  16. 利用会员积分系统提升会员复购率的要点
  17. php 路由修改密码,TPLINK路由器如何修改管理密码和无线密码)
  18. 学习ROS初始遇到的各种问题及解决方法
  19. JAVA中的“人妖”
  20. 微医网爬虫(二) java实现

热门文章

  1. pytorch使用模型预测_使用PyTorch从零开始对边界框进行预测
  2. pygame.font.Font().render() 计算基线(baseline)的原点(origin)坐标
  3. html获取视频时长,js获取本地视频时间长度
  4. php mysql账号注册_php mysql用户注册登陆代码_PHP教程
  5. 不小心把桌面进程结束了怎么办_本命佛不小心摔碎了怎么办,怎么处理?
  6. 通过C#查询SQLServer数据库超时
  7. tomcat 严重: Could not contact localhost:8005. Tomcat may not be running.
  8. 高科技应用之人脸识别、,
  9. Hadoop安装杂记(2)
  10. 2017年最值得关注的5大产品设计趋势