Python - 迭代器和生成器区别(Iterator vs Generator)
Contents
下面简单说一下迭代器和生成器的区别:
通常生成器是通过调用一个或多个yield
表达式构成的函数。每个生成器都是迭代器。
而迭代器是一个抽象的概念,包括了iterable
和iterator
这两种实现。
Iterator & Generator
iterable
: 它表示了一个可以重复迭代的对象,判断一个对象是否可以iterable
, 是否可以for
循环, 是否定义了__getitem__
方法, 是否定义了__iter__
方法返回一个iterator
iterator
: 特殊之处是只能迭代一次,判断一个对象是否是iterator
,是否定义了__iter__
方法,并且必须返回自身,是否定义了__next__
方法
PS. str
和list
都是典型的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
28class 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 | def squares(length): |
用yield
实现斐波那契数列:1
2
3
4
5
6
7def fibonacci():
a=b=1
yield a
yield b
while True:
a,b = b,a+b
yield b
Author: itabas016
Link: https://tech.itabas.com/2017/09/17/python/iterator-difference-with-generator/
License: CC BY-NC-ND 4.0