iterables/generators/yield
iterables
# 当你创建了一个列表,你可以一个一个的读取它的每一项,这叫做iteration:
>>> mylist = [1,2,3]
>>> for i in mylist:
print(i)
>>> 1
>>> 2
>>> 3
# mylist是可迭代的。当你用列表推导式的时候,你就创建了一个列表,而这个列表也是可迭代的
>>> mylist = [x*x for x in range(3)]
>>> for i in mylist:
print(i)
>>> 0
>>> 1
>>> 4
所有你可以用在for...in...语句中的都是可迭代的:比如lists,strings,files...因为这些
可迭代的对象你可以随意的读取所以非常方便易用,但是你必须把它们的值放到内存里,当它们
有很多值时就会消耗太多的内存。这里最后一句话是重点。
generators
生成器也是迭代器的一种,但是你只能迭代它们一次,原因很简单,因为它们不是全部存在内存里,
它们只在要调用的时候在内存里生成:
>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator:
print(i)
>>> 0
>>> 1
>>> 4
生成器和迭代器的区别就是()代替[],还有你不能用for i in mygenerator第二次调用生成器:
yield
// yield的用法和关键字return差不多,下面的函数将会返回一个生成器
>>> def createGenerator():
mylist = range(3)
for i in mylist:
yield i*i
>>> mygenerator = createGenerator() # 创建生成器
>>> print(mygenerator) # mygenerator is an object
>>> for i in mygenerator:
print(i)
>>> 0
>>> 1
>>> 4
当你的函数要返回一个非常大的集合并且你希望只读一次的话,那么它就非常的方便了
要理解Yield你必须先理解当你调用函数的时候,函数里的代码并没有运行。函数仅仅
返回生成器对象,这就是它的最微妙之处。
然后,没当for语句迭代生成器的时候你的代码才会运转。
当for语句第一次调用函数里返回的生成器对象,函数的代码就开始运作,直到碰到yield
然后会返回本次循环的第一个返回值,所以下一次调用也将运行一次循环然后返回下一个值
直到没有值可以返回
一旦函数运行并且没有碰到yield语句就认为生成器已经为空了。因为有可能是循环结束
或者没有满足if/else之类的。
iterables/generators/yield的更多相关文章
- JS实现异步的方法:回调函数callback、事件监听、setTimeout、Promise、生成器Generators/yield、async/awt
所有异步任务都是在同步任务执行结束之后,从任务队列中依次取出执行. 回调函数是异步操作最基本的方法,比如AJAX回调,回调函数的优点是简单.容易理解和实现,缺点是不利于代码的阅读和维护,各个部分之间高 ...
- Typescript 查缺补漏
Types Casting: let input = xxx as HTMLInputElement; let input = <HTMLElement>xxxx; Object Shap ...
- [译]Node.js面试问与答
原文: http://blog.risingstack.com/node-js-interview-questions/ 什么是error-first callback? 如何避免无休止的callba ...
- php 新特性
PHP 5.6 1.可以使用表达式定义常量 https://php.net/manual/zh/migration56.new-features.php 在之前的 PHP 版本中,必须使用静态值来定义 ...
- Python中itertools模块
itertools模块包含创建有效迭代器的函数,可以用各种方式对数据进行循环操作,此模块中的所有函数返回的迭代器都可以与for循环语句以及其他包含迭代器(如生成器和生成器表达式)的函数联合使用. ch ...
- Python:itertools模块
itertools模块包含创建有效迭代器的函数,可以用各种方式对数据进行循环操作,此模块中的所有函数返回的迭代器都可以与for循环语句以及其他包含迭代器(如生成器和生成器表达式)的函数联合使用. ch ...
- JavaScript Application Architecture On The Road To 2015
JavaScript Application Architecture On The Road To 2015 I once told someone I was an architect. It’s ...
- Node.js最新技术栈之Promise篇
前言 大家好,我是桑世龙,github和cnodejs上的i5ting,目前在天津创业,公司目前使用技术主要是nodejs,算所谓的MEAN(mongodb + express + angular + ...
- 一名全栈工程师Node.js之路-转
Node.js 全球现状 虽然 Node.js 在国内没有盛行,但据 StackOverflow 2016 年开发者调查,其中 node.js .全栈.JavaScript 相关的技术在多个领域(包括 ...
- pythoon_interview_redit
easy/intermediate What are Python decorators and how would you use them?How would you setup many pro ...
随机推荐
- [转帖]读Brendan Gregg - 谈性能分析
https://zhuanlan.zhihu.com/p/206743670 Brendan Gregg何许人 Brendan Gregg在性能分析工业界如雷贯耳, 相信看到这篇文章的人肯定知道他的大 ...
- [转帖]exec系统调用
https://www.jianshu.com/p/3bf14f7d889c 进程的执行(exec) execve ececve系统调用可以将新程序加载到调用进程的内存空间,在这一过程中,将丢弃现有的 ...
- TypeScript中Never类型和类型断言
Never 类型 never类型表示:那些永不存在的值的类型. 例如:never类型是那些总是会[抛出异常]或根本就[不会有返回值的函数表达式]或[箭头函数表达式的返回值类型] never类型是任何类 ...
- Typescript中存取器getters和setters的使用
1.存取器 存取器可以让我们可以有效的控制对,对象中的中的成员的访问. 可以通过getters和setters来进行操作 在typescript中分别对应 get 和 set 2.如何解决报错 typ ...
- Python 潮流周刊第 37 期(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- Leetcode 42题 接雨水(Trapping Rain Water) Java语言求解
题目链接 https://leetcode-cn.com/problems/trapping-rain-water/ 题目内容 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱 ...
- Go中sync.map使用小结
sync.map 前言 深入了解下 查看下具体的实现 Load Store Delete LoadOrStore 总结 流程图片 参考 sync.map 前言 Go中的map不是并发安全的,在Go1. ...
- 4.2 Windows驱动开发:内核中进程线程与模块
内核进程线程和模块是操作系统内核中非常重要的概念.它们是操作系统的核心部分,用于管理系统资源和处理系统请求.在驱动安全开发中,理解内核进程线程和模块的概念对于编写安全的内核驱动程序至关重要. 内核进程 ...
- 在Golang中实现多态
目录 1.说明 2.多态 3.代码示例 4.总结 1.说明 和流行的面向对象语言不同,go 中没有面向对象的说法,也没有对应的封装.继承和多态,也许 go 的设计就不是和OOP对齐,想使用OOP,那就 ...
- centos离线安装mongodb-database-tools
mongodb-database-tools是MongoDB数据库工具的命令行的工具,用于工作与MongoDB部署.可以使用mongodump和mongoimport很方便的导入导出备份数据. 该数据 ...