迭代器 - iterator
首先了解一下可迭代对象(iterable)
迭代器一定是可迭代对象,但是可迭代对象不一定是迭代器。
简单而言,可以用for循环遍历的,都是可迭代对象。 list,tuple,str都是可迭代对象,但是他们不一定是迭代器。迭代器本身不知道自己要执行多少次,所以可以理解为不知道有多少个元素,每调用一次next(),就会往下走一步,是惰性的。
迭代器提供了一种不依赖索引取值的方式,这样可以遍历没有索引的可迭代对象,比如字典、集合、文件等等,加载这一个元素至内存中随后释放,相比之下更节省内存,但是我们没有办法获取迭代器的长度,而且只能往后依次取值。
Python中迭代器的本质上每次调用__next__()方法都返回下一个元素或抛出StopIteration的容器对象
迭代器
由于Python中没有“迭代器”这个类,因此具有以下两个特性的类都可以称为“迭代器”类:
1、有__next__()方法,返回容器的下一个元素或抛出StopIteration异常
2、有__iter__()方法,返回迭代器本身
#可迭代对象
from collections import Iterable
# 迭代器
from collections import Iterator
# 将可迭代对象转换成迭代器
list1 = list(range(1,101))
#强转
res = iter(list1)
print(res)
print(type(res))
print(isinstance(res,Iterator)) # 判断是否是迭代器
#print(isinstance({1},Iterable)) 判断是否是可迭代对象,(可迭代对象可用for循环遍历)
print(next(res))
网上看到一段代码,挺不错,共享给大家:
class Fabs():
def __init__(self,max):
self.max=max
self.n,self.a,self.b=0,0,1
def __iter__(self):#定义__iter__方法
return self
def __next__(self):#定义__next__方法
if self.n<self.max:
tmp=self.b
self.a,self.b=self.b,self.a+self.b
#等价于:
#t=(self.a,self.a+self.b)
#self.a=t[0]
#self.b=t[1]
self.n+=1
return tmp
raise StopIteration
print(Fabs(5))
for item in Fabs(10):
print(item,end=' ')