解析Python中的生成器及其与迭代器的差异
生成器 >>>def myG(): ... yield 1 ... yield 2 ... yield 3 ... >>>g=myG() >>>next(g) 1 >>>next(g) 2 >>>next(g) 3 >>>next(g) Traceback (most recent call last): File "<stdin>",line 1,in <module> StopIteration >>>g2=myG() >>>for i in g2: ... print(i) 1 2 3 生成器表达式 >>>a=[7,8,9] >>>b=[i**2 for i in a] >>>b [49,64,81] >>>ib=(i**2 for i in a) >>>ib <generator object <genexpr> at 0x7f72291217e0> >>>next(ib) 49 >>>next(ib) 64 >>>next(ib) 81 >>>next(ib) Traceback (most recent call last): File "<stdin>",in <module> StopIteration 迭代器(Iterator)与生成器(Generator)的区别 每个生成器都是一个迭代器,但是反过来不行。通常生成器是通过调用一个或多个yield表达式构成的函数s生成的。同时满足迭代器的定义。 当你需要一个类除了有生成器的特性之外还要有一些自定义的方法时,可以使用自定义的迭代器,一般来说生成器更方便,更简单。 def squares(start,stop): for i in xrange(start,stop): yield i*i 等同于生成器表达式: (i*i for i in xrange(start,stop)) 列表推倒式是: [i*i for i in xrange(start,stop)] 如果是构建一个自定义的迭代器: class Squares(object): def __init__(self,start,stop): self.start = start self.stop = stop def __iter__(self): return self def next(self): if self.start >= self.stop: raise StopIteration current = self.start * self.start self.start += 1 return current 此时,你还可以定义自己的方法如: def current(self): return self.start 两者的相同点:对象迭代完后就不能重写迭代了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |