我是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而不是主流。
非常感谢您帮助我
答案 0 :(得分:0)
我会尽力解释它。
primes()
返回一个生成器。当从它(而不是primes()
)产生时,会发生以下情况:
2
。it
设置为odd_iter()
返回的生成器,生成以3
开头的所有奇数。it
获取下一个元素(第一次是3
)并将其生成。it
被分配了一个过滤器对象,该过滤器对象使用前一个it
,并且只允许数字通过它不能被最后产生的数字整除。这意味着每次获得素数时,此生成器会再嵌套一层。也许通过查看it
是什么来最好地说明这一点:
all odd numbers starting with 3
all numbers not divisible by 3 in (all odd numbers starting with 5)
all numbers not divisible by 5 in (all numbers not divisible by 3 in (all odd numbers starting with 7))
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)))
正如我在评论中所说,next(primes())
总是返回2的原因是每次调用primes()
都会返回一个新生成器。你的意思是:
>>> p = primes()
>>> next(p)
2
>>> next(p)
3
答案 1 :(得分:0)
此代码中有无限数量的生成器。
it
始终是一个发电机。每次循环时,都会发出一个素数,it
将被自身的过滤版本替换,从而消除该数字的倍数。示例:在发出数字11时,it
为:
...共有5个活动生成器,包括primes()
本身。