迭代器
区分iterable和iterator两个概念:
可迭代对象 iterable:
可迭代的对象的意思是就是说这个实体是可迭代的,例如字符、列表、元组、字典、迭代器等等,可以用for … in进行循环,可以使用for循环迭代的标志是内部实现了__iter__方法。
迭代器 iterator:
iterator必定是iterable的,因此其必然含有__iter__方法,此方法保证了iterator是可以迭代的。与iterable相比iterator多了一个next()方法,next()方法用于定制for循环时具体的返回值及返回顺序以及处理StopIteration异常等。
例子中Counter是迭代器 iterator,直接使用for循环时,隐藏了__iter__和__next__的细节。
for i in c:
print(i, end='')
而下面的代码展示了迭代器中__iter__和__next__的细节
iterater = iter(c)
while True:
try:
x = iterater.__next__()
print(x, end=' ')
except StopIteration as e:
break
完整例子
class Counter(object):
def __init__(self, low, high):
self.current = low
self.high = high
def __iter__(self):
return self
def __next__(self):
# 返回下一个值直到当前值大于 high
if self.current > self.high:
raise StopIteration
else:
self.current += 1
return self.current - 1
if __name__ == '__main__':
c = Counter(5, 10)
# for i in c:
# print(i, end='')
iterater = iter(c)
while True:
try:
x = iterater.__next__()
print(x, end=' ')
except StopIteration as e:
break
生成器
generator对象是一种特殊的iterator函数。‘generators provide a convenient way to implement the iterator protocol.’
生成器会在执行过程中保存执行的上下文环境,并在下次循环中从yield语句后继续执行。这解释了生成器节约内存,适用于大数据处理。
生成器的创建办法有两种:
通过函数创建,称作generator function
通过列表推导式创建,称作generator expression
generator function
通过函数创建的标志是yield关键字,yield的效果可以“看作”return。
同样的例子使用generator function
def counter_generator(low, high):
while low <= high:
yield low
low += 1
if __name__ == '__main__':
for i in counter_generator(5,10):
print(i, end=' ')
generator expression
生成器表达式是列表推导式和生成器的一个高性能,内存使用效率高的推广。
列表推导式
sum([x*x for x in range(1,10)])
生成器表达式
sum(x*x for x in range(1,10))
g = (x*x for x in range(1,10))
其中g是生成器表达式
注1
无法创建一个可重复使用的生成器,但可以创建一个对象,将它的 iter 方法调用得到一个生成器。
class Counter(object):
def __init__(self, low, high):
self.low = low
self.high = high
def __iter__(self):
counter = self.low
while self.high >= counter:
yield counter
counter += 1
gobj = Counter(5, 10)
for num in gobj:
print(num, end=' ')
上面的 gobj 并不是生成器或迭代器,因为它不具有 next 方法,只是一个可迭代对象,生成器是一定不能重复循环的。而 gobj.iter() 是一个生成器,因为它是一个带有 yield 关键字的函数。
Reference:
Python迭代器,生成器(iterator,generator)详解
完全理解Python迭代对象、迭代器、生成器