python 中用filter求素数的时候,这里的筛选函数是啥意思啊

def _not_divisible(n): return lambda x: x % n \u0026gt; 0调用 _not_divisible(n), 返回的是一个匿名函数。这个函数接受一个参数 x, 返回 x % n \u0026gt; 0。即,调用 _not_divisible(n) 后返回的是一个能过滤掉能被 n 整除的数,留下不能被 n 整除的数的函数。
■网友
顺便说一句楼主的代码是python3的。python2中的filter返回一个listpython2版本import itertoolsdef _odd_iter(): n = 1 while True: n = n + 2 yield ndef _not_divisible(n): return lambda x: x % n \u0026gt; 0def primes(): yield 2 it = _odd_iter() while True: n = next(it) yield n it = itertools.ifilter(_not_divisible(n), it)
■网友
谢 @孟雪峰 邀,我猜题主是没看懂那个闭包,如果有兴趣其实还可以去了解一下lambda演算。Python的filter第一个参数要求是个一元谓词,但事实上我们筛选过程中有两个参数:待筛的元素和当前筛选所用因数。由于每轮筛选时因数是一定的,所以我们可以通过每轮生成一个携带因数的闭包来变二元谓词为一元谓词。知道了思路以后,再看一下这个lambda表达式:lambda x : x % n \u0026gt; 0简单理解,你可以把这个当成一个和下面这货等价的匿名函数:def anonymous(x) return x % n \u0026gt; 0只是它携带了_not_divisible提供的因数而已
■网友
while True: n = next(it) # 返回序列的第一个数 yield n it = filter(_not_divisible(n), it) # 构造新序列
【python 中用filter求素数的时候,这里的筛选函数是啥意思啊】 it这个序列是在 it = _odd_iter()的时候就生成了 还是通过后面循环里的next()来生成的?


    推荐阅读