Python中的可迭代对象,迭代器与生成器
先来看一张概览图,关于容器(container)、可迭代对象(Iterable)、迭代器(iterator)、生成器(generator)。

一、容器(container)
容器就是一个用来存储多个元素的数据结构,常见的容器包括【列表】、【元组】、【字典】、【集合】、【字符串】。
容器有两个特点:1. 容器中的元素可通过迭代获取 2. 所有容器中的元素被存储在内存中。
二、可迭代对象(Iterable)
可迭代对象,简单的说就是可以被迭代获取的对象,iterable定义了可返回迭代器的__iter__方法。
通过使用iter()方法,我们能将可迭代对象返回成迭代器。例如列表:
from collections import Iterable
# 定义一个列表,其本身是可迭代对象
list_a = ['a', 'b', 'c']
isinstance(list_a, Iterable) # True
new_a = iter(list_a) # 对迭代器调用next()方法
>>> next(new_a)
a
>>> next(new_a)
b
>>> next(new_a)
c
>>> next(new_a) # 抛出StopIteration异常
三、迭代器(Iterator)
迭代器是一个带状态的对象,迭代器内部持有一个状态,该状态用于记录当前迭代所在位置,以便于下次迭代的时候获取正确
的元素。迭代器可以通过next()方法来迭代获取下一个值。
迭代器实现了__iter__() 和 __next__()方法。而且,迭代器不会一次性吧所有元素都加载到内存,而是需要的时候才返回结果。
from collections import Iterable
# 定义一个列表,其本身是可迭代对象
list_a = ['a', 'b', 'c']
isinstance(list_a, Iterable) # True
new_a = iter(list_a) # 对迭代器调用next()方法
>>> next(new_a)
a
>>> next(new_a)
b
>>> next(new_a)
c
>>> next(new_a) # 抛出StopIteration异常
迭代器每次调用next()方法的时候做两件事:1. 为下一次调用next()方法修改状态 2. 生成当前调用的返回结果。
当我们第一次调用next(new_a)之后,当前状态改为即指向a,且输出a,当我们第二次调用的时候,输出b,并且将
当前状态改为指向b...
四、生成器
生成器是一种特殊的迭代器。特殊在我们可以通过send()方法像生成器中传入数据,而迭代器只能将数据输出。
其主要的特点有:
1、生成器拥有迭代器的迭代传出数据的功能,但用关键字yield来替代迭代器中的__next__()方法来实现,而拥有yield关键字的函数
就是生成器函数。
2、生成器可以传入数据进行计算(不同于迭代器),并根据变量内容计算结果后返回。
3、迭代器不会一次把所有的元素加载到内存,而是调用的时候才生成返回结果(这点相同于迭代器)
4、可以通过for循环进行迭代(因为生成器是迭代器)
总结:生成器是一种特殊的迭代器,其具有传入数据的功能。
下面借助一个简短的程序来具体解释一下yield执行过程:
def generator_1():
y = 0
r = 'here'
while True:
x = yield r g_1 = generator_1()
g_1.send(None)
g_1.send(1)
g_1.send(2)
首先我们写了一个很简单的生成器函数,然后我们定义了一个生成器对象g_1,当我们启动生成器的时候第一个send()只能传入None
为什么只能是None呢,我们来看其具体执行过程,从函数的第一行开始执行,然后一直到 x = yield r,根据从右向左执行的原则,首先
执行yield r 然后程序终止,并没有赋值语句,因此,第一个send()只能传入None。当第二次send()时,从上一次中断的地方开始执行,
上一次是中断在了赋值,那么我们开始从赋值执行,即 x = 1...后边的类似。
参考:https://blog.csdn.net/SL_World/article/details/86507872 作者:SL_World
Python中的可迭代对象,迭代器与生成器的更多相关文章
- Python中的可迭代对象/迭代器/For循环工作机制/生成器
本文分成6个部分: 1.iterable iterator区别 2.iterable的工作机制 3.iterator的工作机制 4.for循环的工作机制 5.generator的原理 6.总结 1.i ...
- python编程系列---可迭代对象,迭代器和生成器详解
一.三者在代码上的特征 1.有__iter__方法的对象就是可迭代类(对象) 2.有__iter__方法,__next()方法的对象就是迭代器3.生成器 == 函数+yield 生成器属于迭代器, 迭 ...
- Python中的可迭代对象
Python中的可迭代对象有:列表.元组.字典.字符串:常结合for循环使用: 判断一个对象是不是可迭代对象: from collections import Iterable isinstanc ...
- Python中的可迭代对象与迭代器对象
刚刚学习Python,对“可迭代对象”和"迭代器对象"的个人理解,不知道对不对. 1.几个概念 (1)迭代工具:包括for循环.列表解析.in成员关系测试.....等等在内的,用于 ...
- 【Python】【容器 | 迭代对象 | 迭代器 | 生成器 | 生成器表达式 | 协程 | 期物 | 任务】
Python 的 asyncio 类似于 C++ 的 Boost.Asio. 所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知. Asyn ...
- python当中的 可迭代对象 迭代器
学习python有一段时间了,在学习过程中遇到很多难理解的东西,做一下总结,希望能对其他朋友有一些帮助. 完全是个人理解,难免有错,欢迎其他大神朋友们批评指正. 1 迭代 什么是迭代呢??我们可以这样 ...
- 【转】Python中自定义可迭代对象
python 中内置的可迭代的对象有 list.tuple.set.dict 等,那么我们自己怎么定义一个可迭代的对象呢?先来段代码吧 import re import reprlib RE_WORD ...
- 可迭代对象&迭代器&生成器
在python中,可迭代对象&迭代器&生成器的关系如下图: 即:生成器是一种特殊的迭代器,迭代器是一种特殊的可迭代对象. 可迭代对象 如上图,这里x是一个列表(可迭代对象),其实正如第 ...
- 11.Python初窥门径(函数名,可迭代对象,迭代器)
Python(函数名,可迭代对象,迭代器) 一.默认参数的坑 # 比较特殊,正常来说临时空间执行结束后应该删除,但在这里不是. def func(a,l=[]): l.append(a) return ...
随机推荐
- Luogu P2341 [HAOI2006]受欢迎的牛 SCC缩点
把强连通分量缩点,如果有且仅有一个出度为0的强连通分量,那么答案就是他的size:如果有多个入度为0的,那么没有明星牛. #include<cstdio> #include<iost ...
- Jexus 5.8.2
Jexus 5.8.2 正式发布为Asp.Net Core进入生产环境提供平台支持 Jexus 是一款运行于 Linux 平台,以支持 ASP.NET.PHP 为特色的集高安全性和高性能为一体的 ...
- HTML——制作一个图片列表
总结: 1)html有很多默认样式,然而实际应用中并不需要,因此要在制作样式之前清除掉默认样式. 2)注意清除margin-top塌陷 3)使用float:left后要使用clear:both清除其影 ...
- log4j.properties错误及配置详解
当在Eclipse上运行MapReduce程序遇到以上问题时,请检查项目中是否有log4j.properties配置文件,或者配置文件是否正确. 刚接触Hadoop的时候不太了解log4j.prope ...
- C# 對 List<string> 取交集、補集、超集、串聯
List<string> ls1 =new List<string> { "a", "b", "c", " ...
- Log4j输出格式log4j的PatternLayout参数含义
摘自:http://logging.apache.org/log4j/docs/api/org/apache/log4j/PatternLayout.html 参数 说明 例子 %c 列出logger ...
- More than one fragment with the name [spring_web] was found. This is not legal ...
今天在搭建springweb应用环境的时候启动tomcat报错More than one fragment with the name [spring_web] was found. This is ...
- (2017.10.16) javascript 数据类型转换与操作
javascript 有 5 种基本数据类型:undefined.null.Boolean.String.Number,还有1 种较复杂的数据类型 Object:各种类型之间可以相互转换,其中有些有趣 ...
- PC端和手机端页面的一丢丢区别
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- js获取当前的年月日时分秒周期
function timeNow(){ var date = new Date(); this.year = date.getFullYear(); this.month = date.getMont ...