发电机真的如何工作?(Python3.5)

时间:2017-05-02 13:01:30

标签: python python-3.5

我是python中的新手。我最近了解了发电机和滤波器(我认为它也是发电机)。然后我对以下代码感到困惑:

>>> def _not_divisible(n):
        return lambda x: x % n > 0

>>> def _odd_iter():
        n = 1
        while True:
                n = n + 2
                yield n

>>> def primes():
        yield 2
        it = _odd_iter()
        while True:
                n = next(it)
                yield n
                it = filter(_not_divisible(n), it)

>>> for n in primes():
        if n < 1000:
                print(n)
        else:
                break

据我了解,代码中实际上有三个生成器(包括过滤器)。 &#39; _odd_iter&#39; 是所有奇数。 &#39;素数&#39; 都是素数。 &#39; filter&#39; 是除2之外的素数。

但是在素数()中,&#39; next&#39; &#39; it&#39; 的第一个元素,然后它通过到&#39; _not_divisible&#39; ,所以我认为方程&#39; it = filter(...)&#39; 左边< strong>&#39; 是一个等于&#39; n&#39; 的数字。 &#39; 如何再次传递给&#39; next()&#39;

>>> next(primes())
2

还有一个问题,无论我使用多少次&#39; next&#39;,它总是返回2而不是主流。

非常感谢您帮助我

2 个答案:

答案 0 :(得分:0)

我会尽力解释它。

primes()返回一个生成器。当从(而不是primes())产生时,会发生以下情况:

  1. 一次产生2
  2. it设置为odd_iter()返回的生成器,生成以3开头的所有奇数。
  3. 输入无限循环。
  4. 我们从it获取下一个元素(第一次是3)并将其生成。
  5. 现在出现了棘手的部分:it被分配了一个过滤器对象,该过滤器对象使用前一个it,并且只允许数字通过它不能被最后产生的数字整除。
  6. 转到4。
  7. 这意味着每次获得素数时,此生成器会再嵌套一层。也许通过查看it是什么来最好地说明这一点:

    1. all odd numbers starting with 3
    2. all numbers not divisible by 3 in (all odd numbers starting with 5)
    3. all numbers not divisible by 5 in (all numbers not divisible by 3 in (all odd numbers starting with 7))
    4. all numbers not divisible by 7 in (all numbers not divisible by 5 in (all numbers not divisible by 3 in (all odd numbers starting with 9)))
    5. ...
    6. 正如我在评论中所说,next(primes())总是返回2的原因是每次调用primes()都会返回一个新生成器。你的意思是:

      >>> p = primes()
      >>> next(p)
      2
      >>> next(p)
      3
      

答案 1 :(得分:0)

此代码中有无限数量的生成器。

it始终是一个发电机。每次循环时,都会发出一个素数,it将被自身的过滤版本替换,从而消除该数字的倍数。示例:在发出数字11时,it为:

  • 之上删除7的倍数的过滤器
    • 之上删除5的倍数的过滤器
      • 之上删除3的倍数的过滤器
        • 原始数字生成器。

...共有5个活动生成器,包括primes()本身。