zoukankan      html  css  js  c++  java
  • python中的迭代器和生成器

    迭代器

    看如下代码:

    class A:
    def __init__(self, data): self.data = data def __iter__(self): return self # __iter__方法返回的就是一个迭代器。reurn的这个self对象就是下面的__next__方法的结果,如果不写__next__方法,将return self替换为(i+1 for i in range(x) if x < 6)即可 def __next__(self): if self.data > 7: raise StopIteration else: self.data += 1 return self.data for i in A(5): print(i)

    输出结果:

    6

    7

    8

    这里面的for ... in ... 做了两件事:

    1. 调用了A的__iter__()方法,就是要得到一个iteration迭代器,就是这个self,而这里的self此时是__next__()方法返回的迭代器。
    2. 循环调用了__next__()方法。

    对于A这个类,它里面定义了__iter__()和__next__()方法,他就是一个可迭代的类。也可以说是一个可迭代的对象(python中一切皆对象)。

    含有__next__()函数的对象都是一个迭代器,所以A也可以说是一个迭代器。如果去掉__itet__()函数,A这个类也不会报错。

    如下代码所示:

    class A:
    
        def __init__(self, data):
            self.data = data
    
        def __next__(self):
            if self.data > 7:
                raise StopIteration
            else:
                self.data += 1
                return self.data
    a = A(5)
    print(a.__next__())
    print(a.__next__())
    print(a.__next__())

    生成器

    生成器是一种特殊的迭代器。当调用f()函数时,生成器实例化并返回,这时并不会执行任何代码,生成器处于空闲状态,注意这里p, c= 0, 1并未执行。然后这个生成器被包含在list()中,list会根据传进来的参数生成一个列表,所以它对f()对象(一切皆对象,函数也是对象)调用__next()__方法:

    # 斐波那契数列
    def
    f(end = 1000): p, c=0,1 while c < end: yield c p, c=c, c+p print(list(f()))

    结果如下:

    [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]

    也可以这样:

    def f(end = 1000):
        p, c=0,1
        while c < end:
            yield c
            p, c=c, c+p
    
    a = f()print(a.__next__())
    print(a.__next__())
    print(a.__next__())
    print(a.__next__())
    print(a.__next__())
    print(a.__next__())

    一次只取一个数。

  • 相关阅读:
    学机器学习,不会数据分析怎么行——数据可视化分析(matplotlib)
    关于 tensorflow-gpu 中 CUDA 和 CuDNN 版本适配问题
    人工智能学习资料
    JAVA Socket通信 打造属于自己的网盘
    在 Windows 10 中使用 OpenAI Spinning Up
    【LeetCode】回文串专题
    【LeetCode】45.跳跃游戏2
    【LeetCode】23.最大子序和
    【LeetCode】3. 无重复字符的最长子串(典型滑动窗口)
    【LeetCode】202.快乐数
  • 原文地址:https://www.cnblogs.com/aaronthon/p/10176432.html
Copyright © 2011-2022 走看看