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 ...
随机推荐
- [转帖]实战瓶颈定位-我的MySQL为什么压不上去–写场景
https://plantegg.github.io/2023/06/30/%E5%AE%9E%E6%88%98%E7%93%B6%E9%A2%88%E5%AE%9A%E4%BD%8D-%E6%88% ...
- [转帖]优化命令之sar——最牛命令
目录 一:sar命令概述 1.1sar概述 1.2sar常用选项 1.3常用参数 二:CPU资源监控 2.1整体CPU使用统计(-u) 2.2各个CPU使用统计(-P) 2.3将CPU使用情况保存到文 ...
- IBM Z15设备信息
- Python 潮流周刊#22:Python 3.12.0 发布了!!
你好,我是猫哥.这里每周分享优质的 Python.AI 及通用技术内容,大部分为英文.标题取自其中一则分享,不代表全部内容都是该主题,特此声明. 本周刊由 Python猫 出品,精心筛选国内外的 25 ...
- SignalR系列文章02---netCoreMvc创建Demo
1. 新建.net core MVC项目,并引入nuget包 2. 添加客户端库 3. 修改startUp.cs文件,增加services.AddSignalR();和endpoints.Map ...
- springboot项目导入外部jar包的bean的几种方式
背景 公司封装了基础包和日志包,将公共的配置抽取出来,供所有项目使用,因此就需要考虑,怎么引入外部jar包的Bean实例: 思考 因为公司的jar包就是普通的jar,不支持springboot的自动配 ...
- 个人找工作面试准备------以及别人面试心得{待更新中ing}
参考链接先放: https://blog.csdn.net/u014400934/article/details/102577804?utm_medium=distribute.pc_relevant ...
- 2.6 PE结构:导出表详细解析
导出表(Export Table)是Windows可执行文件中的一个结构,记录了可执行文件中某些函数或变量的名称和地址,这些名称和地址可以供其他程序调用或使用.当PE文件执行时Windows装载器将文 ...
- Python初学(请大神多多指教)
python的注释单行注释用#号多行注释用''' '''注释 基本数据类型 字符串-- n1 = "alex" n2 = 'root' n3 = " ...
- 案例:推进GTID解决MySQL主主不同步问题
之前文章介绍过MySQL修改lower_case_table_names参数,如果之前大写存储的表将无法识别,需要特殊处理. 最近遇到一例应用开发人员在修改这个参数之后,为了清除之前大写存储的表,做了 ...