python迭代器与生成器
# 迭代器和可迭代对象
实现了__iter__
的对象是可迭代对象
.
实现了__iter__
和__next__
的是迭代器
.
两者之间的关系: Python从可迭代的对象
中获取迭代器
可迭代对象的抽象基类是abc.Iterable
迭代器的抽象基类是abc.Iterator
# 如何实现迭代器?
定义__iter__
方法返回带有__next__
方法的对象,__iter__
可以简单的返回self
.
当没有数据返回时,会抛出StopIteration
异常停止返回数据。
class MyIter():
def __init__(self, data):
self.data = data
self.index = len(data)
def __iter__(self):
return self
def __next__(self):
if self.index == 0:
raise StopIteration
self.index = self.index - 1
return self.data[self.index]
my_iter = MyIter()
iter(my_iter) # 返回一个迭代器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 生成器和生成器函数
函数中有yield
关键字的,就是生成器函数
# 生成器函数创建生成器
下面的__iter__
是一个生成器函数
,通过该生成器函数
创建生成器对象,包装生成器函数
的定义。把生成器传给next(...)
函数时,生成器函数
会向前,执行函数定义体中的下一个yield语句,返回产出的值,并在函数定义体的当前位置暂停。当无数据返回时,生成器对象会抛出StopIteration
异常。
例子:
import re
import reprlib
RE_WORD = re.compile("\w+")
class Sentence:
def __init__(self, text):
self.text = text
def __iter__(self):
for match in RE_WORD.finditer(self.text):
yield matc.group()
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 生成器表达式创建生成器
生成器表达式可以理解为列表推导的惰性版本: 不会迫切地构建列表,而是返回一个生成器,按需惰性生成元素。
列表表达式。 会马上加载所有的元素到内存中
[i for i in range(10)]
1
生成器表达式: 会得到一个生成器对象,可以通过next或者循环的方式惰性求值。
(i for i in range(10))
1
虽然下面的__iter__
没有yield
关键字,但是却有具有生成器表达式,所以__iter__
得到的也是一个生成器对象
。
例子:
class A:
def __iter__(self):
return (x*3 for x in range(10))
1
2
3
2
3
上次更新: 2023/05/01, 18:02:43