参考:
- 生成器
- 迭代器
- next函数
迭代器的使用
说到迭代器就必须先要提一下可迭代对象(iterable),可迭代对象是能够逐一返回其成员项的对象。可迭代对象包括序列类型(如list、str、tuple)和非序列类型(如dict、文件对象、定义 __iter__()
方法或实现了 Sequence 语义的 __getitem__()
方法的任意自定义类对象。)。一个可迭代对象都有一个__iter__()
方法,也就是说有__iter__()
方法的对象,就是可迭代对象。
迭代器
在Python中,迭代器是遵循迭代协议的对象,用来表示一连串数据流。重复调用迭代器的__next__()
方法(或将其传给内置函数 next())将逐个返回数据流中的项。当没有数据可用时则将引发 StopIteration 异常。
迭代器分为两类:
- 使用
iter()
从任何序列对象中得到迭代器(如list, tuple, dict, set等)。 - 输入迭代器
generator
(包括生成器和带 yield 的函数)。
迭代器有两个基本方法:
-
iter()
返回一个迭代器对象next()
逐一返回迭代对象中的项
迭代器的使用
使用 iter() 返回迭代器
>>> list = ['A', 'B', 'C']
>>> iters = iter(list)
>>> print(next(iters))
A
>>> print(next(iters))
B
>>> print(next(iters))
C
>>> print(next(iters))
StopIteration Traceback (most recent call last)
<ipython-input-6-9689206231f0> in <module>
----> 1 print(next(iters))
StopIteration:
list 是长度为3的列表,使用list作为参数创建迭代器,可迭代的项目也只有3个,当超出可迭代的范围时将引发 StopIteration 异常。
使用 for 遍历迭代器
迭代器对象可以使用for语句进行遍历。
list = ['A', 'B', 'C']
iters = iter(list)
for i in iters:
print(i)
输出结果:
A
B
C
文件迭代
逐行读取文本文件的内容
方法一:
for i in open("test.txt", encoding="utf-8"):
print(i)
方法二:
# 打开文件
file_path = "example.txt"
with open(file_path) as f:
# 创建文件迭代器
file_iterator = iter(f)
try:
while True:
# 逐行读取文件内容
line = next(file_iterator)
print(line, end="")
except StopIteration:
pass
自定义迭代器
一个类通过实现 __iter__()
与__next__()
方法来创建一个迭代器。
迭代器必须有 __iter__()
方法用来返回该迭代器对象自身。
class MyIter:
def __init__(self, m):
self.data = m
self.length = len(m)
self.index = -1
def __iter__(self):
return self
def __next__(self):
if self.index < self.length-1:
self.index += 1
else:
raise StopIteration
return self.data[self.index]
iters = MyIter(['A', 'B', 'C'])
for i in iters:
print(i)
# print(next(iters))
# print(next(iters))
# print(next(iters))