当我们调用yield,它究竟做了什么
显然,要理解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,它究竟做了什么相关推荐
- 异步编程系列第05章 Await究竟做了什么?
写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提高下英文,用我拙劣的英文翻译一些重要的部分,纯属娱乐,简单分享,保持学习,谨记谦虚. 如果你觉得 ...
- join方法及其调用yield sleep wait notify方法会对锁产生的影响
join方法 线程A执行了线程B的join方法,,线程A必须要等线程B执行完成后,线程A才能继续执行 感觉像是插队[捂脸] package org.dance.day1;import org.danc ...
- 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 ...
- arnold 调用 mantra的光子 做GI全局光和caustic焦散
arnold 调用 mantra的光子 做GI全局光和caustic焦散 关键字:arnold;mantra;photon;GI;caustic;光子;全局光;焦散;global illuminati ...
- bind函数怎么用JAVA_JavaScirpt 的 bind 函数究竟做了哪些事
JavaScirpt 的 bind 函数究竟做了哪些事 文章原地址: https://github.com/catchonme/blog/issues/2 ES5 实现 bind 函数如下Functi ...
- 混合模式程序matlab,VS2013 C# 调用 cognex 的QuickBuild做程序时发生一个错误
今天在用 VS2013 C# 调用 cognex 的QuickBuild做程序时发生一个错误,如下所示 混合模式程序集是针对"v2.0.50727"版的运行时生成的,在没有配置其他 ...
- 多个联盟广告调用代码,这样做可以做到打开页面,随机显示一个联盟广告代码
多个联盟广告调用代码,这样做可以做到打开页面,随机显示一个联盟广告代码: 现在很多站长所经营的网站都挂有很多联盟广告,但是同一个广告位不好同时挂好几个联盟广告,下面我来给大家写一点简单JS广告随机显示 ...
- 当我们打开网页时,浏览器究竟做了什么
面试的时候经常被问到:在浏览器中输入https://www.baidu.com/index.html会发生什么?那么就利用这篇博客来总结一下,在这个过程中浏览器究竟做了什么 对URL的理解,请参考博客 ...
- 当我们按下电源键,Android 究竟做了些什么?
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由goo发表于云+社区专栏 相信我们对Android系统都不陌生,而Android系统博大精深,被各种各样的智能设备承载的同时,我们会否 ...
- [译]yield关键字都做了什么?
原文:https://stackoverflow.com/que... 我的微信公众号:python每日一练 要理解什么是 yield,必须理解什么是生成器(generator).在理解生成器之前,让 ...
最新文章
- 解决ScrollView嵌套ListView高度的问题
- php动态加载js,动态加载script文件的两种方法_javascript技巧
- linux调小根目录,Linux根目录分区大小调整教程
- 关于JUnit5 你必须知道的(二)JUnit 5的新特性
- Spring5参考指南:Bean作用域
- java中你知道的这四种代码块吗?
- 设置ORACLE_HOME环境变量
- django-上传图片-后台上传
- ios 隔空投安装ipa_iOS 安装自己服务器上的IPA包
- 华为或向苹果出售 5G 芯片;拼多多回应苹果停止供货;微信再推新功能! | 极客头条...
- 30首优秀奥运歌曲获奖作品出炉
- 【好文翻译】二十年来我得到的20条编程经验
- F12开发者工具自带取色器
- 香港十大外汇交易平台排名(2021最新版)
- win10支持8t 硬盘_详解win10硬盘如何直接安装
- 利用会员积分系统提升会员复购率的要点
- php 路由修改密码,TPLINK路由器如何修改管理密码和无线密码)
- 学习ROS初始遇到的各种问题及解决方法
- JAVA中的“人妖”
- 微医网爬虫(二) java实现
热门文章
- pytorch使用模型预测_使用PyTorch从零开始对边界框进行预测
- pygame.font.Font().render() 计算基线(baseline)的原点(origin)坐标
- html获取视频时长,js获取本地视频时间长度
- php mysql账号注册_php mysql用户注册登陆代码_PHP教程
- 不小心把桌面进程结束了怎么办_本命佛不小心摔碎了怎么办,怎么处理?
- 通过C#查询SQLServer数据库超时
- tomcat 严重: Could not contact localhost:8005. Tomcat may not be running.
- 高科技应用之人脸识别、,
- Hadoop安装杂记(2)
- 2017年最值得关注的5大产品设计趋势