下面简单说一下迭代器和生成器的区别:

通常生成器是通过调用一个或多个yield表达式构成的函数。每个生成器都是迭代器。
而迭代器是一个抽象的概念,包括了iterableiterator这两种实现。

Iterator & Generator

  • iterable: 它表示了一个可以重复迭代的对象,判断一个对象是否可以iterable, 是否可以for循环, 是否定义了__getitem__方法, 是否定义了__iter__方法返回一个iterator
  • iterator: 特殊之处是只能迭代一次,判断一个对象是否是iterator,是否定义了__iter__方法,并且必须返回自身,是否定义了__next__方法

PS. strlist都是典型的iterable而不是iterator

用一个公交车的例子再来看一遍:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Bus(object):   # 只是iterable而不是iterator

def __init__(self, *args):
self.stops = list(args)

def __iter__(self): # 并没有返回自身
return BusStopIterator(self)

class BusStopIterator(object): # iterator

def __init__(self, bus):
self.stops = bus.stops
self.index = 0

def __iter__(self):
return self

def __next__(self):
if self.index == len(self.stops):
raise StopIteration
stop = self.stops[self.index]
self.index += 1
return stop

if __name__ == '__main__':
bus = Bus('XinZhuang RailWay Station', 'WaiHuan Road', 'LianHua Road', 'JinJiangLeYuan')
for stop in bus:
print(stop)
  • generator: 看如下表达式,两者是等价的。
1
2
3
4
5
def squares(length):
for i in range(length):
yield i*i

squares = [i**2 for i in range(10)]

yield实现斐波那契数列:

1
2
3
4
5
6
7
def fibonacci():
a=b=1
yield a
yield b
while True:
a,b = b,a+b
yield b