迭代器和可迭代对象
可迭代对象(iterator):包括列表、字典和字符串等,使用迭代工具(如for循环)获取其中的值。
from collections import Iterable, Iterator
a = [1, 2, 3] # 列表是可迭代对象,但不是迭代器对象
print(isinstance(a, Iterable)) # True
print(isinstance(a, Iterator)) # False
True
False
定义一个可迭代对象的类,这个类中必须包含iter和getitem其中一个,否则就不是可迭代对象。for循环遍历的本质是从类中调用iter方法,如果没有iter方法,就会创建一个默认的迭代器,再调用getitem方法
class A:
def __init__(self, x):
self.x = x
def __iter__(self):
return iter(self.x) # 这里必须要返回一个可迭代对象
def __getitem__(self, item): # item表示索引值
return self.x[item]
a = A([2,3,4])
print(isinstance(a, Iterable))
print(isinstance(a, Iterator))
for x in a:
print(x, end=' ')
True
False
2 3 4
迭代器(iterator):访问数据集合内元素的一种方式,使用next方法获取对象的值,但每个值只能访问一次,不能返回。列表、字符串、字典只是可迭代对象,但不是迭代器,不能使用next方法。
from collections import Iterable, Iterator
a = [1, 2, 3] # 列表是可迭代对象,但不是迭代器对象
a = iter(a) #可以用iter函数将a变成迭代器
print(isinstance(a, Iterable)) # True
print(isinstance(a, Iterator)) # True
对于文件则不同,文件对象就是自己的迭代器
f = open('test1.txt')
print(next(f))
print(isinstance(f, iterator) # True
定义一个迭代器对象的类,由于next方法没有索引值,需要自己维护一个索引值以获取下一个变量的位置,同时需要加入iter方法才能使用for循环,否则只是单纯的迭代器
class A:
def __init__(self, x):
self.x = x #获取传入的对象
self.index = 0 #维护索引值
def __next__(self):
try:
result = self.x[self.index]
except IndexError:
raise StopIteration
self.index += 1
return result
def __iter__(self):
return self
a = A([2,3,4])
print(next(a))
print(isinstance(a, Iterator))
print(isinstance(a, Iterable))
2
True
True
迭代器和可迭代对象的区别
- 迭代器一定是可迭代对象,但可迭代对象不一定是迭代器
- 只有迭代器对象才能用next方法,可迭代对象可以用for循环,迭代器要使用for循环就要在内部加上iter方法
- 一般可以用iter函数将可迭代对象转变为迭代器对象
- 可迭代对象会直接将传入对象所有内容读取到内存中,而迭代器是一个个读取,只在需要的时候产生数据