python迭代器详解

python迭代器 1. 可迭代对象 可以利用 for 循环的对象,都叫可迭代对象。
列表、元组、字典、字符串等都是可迭代对象。
# 以列表为例>>> alist = [0, 1, 2, 3, 4, 5]>>> for i in alist:... print(i)...012345 2. 是否可迭代? 对 python 比较熟悉的朋友,肯定知道哪些数据类型是可迭代的,哪些是不可迭代的。
但是对新手来说,可能需要借助一些函数来判别,比如 python 内置的 collections.abc 模块,这个模块只有在 python 中才有噢,在这个模块中提供了一个 iterable 类,可以用 isinstance 来判断。
>>> from collections.abc import iterable>>>>>> isinstance([0, 1, 2], iterable) # 列表true>>> isinstance({name: 张三}, iterable) # 字典true>>> isinstance((1,2,3), iterable) # 元组true>>> isinstance(hello, iterable) # 字符串true 但是这种方法并不是百分百准确(具体下面会说到),最准确的方法,还是应该使用 for 循环。
3. 可迭代协议 可迭代对象内部是如何实现在你对其进行 for 循环时,可以一个一个元素的返回出来呢?
这就要谈到迭代器协议。
第一种场景:如果一个对象内部实现了 __iter__() 方法 ,并返回一个迭代器实例,那么该对象就是可迭代对象
class array: mylist = [0,1,2] # 返回迭代器类的实例 def __iter__(self): return iter(self.mylist)# 得到可迭代对象my_list = array()print(isinstance(my_list, iterable)) # truefor i in my_list: print(i) 第二种场景:假设一个对象没有实现 __iter__() ,python 解释器 __getitem__() 方法获取元素,如果可行,那么该对象也是一个可迭代对象。
from collections.abc import iterableclass array: mylist = [0,1,2] def __getitem__(self, item): return self.mylist[item]# 得到一个可迭代对象my_list = array()print(isinstance(my_list, iterable)) # falsefor i in my_list: print(i) 此时如果你使用 isinstance(my_list, iterable) 去判断是否是可迭代,就会返回 false,因为 isinstance 这种方法就是检查对象是否有 __iter__ 方法。这也论证了使用 isinstance(my_list, iterable) 去判断是否可迭代是不准确的。
4. 什么是迭代器 当你对一个可迭代对象使用 iter 函数后,它会返回一个迭代器对象,对于迭代器对象,我们可以使用 next 函数,去获取元素,每执行一次,获取一次,等到全部获取完毕,会抛出 stopiteration 提示无元素可取。
>>> alist = [0, 1, 2, 3]>>> gen = iter(alist)>>> gen>>> next(gen)0>>> next(gen)1>>> next(gen)2>>> next(gen)3>>> next(gen)traceback (most recent call last): file , line 1, in stopiteration 5. 迭代器协议 对比可迭代对象,迭代器的内部只是多了一个函数而已 – __next__()
正因为有了它,我们才可以用 next 来获取元素。
迭代器,是在可迭代的基础上实现的。要创建一个迭代器,我们首先,得有一个可迭代对象。 现在就来看看,如何创建一个可迭代对象,并以可迭代对象为基础创建一个迭代器。

什么是毫米波?5G毫米波仍存四方面认知误区
孔径位移传感器概况
智能制造企业想要实现供应链协同应该如何做
Vishay何以通过新型二极管技术引流电子元器件小型化潮流?
甲乙类S2I存储单元的原理、特点及应用实现
python迭代器详解
2020年中国机器人市场已摆脱新冠颓废局势,回归正常状态
常用的焊接保护气体种类及如何进行混合使用
BUCK设计基础是什么
STM32Cube微控制器开发软件已于GitHub正式上线
讯飞智能鼠标这个功能知道吗?令语音输入体验更上一层楼
字节跳动头条西瓜等业务并入抖音
哈工大机器人集团研发的轻型协作机器人,荣获2018年度德国红点大奖
无功补偿的作用
详解运放七大应用电路设计
华为首款5G手机MateX将于今年6月份上市
如何通过汽车整车的这个标准,而且做到性价比比较好?
LEM国产替代|应用于测试仪器的 超高精度电流传感器(0.02%)芯森FM1A介绍
这家厂商发布14000PPI红光Micro LED
激光雷达行业已经进入一个快速发展期