1、迭代器
迭代器是一个对象,它可以记录遍历的相关信息,迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器有两个基本的方法:iter() 和 next()。我们都过命令行工具,了解一下python的底层迭代机制
>>> items = [1,2,3]
>>> it = iter(items)
>>> next(it)
1
>>> next(it)
2
>>> next(it)
3
>>> next(it)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
上面执行的流程
- 根据给定的可迭代对象生成迭代器
- 从迭代器中重复获取下一项
- 如果成功获得了下一项,上一项已经消失
- 如果在获取下一项时遇到“StopIteration”异常,则停止循环,因为后面没有其他项了
2、应用
1、不使用for循环实现对可迭代对象便利,可以使用什么实现遍历呢?
手动的遍历可迭代对象,使用 next() 函数并在代码中捕获 StopIteration 异常
def manual_iter():
with open('test.txt') as f:
try:
while True:
line = next(f)
print(line, end='')
except StopIteration:
pass
2、自定义迭代器
Python 中创建自定义迭代器,需要实现一个类,该类必须包含 iter() 和 next() 方法。iter() 方法返回迭代器对象本身,next() 方法返回序列中的下一个元素
class EvenIterator:
def __init__(self, lst):
self.lst = lst
self.index = 0
def __iter__(self):
return self
def __next__(self):
while self.index < len(self.lst):
current = self.lst[self.index]
self.index += 1
if current % 2 == 0:
return current
raise StopIteration
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for i in EvenIterator(my_list):
print(i)
输出:
2
4
6
8
10
在上面的示例中定义了一个名为 EvenIterator 的类,该类接受一个列表作为参数。我们实现了 iter() 和 next() 方法来定义迭代器的行为,并在 next() 方法中使用 raise StopIteration 来指示迭代结束。
3、反向迭代序列
1、对于序列对象大师兄确定或者对象实现__reversed__()
方法时可以使用,例如下面例子
a = [1, 2, 3, 4]
for x in reversed(a):
print(x)
输出:
4
3
2
1
2、如果1中的两个条件都不满足,还需要反向序列的话,例如自定义对象等,方法有下面两个
(1)将对象转化为序列
(2)对象实现__reversed__()
方法,实现反向迭代
class Countdown:
def __init__(self, start):
self.start = start
def __iter__(self):
n = self.start
while n > 0:
yield n
n -= 1
def __reversed__(self):
n = 1
while n <= self.start:
yield n
n += 1
# 按间距中的绿色按钮以运行脚本。
if __name__ == '__main__':
for rr in reversed(Countdown(30)):
print (rr)
for rr in Countdown(30):
print (rr)