python3-迭代器
1、可迭代(Iterable)对象与迭代器(Iterator)
1.1、可迭代对象
可以直接作用于for
循环的对象统称为可迭代对象:Iterable
,比如集合数据类型,如list
、tuple
、dict
、set
、str
等;或者是generator
,包括生成器和带yield
的generator function。 可以使用isinstance()
判断一个对象是否是Iterable
对象 print(isinstance('abc',Iterable))返回结果:true
1.2、迭代器
任何实现了__iter__
和__next__()
方法的对象都是迭代器,__iter__
返回迭代器自身,__next__
返回容器中的下一个值,如果容器中没有更多元素了,则抛出StopIteration异常。
迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
迭代器只能往前不会后退。
迭代器有两个基本的方法:iter() 和 next()。
生成器一定是迭代器(反之不成立)可以使用迭代器进行访问的对象:
序列:字符串、列表、元组
非序列:字典、文件
自定义类:用户自定义的类实现了iter()或getitem()方法的对象判断对象是否是Iterator:
from collections import Iterator
print(isinstance((x for x in range(10)),Iterator)) #True
print(isinstance([],Iterator)) #False
print(isinstance({},Iterator)) #False
print(isinstance('abc', Iterator)) #False生成器都是 Iterator 对象,但 list、 dict、 str 虽然是 Iterable,却不是Iterator。
#把Iterable对象变成 Iterator:
from collections import Iterator
print(isinstance(iter([]),Iterator)) #True
print(isinstance(iter('ABC'),Iterator)) #True
2、访问迭代器中的元素
使用next() 函数输出迭代器中的下一个值,没有更多的元素时,抛出StopIteration 的错误
list=[1,2,3]
it = iter(list) # 创建迭代器对象
print (next(it))
print (next(it))
print (next(it))
print (next(it))
输出:
1
2
3
Traceback (most recent call last):
File "D:/learn/pytest/learn.py", line 7, in <module>
print (next(it))
StopIteration 这是因为 Python 的 Iterator 对象表示的是一个数据流, Iterator 对象可以被 next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration 错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过 next()函数实现按需计算下一个数据,所以 Iterator 的计算是惰性的,只有在需要返回下一个数据时它才会计算。
list=[1,2,3,4] #for循环语句
it = iter(list) # 创建迭代器对象
for x in it:
print (x, end="+") #1 2 3 4输出:1+2+3+4+
3、创建一个迭代器
把一个类作为一个迭代器使用需要在类中实现两个方法 iter() 与 next() 。iter() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 next() 方法并通过 StopIteration 异常标识迭代的完成。next() 方法会返回下一个迭代器对象。创建一个返回数字的迭代器,初始值为 1,逐步递增 1 防止出现无限循环的情况,在 next() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。
class MyTest:
def __iter__(self):
self.a=1
return self
def __next__(self):
if self.a<4:
x = self.a
self.a += 1
return x
else:
raise StopIteration
test=MyTest()
testiter=iter(test)
for i in testiter:
print(i)
输出:
1
2
3
小结 凡是可作用于for
循环的对象都是Iterable
类型;凡是可作用于next()
函数的对象都是Iterator
类型,它们表示一个惰性计算的序列;集合数据类型如list
、dict
、str
等是Iterable
但不是Iterator
,不过可以通过iter()
函数获得一个Iterator
对象。 Python的for
循环本质上就是通过不断调用next()
函数实现的
参考来源:https://www.cnblogs.com/xiaojianliu/articles/10018727.html
https://www.liaoxuefeng.com/wiki/1016959663602400/1017323698112640
- 下一篇:python3-列表生成式
- 上一篇:python3-生成器