在学习廖雪峰的Python3.5 教程
在 filter 这一章有一个示例是“如何选出素数”,这里我有一些疑问,希望有人能够帮我解答,代码如下:
def _odd_iter():
n = 1
while True:
n = n + 2
yield n
def _not_pisible(n):
return lambda x: x%n > 0
def primes():
yield 2
it = _odd_iter();
while True:
n = next(it)
yield n
it = filter(_not_pisible(n), it)#怎么就实现了循环遍历 it了?
for n in primes():
if n < 30:
print(n)
else:
break
代码中我标有注释的一句话那里我能够明白是:
lambda x: x%n > 0
其实才是真正的 filter 的入参,而 x
指的是 filter 的另一个入参 it
。
我的疑问是,这里怎么就实现了将 it
中的数据遍历循环下去了呢?
换句话说,it
这个 Generator 里面到底是啥?
比如:
n = 3
yield 3
it = filter(lambda x: x % 3 >0, it) # 这个里面it 到底有了哪些变化了?如何实现了过滤掉了素数?
it
等于了一个经过 filter 了个 it
,虽然说是一种递归、或者嵌套的计算,但 Generator 是惰性的计算呀,这里不太理解如何能够不断的嵌套的
文を修正してください
ここで
it
はジェネレーター オブジェクトであり、filter
はそれによって生成された値を毎回取得します。したがって、x
はit
を参照するのではなく、単にit
によって生成された値を参照します。it
内のデータをトラバースする方法については、簡単に説明できます。filter
は 2 つのパラメータfunction
とiterable
を受け入れることがわかっています。filter
の関数は(item for item in iterable if function(item))
と同等であり、これがその横断方法です。 。 。
リーリーit
中には何が入っているの? ご存知のとおり、これはジェネレーター オブジェクトです。各呼び出しの後、次回アクティブ化されるまでハングします。本質は、ジェネレータから取得した各素数を削除することです。
公式ドキュメントを参照することをお勧めします