在学习廖雪峰的Python3.5 教程
在 filter 这一章有一个示例是“如何选出素数”,这里我有一些疑问,希望有人能够帮我解答,代码如下:
def _odd_iter():
n = 1
while True:
n = n + 2
yield n
def _not_divisible(n):
return lambda x: x%n > 0
def primes():
yield 2
it = _odd_iter();
while True:
n = next(it)
yield n
it = filter(_not_divisible(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 是惰性的计算呀,这里不太理解如何能够不断的嵌套的
纠正一下你的这句话
其实才是真正的
filter
的入参,而
x
指的是
filter
的另一个入参
it
。
这里的
it
是一个生成器对象,而
filter
每次会得到一个由它生成的值。所以
x
指的不是
it
,只是
it
产生的一个值。
至于怎么实现将
it
中的数据遍历下去,这个很好解释。
我们知道
filter
接受两个参数
function
和
iterable
。而
filter
的功能就等价于
(item for item in iterable if function(item))
,它就是这么遍历完的。。。
it
里面到底是啥? 正如你知道的,它就是一个生成器对象。每当一次调用结束后它就会挂起,直到下一次被激活。
while True:
n = next(it)
yield n
it = filter(_not_divisible(n), it)#怎么就实现了循环遍历 it了?
它的实质就是把得到的每个素数从生成器中剔除。
建议你可以看一下官方文档