python 中用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)


謝 @孟雪峰 邀,我猜題主是沒看懂那個閉包,如果有興趣其實還可以去了解一下lambda演算。

Python的filter第一個參數要求是個一元謂詞,但事實上我們篩選過程中有兩個參數:待篩的元素和當前篩選所用因數。由於每輪篩選時因數是一定的,所以我們可以通過每輪生成一個攜帶因數的閉包來變二元謂詞為一元謂詞。

知道了思路以後,再看一下這個lambda表達式:

lambda x : x % n &> 0

簡單理解,你可以把這個當成一個和下面這貨等價的匿名函數:

def anonymous(x)
return x % n &> 0

只是它攜帶了_not_divisible提供的因數而已


順便說一句樓主的代碼是python3的。python2中的filter返回一個list

python2版本

import itertools

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 = itertools.ifilter(_not_divisible(n), it)


def _not_divisible(n):
return lambda x: x % n &> 0

調用 _not_divisible(n), 返回的是一個匿名函數。這個函數接受一個參數 x, 返回 x % n &> 0。

即,調用 _not_divisible(n) 後返回的是一個能過濾掉能被 n 整除的數,留下不能被 n 整除的數的函數。


while True:
n = next(it) # 返回序列的第一個數
yield n
it = filter(_not_divisible(n), it) # 構造新序列

it這個序列是在 it = _odd_iter()的時候就生成了 還是通過後面循環里的next()來生成的?


推薦閱讀:

<怎麼設計一個函數?> 中代碼的指針實現
第一篇:關於開發環境
惟江上之清風,與山間錕斤銬。
連獲傅盛、張泉靈、盛通股份投資,編程貓的互聯網思維
新手配置webmagic爬蟲開發環境

TAG:編程語言 | Python | 編程 | Python入門 | 素數 |