Python 迭代器的使用
date
Feb 24, 2020
slug
5589750742411264
status
Published
tags
Python
summary
type
Post
先了解一下可迭代对象
说到迭代器就必须先要提一下可迭代对象(iterable),可迭代对象是能够逐一返回其成员项的对象。可迭代对象包括序列类型(如list、str、tuple)和非序列类型(如dict、文件对象、定义
__iter__()
方法或实现了 Sequence
语义的 __getitem__()
方法的任意自定义类对象。)。一个可迭代对象都有一个 __iter__()
方法,也就是说有 __iter__()
方法的对象,就是可迭代对象。迭代器
在Python中,迭代器是遵循迭代协议的对象,用来表示一连串数据流。重复调用迭代器的
__next__()
方法(或将其传给内置函数 next())将逐个返回数据流中的项。当没有数据可用时则将引发 StopIteration
异常。迭代器分为两类:
- 使用
iter()
从任何序列对象中得到迭代器(如list, tuple, dict, set等)。
- 输入迭代器
generator
(包括生成器和带yield
的函数)。
迭代器有两个基本方法:
iter()
返回一个迭代器对象
next()
逐一返回迭代对象中的项
迭代器的使用
使用 iter() 返回迭代器
In [1]: list = ['A', 'B', 'C'] In [2]: iters = iter(list) In [3]: print(next(iters)) A In [4]: print(next(iters)) B In [5]: print(next(iters)) C In [6]: 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)
自定义迭代器
一个类通过实现
__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] # def next(self): # Python2 中使用next()# 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))