python-生成器(generation)
阐述思路是:迭代(iteration)、迭代器(iterator)、生成器(generator)。
迭代
迭代是重复反馈过程的活动,其目的通常是为了接近并到达所需的目标或结果。每一次对过程的重复被称为一次“迭代”,而每一次迭代得到的结果会被用来作为下一次迭代的初始值。
在python中,迭代通常是通过for ... in ...来完成的,而且只要是可迭代对象(iterable),都能进行迭代.这里简单讲下iterator:
iterator是实现了iterator.__iter__()和iterator.__next__()方法的对象。iterator.__iter__()方法返回的是iterator对象本身.根据官方的说法,正是这个方法,实现了for ... in ...语句.而iterator.__next__()是iterator区别于iterable的关键了,它允许我们显式地获取一个元素.当调用next()方法时,实际上产生了2个操作:
- 更新iterator状态,令其指向后一项,以便下一次调用
- 返回当前结果
(正是__next__(),使得iterator能在每次被调用时,返回一个单一的值;iterator是消耗型的,即每一个值被使用过后,就消失了.因此,你可以将以上的操作2理解成pop.)
【for…in…情况:
】
生成器:
【基本概念:
常说的生成器,就是带有yield的函数;
generator iterator是generator function的返回值,即一个generator对象;
而形如(elem for elem in [1, 2, 3])的表达式,称为generator expression,实际使用与generator无异.】
Yield使用示例:
第一次调用next()方法时,函数似乎执行到yield 1,就暂停了.然后再次调用next()时,函数从yield 1之后开始执行的,并再次暂停.第三次调用next(),从第二次暂停的地方开始执行.第四次,抛出StopIteration异常.
事实上,generator确实在遇到yield之后暂停了,确切点说,是先返回了yield表达式的值,再暂停的.当再次调用next()时,从先前暂停的地方开始执行,直到遇到下一个yield.
可以将yield理解成一个中断服务子程序的断点,没错,是中断服务子程序的断点.我们每次对一个generator对象调用next()时,函数内部代码执行到”断点”yield,然后返回这一部分的结果,并保存上下文环境,”中断”返回.
最新文章
- infer 检验IOS项目
- Java魔法堂:解读基于Type Erasure的泛型
- js为DIV动态设置id属性
- MyEclipse9中的不伤眼修改、FreeMarker插件、JQuery提示插件、全屏(FullScreen)插件的安装
- python 核心编程第二版 课后习题 第11章
- 【Android】isEmpty()
- LVM(1)
- 通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 ‘incorrect string value: '\xF0...
- Java ZIP打包
- Android 网格视图GridView的使用
- JSON的数据类型
- golang 私钥";加密";公钥";解密";
- voa 2015 / 4 / 13
- android viewpager切换到最后一页时,跳转至其他activity
- 使用MaxCompute Java SDK 执行任务卡住了,怎么办?
- Java内存模型探秘
- PHP文件解密服务,微擎微赞模块解密,微擎模块解密
- Python基础线程和协程
- 面向对象三大特性编写面向对象程序,self到底是谁
- JavaSript模块规范 - AMD规范与CMD规范介绍[转]
热门文章
- Vue中keep-alive组件的理解
- Learning in Spiking Neural Networks by Reinforcement of Stochastic Synaptic Transmission
- jdk 功能变化
- 从零开始的SpringBoot项目 ( 四 ) 整合mybatis
- Resharper 2020 免费破解版
- C++ Templates (2.2 使用Stack类模板 Use of Class Template Stack )
- Python3 高级编程技巧(部分)
- 前端修仙之路---一、如何用gulp搭建一套web前端开发框架
- oeasy教您玩转linux010109clear清屏
- Oracle两个数据库互相访问-九五小庞