Python的生成器和迭代器之间的区别

发布于 2021-02-02 23:18:47

迭代器和生成器有什么区别?有关何时使用每种情况的一些示例会有所帮助。

关注者
0
被浏览
112
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    iterator是一个更笼统的概念:其类具有next方法(__next__在Python 3中)和具有__iter__方法的任何对象return self

    每个生成器都是一个迭代器,但反之亦然。生成器是通过调用具有一个或多个yield表达式(yield在Python 2.5及更早版本中为语句)的函数而构建的,并且该函数是满足上一段对的定义的对象iterator

    当你需要一个具有某些复杂的状态维护行为的类时,或者想要暴露除next(和__iter____init__)之外的其他方法时,你可能想使用自定义迭代器,而不是生成器。通常,一个生成器(有时,对于足够简单的需求,一个生成器表达式)就足够了,并且它更容易编写代码,因为状态维护(在合理范围内)基本上是由挂起和恢复帧“为你完成的”。

    例如,生成器例如:

    def squares(start, stop):
        for i in range(start, stop):
            yield i * i
    
    generator = squares(a, b)
    

    或等效的生成器表达式(genexp)

    generator = (i*i for i in range(a, b))
    

    将需要更多代码来构建为自定义迭代器:

    class Squares(object):
        def __init__(self, start, stop):
           self.start = start
           self.stop = stop
        def __iter__(self): return self
        def next(self): # __next__ in Python 3
           if self.start >= self.stop:
               raise StopIteration
           current = self.start * self.start
           self.start += 1
           return current
    
    iterator = Squares(a, b)
    

    但是,当然,有了类,Squares你可以轻松地提供其他方法,即

        def current(self):
           return self.start
    

    如果你对应用程序中的此类额外功能有实际需求。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看