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 ...
随机推荐
- QDU-GZS and String
Description GZS has two strings s and t. In each step, GZS can select arbitrary character c of s and ...
- spring boot 使用hibernate validator 验证service
不在controller中验证,而是在service中验证. spring boot 默认使用的就是hibernate validator,存在于pom的spring-boot-starter-web ...
- Jmeter4.0----测试数据说明之查看结果树(10)
1.说明 在用jmeter辅助测试的过程中,我们经常需要根据接口返回的相关信息对我们测试的系统做相应的分析,所以呢,常常会用到jmeter中不同类型的监听器获取接口信息. 2.步骤 第一步: 线程组 ...
- PartTime_一些网站
1. http://www.sxsoft.com/ 貌似 搜搜"破解",无符合条件的结果 http://www.taskcity.com/ "智城",貌似 符合 ...
- (转)网站DDOS攻击防护实战老男孩经验心得分享
网站DDOS攻击防护实战老男孩经验心得分享 原文:http://blog.51cto.com/oldboy/845349
- Windows1
① 对Windows的设置一般在, 所有设置, 控制面板(control), 管理方式打开此电脑和此电脑上的选项 ② 关闭对账号安全的检验, 在控制面板中, 找到系统和安全, 再找到更改用户账号控制设 ...
- 给Visual Studio更换皮肤和背景图
1.先安装更换皮肤的插件 VS菜单栏里面找到:工具>扩展和更新>联机>搜索: Theme Editor 下载并安装: 安装后先不着急重启VS 然后,安装可更改背景图片的插件:工具&g ...
- session会话
jsp会话篇session: package com.log; import java.io.IOException; import java.util.ArrayList; import java. ...
- python中的getcwd
Help on built-in function getcwd in module posix: getcwd(...) getcwd() -> path Return a ...
- HDU 3001 Travelling (状压DP,3进制)
题意: 给出n<=10个点,有m条边的无向图.问:可以从任意点出发,至多经过同一个点2次,遍历所有点的最小费用? 思路: 本题就是要卡你的内存,由于至多可经过同一个点2次,所以只能用3进制来表示 ...