本文最后更新于 258 天前,其中的信息可能已经过时,如有错误请发送邮件到wuxianglongblog@163.com
迭代器与生成器
迭代器
可迭代对象可以在 for 循环中使用:
x = [2, 4, 6]
for n in x:
print(n)
2
4
6
之所以可以被for循环迭代,是因为这些对象拥有一个迭代器,可以用.__iter__()
方法获得:
x.__iter__()
一个迭代器需要满足两个条件:
.__iter__()
方法返回自身.__next__()
方法返回下一个迭代值,当迭代完成后,抛出一个StopIteration异常
i = x.__iter__()
i.__iter__() is i
True
i.__next__()
2
i.__next__()
4
也可以调用next()
函数迭代:
next(i)
6
没有元素时抛出异常:
i.__next__()
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
Input In [8], in ()
----> 1 i.__next__()
StopIteration: |
自定义迭代器
自定义一个 list 的反序迭代器:
class ReverseListIterator(object):
def __init__(self, list):
self.list = list
self.index = len(list)
def __iter__(self):
return self
def __next__(self):
self.index -= 1
if self.index >= 0:
return self.list[self.index]
else:
raise StopIteration
x = range(10)
for i in ReverseListIterator(x):
print(i)
9
8
7
6
5
4
3
2
1
0
生成器
直接实现自定义类型迭代器比较麻烦,一个更简单的方法是使用生成器。例如:
def test_generator():
yield 1
yield 5
yield 3
g = test_generator()
生成器也是满足迭代器定义的:
g.__iter__() is g
True
生成器会按照定义时,yield
产出的值进行迭代:
next(g)
1
next(g)
5
next(g)
3
迭代结束后,抛出异常。
next(g)
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
Input In [17], in ()
----> 1 next(g)
StopIteration: |
逆序函数也可以用生成器实现:
def my_reverse(data):
for i in data[::-1]:
yield i
for i in my_reverse('abcde'):
print(i)
e
d
c
b
a