Python中的可迭代对象和迭代器
1、可迭代对象
1.1、可迭代对象概念
可迭代对象,最直观的感觉就是可以使用for来循环迭代每一个元素。例如Python内置的类型:str、list、tuple、dict等类型的对象,都是可迭代对象。
其实for循环迭代可迭代对象,是先调用可迭代对象的__iter__()方法,得到迭代器,然后再依次调用迭代器的__next__()方法获取元素的。
1.2、可迭代对象的判断
判断一个对象是不是“可迭代对象”,可以使用“collection.abc.Iterable”,即“isinstance(对象, Iterable)”来判断是否是可迭代对象,值是True则是可迭代对象,值是False则不是可迭代对象
1.3、可迭代对象必须方法
1.3.1、__iter__()
a) 要使一个对象是可迭代对象,那么该对象必须要有__iter__()方法。但是只是有__iter__()方法,也不能保证能被for循环调用,只有当__iter__()方法返回一个迭代器的时候,才能被for循环迭代调用。总之,我们在__iter__()方法中,要保证返回一个迭代器,不然没什么意义。
b) 如果没有__iter__()方法,那么就肯定不是可迭代对象,不过可能也能被for循环调用。
1.4、可迭代对象的使用
1.4.1、for中使用
只要自定义的对象中有__iter__()方法,那么该对象就是可迭代对象,即使用“isinstance(自定义对象, Iterable)”就会返回True。
可迭代对象不一定能直接被for循环调用迭代。只有自定义对象的__iter__()方法返回值是一个迭代器的时候,这个可迭代对象才能被for进行迭代调用。
for循环调用可迭代对象的步骤:
a) 调用可迭代对象的__iter__()方法,得到对应的迭代器
b) 调用迭代器的__next__()方法,得到每一个元素,直到出现StopIteration异常抛出
1.4.2、iter()函数使用
可以使用“iter(可迭代对象)”来得到一个【迭代器】
1.5、自定义可迭代对象示例
我们在自定义可迭代对象的时候,最好继承Iterable接口,当然了,也可以不用继承
from collections.abc import Iterable, Iterator
class MyIterable:
def __init__(self, data: Iterable):
self.__data = data
def __iter__(self):
"""
必须提供该方法,并且该方法的返回值要是一个迭代器(生成器也属于迭代器)
"""
yield from self.__data
if __name__ == '__main__':
obj = MyIterable("abc")
print(obj)
print(iter(obj))
for _ in obj:
print(_)
2、迭代器
2.1、迭代器概念
迭代器是实际上能被for调用或者被list调用的对象。一般我们自定义的可迭代对象中的__iter__()方法,返回的就是迭代器。
生成器也是一种迭代器。
2.2、迭代器的判断
判断一个对象是不是“迭代器对象”,可以使用“collection.abc.Iterator”,即“isinstance(对象, Iterator)”来判断是否是迭代器,值是True则是迭代器,值是False则不是迭代器。
2.3、迭代器必须方法
只要一个对象定义了__next__()和__iter__()方法,即使两个的方法体是空的,那么该对象也是迭代器。即“isinstance(对象, Iterator)”的返回值是True
2.3.1、 __next__()
迭代器的__next__()方法,返回迭代器的下一个元素
2.3.2、 __iter__()
迭代器的__iter__()方法,一般都是返回自己
2.4、迭代器的使用
2.4.1、for中使用
for直接迭代迭代器,每次获取一个元素。
2.4.2、next()函数使用
next()函数调用迭代器,每次获取一个元素。
2.4.3、list()函数使用
list()函数调用迭代器,把迭代器中的所有元素都取出来,放在列表中。
2.5、自定义迭代器示例
from collections.abc import Iterable, Iterator # 可迭代对象
class MyIterable:
def __init__(self, data: Iterable):
self.__data = data def __iter__(self):
return MyIterator(self.__data) # 迭代器
class MyIterator:
def __init__(self, data: Iterable):
self.__data = data
self.__index = 0 def __iter__(self):
return self def __next__(self):
try:
value = self.__data[self.__index]
self.__index += 1
except IndexError:
raise StopIteration
return value if __name__ == '__main__':
obj = MyIterable("abc")
print(obj)
print(iter(obj))
for _ in obj:
print(_)
输出:
|
<__main__.MyIterable object at 0x01F55110> |
3、可迭代对象和迭代器汇总
3.1、图示
Python中的可迭代对象和迭代器的更多相关文章
- Python中的可迭代对象与迭代器对象
刚刚学习Python,对“可迭代对象”和"迭代器对象"的个人理解,不知道对不对. 1.几个概念 (1)迭代工具:包括for循环.列表解析.in成员关系测试.....等等在内的,用于 ...
- Python中的可迭代对象,迭代器与生成器
先来看一张概览图,关于容器(container).可迭代对象(Iterable).迭代器(iterator).生成器(generator). 一.容器(container) 容器就是一个用来存储多个元 ...
- Python中的可迭代对象
Python中的可迭代对象有:列表.元组.字典.字符串:常结合for循环使用: 判断一个对象是不是可迭代对象: from collections import Iterable isinstanc ...
- Python中的可迭代对象/迭代器/For循环工作机制/生成器
本文分成6个部分: 1.iterable iterator区别 2.iterable的工作机制 3.iterator的工作机制 4.for循环的工作机制 5.generator的原理 6.总结 1.i ...
- Python:容器、迭代对象、迭代器、生成器及yield关键字
在了解Python的数据结构时,容器(container).可迭代对象(iterable).迭代器(iterator).生成器(generator).列表/集合/字典推导式(list, ...
- python函数之可迭代对象、迭代器的判断
怎么判断一个对象是可迭代对象还是迭代器 例子 from collections import Iterable, Iterator lst = ['Today is Wednesday', 'Tomo ...
- python基础一 ------可迭代对象和迭代器对象
可迭代对象和迭代器对象:前者生成后者 比喻:10个硬币都可以一一数(迭代),放入到存钱罐(可以取钱的那种),那这个存钱罐就是一个迭代器对象 需求:从网络抓取各个城市气温信息,并依次显示若依次抓取较多的 ...
- 【转】Python中自定义可迭代对象
python 中内置的可迭代的对象有 list.tuple.set.dict 等,那么我们自己怎么定义一个可迭代的对象呢?先来段代码吧 import re import reprlib RE_WORD ...
- Python中的可迭代Iterable和迭代器Iterator
目录 Iterable可迭代对象 如何判断对象是否是可迭代对象Iterable Iterator迭代器 如何判断对象是否迭代器Iterator 将Iterable转换成Iterator Iterabl ...
- python中可迭代对象、迭代器、生成器
可迭代对象 关注公众号"轻松学编程"了解更多. 1.列表生成式 list = [result for x in range(m, n)] g1 = (i for i in rang ...
随机推荐
- DevOps|中式土味OKR与绩效考核落地与实践
昨天一个小伙伴和我讨论了一下OKR和绩效管理,所以这次想简单明了地说下在中国怎么做比较合适,很多高大上的理论无法落地也是空中楼阁. 首先说一些,我个人的理解 道德品质和能力素质决定了一个人的职位行为 ...
- 洛谷 P4859 已经没有什么好害怕的了
题目描述 学姐 4 了. 有 \(n\) 个糖果和 \(n\) 个药片,它们要进行一一配对.每个糖果或药片都具有互不相同的能量值,要求配对后,糖果比药片能量高的对数,比剩下的对数恰好多 \(k\),求 ...
- instance norm
与Batch Norm加快计算收敛不同, IN是在[1]中提出的,目的是提高style transfer的表现. 计算如下: \[IN(x)=\gamma (\frac{x-\mu(x)}{\sigm ...
- Android实时获取摄像头画面传输至PC端
前言 最近在做一个PC端小应用,需要获取摄像头画面,但是电脑摄像头像素太低,而且位置调整不方便,又不想为此单独买个摄像头.于是想起了之前淘汰掉的手机,成像质量还是杠杠的,能不能把手机摄像头连接到电脑上 ...
- 2023-07-08:RabbitMQ如何做到消息不丢失?
2023-07-08:RabbitMQ如何做到消息不丢失? 答案2023-07-08: 1.持久化 发送消息时设置delivery_mode属性为2,使消息被持久化保存到磁盘,即使RabbitMQ服务 ...
- 如何构建高效、可观的系统「GitHub 热点速览」
经典老项目 system-design 教你如何设计一个健壮的系统,新项目 noodle 教你如何提升教育效率,而后者甚至单日获得了 1,600 star,刚开源就获得了 6k+ 的 star. 除了 ...
- ASP.NET MVC4 学习笔记-4
添加验证--Adding Validation 现在我们要为程序增加数据验证.如果不增加数据验证的话,我们的用户可能会输入错误的数据或者提交一个空白的表格. 在MVC应用程序中,数据验证通常要在域模型 ...
- Three.js使用InstancedMesh实现性能优化
1. 引言 有这么一种场景:需要渲染一座桥,桥有很多桥柱,桥柱除了位置与倾斜角度不完全相同外,其他均相同,由于桥柱数量很大,使用three.js绘制较为卡顿,如何优化?注意,要求后续能选中某个桥柱 2 ...
- GitLab 无仓库 中了勒索病毒
坑爹的记录一下,并没有解决 Gitlab 昨天(2021-11-29)打开之后看不到项目了,下面这个吊样子 最后发现中病毒了,一堆的这个吊毛文件,复制一个打开看了一下 你别说这个黑客网页写的还不错,这 ...
- VSCode:缩进两格空格
在设定中对如图所示两项进行修改: 至此问题解决.
