Discuss / Python / filter() 到底做了什么?

filter() 到底做了什么?

Topic source

在生成素数的例子中, 对生成器it进行了过滤,在这里,过滤具体做了哪些工作? 既然生成器it的结果集是无限的,又怎么能做到“依次作用于每个元素”。还是说只是在生成器的外围再加一层限制条件,filter()返回的it是经过一层一层 filter()限定条件包装过后的生成器?

Todayzhou

#2 Created at ... [Delete] [Delete and Lock User]

x: x % n > 0 这就是对it的过滤,比如第一遍,n的值为3,然把it的每个数都进行一遍运算,比如5%3,7%3,9%3,这里9%3的时候值等于,所以结果为false,就被过滤了,然后把过来的iterator传给

    n = next(it) # 返回序列的第一个数
    yield n
    it = filter(_not_divisible(n), it) # 构造新序列

重新执行,n就等于,然后filter又把能被5整除的值给过滤掉了。 可能是因为_odd_iter里用了yield,所以每次+2以后就停止了,也就是每次将L传入filter的时候,实际上就只有下一个值而已,我也是刚自己琢磨出来的,不知道将的对不对! 望大神回复。 我下面留了Q群,不介意的话可以加上,有问题可以共同探讨!

Todayzhou

#3 Created at ... [Delete] [Delete and Lock User]

不对,我好像理解的不对,如果只是下一个值的话,第一遍n=3的时候,就无法过滤9了。。。 不知道是咋过滤it的。。

Todayzhou

#4 Created at ... [Delete] [Delete and Lock User]

还是觉得在_odd_iter里就直接while n<100,比如容易理解。。

wasci

#5 Created at ... [Delete] [Delete and Lock User]

按我的理解啊,这个东西其实返回的是一个生成器,本质上还是个函数 当n为7的时候,返回值就是

在此插入代码
filter(_not_divisible(7), filter(_not_divisible(5),filter(3, it)))

当然这样的话,层数会越来越多,但Python内部估计有些什么优化方法,可以让速度快一点。

本人也是新手,个人见解。


  • 1

Reply