本文共 1314 字,大约阅读时间需要 4 分钟。
实现了__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) # 返回一个迭代器
函数中有yield
关键字的,就是生成器函数
下面的__iter__
是一个生成器函数
,通过该生成器函数
创建生成器对象,包装生成器函数
的定义。把生成器传给next(...)
函数时,生成器函数
会向前,执行函数定义体中的下一个yield语句,返回产出的值,并在函数定义体的当前位置暂停。当无数据返回时,生成器对象会抛出StopIteration
异常。
例子:
import reimport reprlibRE_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()
生成器表达式可以理解为列表推导的惰性版本: 不会迫切地构建列表,而是返回一个生成器,按需惰性生成元素。
列表表达式。 会马上加载所有的元素到内存中
[i for i in range(10)]
生成器表达式: 会得到一个生成器对象,可以通过next或者循环的方式惰性求值。
(i for i in range(10))
虽然下面的__iter__
没有yield
关键字,但是却有具有生成器表达式,所以__iter__
得到的也是一个生成器对象
。
例子:
class A: def __iter__(self): return (x*3 for x in range(10))
转载地址:http://kakjn.baihongyu.com/