Python
Python - 迭代器和生成器区别(Iterator vs Generator)
下面简单说一下迭代器和生成器的区别: 通常生成器是通过调用一个或多个yield表达式构成的函数。每个生成器都是迭代器。 而迭代器是一个抽象的概念,包括了iterable和iterator这两种实现。
下面简单说一下迭代器和生成器的区别:
通常生成器是通过调用一个或多个yield表达式构成的函数。每个生成器都是迭代器。
而迭代器是一个抽象的概念,包括了iterable和iterator这两种实现。
Iterator & Generator
iterable: 它表示了一个可以重复迭代的对象,判断一个对象是否可以iterable, 是否可以for循环, 是否定义了__getitem__方法, 是否定义了__iter__方法返回一个iteratoriterator: 特殊之处是只能迭代一次,判断一个对象是否是iterator,是否定义了__iter__方法,并且必须返回自身,是否定义了__next__方法
PS. str和list都是典型的iterable而不是iterator
用一个公交车的例子再来看一遍:
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: 看如下表达式,两者是等价的。
def squares(length):
for i in range(length):
yield i*i
squares = [i**2 for i in range(10)]
用yield实现斐波那契数列:
def fibonacci():
a=b=1
yield a
yield b
while True:
a,b = b,a+b
yield b