完全理解Python迭代对象、迭代器、生成器
2018-08-28 本文已影响0人
__robin
- 容器是一系列元素的集合(
str、list、set、dict、file、sockets
对象),容器都可以被迭代(用在for
,while
等语句中),因此他们被称为可迭代对象(iterable
) - 可迭代对象(
iterable
)实现了__iter__
方法, 该方法返回一个迭代器对象 如代码示例,或者实现了__getitem__
方法, 而且其参数是从零开始的索引 - 任何实现了
__iter__
和__next__
方法的对象都是迭代器(iterator
),__iter__
返回迭代器自身,__next__
返回容器中的下一个值, 如果容器中没有更多元素了,则抛出StopIteration
异常,至于它们到底是如何实现的这并不重要。 - 迭代器持有一个内部状态的字段,用于记录下次迭代返回值,迭代器不会一次性把所有元素加载到内存,而是需要的时候才生成返回结果。
- 生成器其实是一种特殊的迭代器,不过这种迭代器更加优雅。它不需要再像上面的类一样写
__iter__()
和__next__()
方法了,只需要一个yiled
关键字。 生成器一定是迭代器(反之不成立)。 - 生成器有两种表现形式, 生成器函数(
yiled
)和生成器表达式
import re
from _collections_abc import Iterable, Iterator
class Sentence:
def __init__(self, text):
self.text = text
self.words = re.compile('\w+').findall(text)
def __iter__(self):
return SentenceIterator(self.words)
class SentenceIterator:
def __init__(self, words):
self.words = words
self.index = 0
def __next__(self):
try:
word = self.words[self.index]
except IndexError:
raise StopIteration()
self.index += 1
return word
def __iter__(self):
return self
print(issubclass(Sentence, Iterable))
print(issubclass(Sentence, Iterator))
print(issubclass(SentenceIterator, Iterator))
#输出结果:
True
False
True
关系图如下: