2-1迭代对象、迭代器、生成器

作者: cuzz_ | 来源:发表于2018-03-01 17:59 被阅读13次

    可迭代对象、迭代器和生成器的关系

    image.png

    可迭代对象

    可迭代对象实现某种接口,对与列表内部实现了__iter__()方法,而对于字符串内部并没有__iter__()方法,而有__getitem__()也就是说当我们使用iter(x)迭代一个对象时,先回调用本身的__iter__()方法,如果没有__iter__(),有__getitem__()方法也可以

    反向迭代

    实现了__reversed__()方法

    迭代器

    必须满足迭代对象的条件,而且实现了__next__()

    class FloatRange(object):
        def __init__(self, start, end, step=0.1):
            self.start = start
            self.end = end
            self.step = step
            self.flag = start - step
    
        def __iter__(self):
            t = self.start
            while t <= self.end:
                yield t
                t += self.step
    
        def __reversed__(self):
            t = self.end
            while t >= self.start:
                yield t
                t -= self.step
    
        def __next__(self):
            self.flag += self.step
            if self.flag > self.end:
                raise StopIteration
            return self.flag
    
    # 正向迭代
    for x in FloatRange(1.0, 2.0, 0.2):
        print(x)
    
    # 反向迭代
    for x in reversed(FloatRange(1.0, 2.0, 0.2)):
        print(x)
    
    # 迭代器
    r = FloatRange(0.0, 5.0, 0.5)
    print(next(r))
    print(next(r))
    

    生成器

    Python使用生成器对延迟操作提供了支持。所谓延迟操作,是指在需要的时候才产生结果,而不是立即产生结果。这也是生成器的主要好处。

    python有两种不同的方式提供生成器:

    生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行

    def fibonacci(n): 
        a, b, counter = 0, 1, 0
        while True:
            if (counter > n): 
                return
            yield a
            a, b = b, a + b
            counter += 1
    f = fibonacci(10) 
    

    生成器表达式:实现了迭代器接口,类似于列表推导,将列表推导中的中括号替换成圆括号,生成器返回的结果一个对象,而不是一次构建完整的列表

    squares = (x**2 for x in range(10)) 
    

    相关文章

      网友评论

        本文标题:2-1迭代对象、迭代器、生成器

        本文链接:https://www.haomeiwen.com/subject/swfnxftx.html