原文
python內建的filter()
函式用於過濾序列。
和map()
類似,filter()
也接收乙個函式和乙個序列。和map()
不同的是,filter()
把傳入的函式依次作用於每個元素,然後根據返回值是true
還是false
決定保留還是丟棄該元素。
例如,在乙個list中,刪掉偶數,只保留奇數,可以這麼寫:
defis_odd(n):
return n % 2 == 1list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
#結果: [1, 5, 9, 15]
把乙個序列中的空字串刪掉,可以這麼寫:
defnot_empty(s):
return s and
s.strip()
list(filter(not_empty, ['a
', '', '
b', none, '
c', '
']))
#結果: ['a', 'b', 'c']
可見用filter()
這個高階函式,關鍵在於正確實現乙個「篩選」函式。
注意到filter()
函式返回的是乙個iterator
,也就是乙個惰性序列,所以要強迫filter()
完成計算結果,需要用list()
函式獲得所有結果並返回list。
來個難一點的
計算素數的乙個方法是埃氏篩法,它的演算法理解起來非常簡單:
首先,列出從2
開始的所有自然數,構造乙個序列:
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
取序列的第乙個數2
,它一定是素數,然後用2
把序列的2
的倍數篩掉:
3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
取新序列的第乙個數3
,它一定是素數,然後用3
把序列的3
的倍數篩掉:
5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
取新序列的第乙個數5
,然後用5
把序列的5
的倍數篩掉:
7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...
不斷篩下去,就可以得到所有的素數。
用python來實現這個演算法,可以先構造乙個從3
開始的奇數序列:
def_odd_iter():
n = 1
while
true:
n = n + 2
yield n
注意這是乙個生成器,並且是乙個無限序列。然後定義乙個篩選函式:
def_not_divisible(n):
return
lambda x: x % n > 0
defprimes():
yield 2it = _odd_iter() #
初始序列
while
true:
n = next(it) #
返回序列的第乙個數
yield
n it = filter(_not_divisible(n), it) #
構造新序列
這個生成器先返回第乙個素數2
,然後,利用filter()
不斷產生篩選後的新的序列。
由於primes()
也是乙個無限序列,所以呼叫時需要設定乙個退出迴圈的條件:
#列印1000以內的素數:
for n in
primes():
if n < 1000:
(n)
else
:
break
Python之高階函式
一 什麼是高階函式 函式作為實參傳遞給函式的或者函式名為返回值的函式稱為高階函式。1 實參傳遞給函式 2 函式名為返回值 二 系統內建的高階函式 1 map函式 至少需要兩個引數,第乙個引數是函式名,第二個引數是序列 str,list,tuple map功能 把序列中的每乙個元素作為引數,傳給函式進...
Python之高階函式
做過swift開發的童鞋都知道,在swift中有許多的高階函式 map,filter,reduce,zip等 這些在開發中讓我們節省大量 python中同樣有許多的內建函式,但是這裡也只介紹幾個常用的高階函式 根據提供的函式對指定序列做對映,並返回對映後的序列 map function,iterab...
python之高階函式
函式程式設計及其優勢 無 不修改狀態,表示式形式,專注與計算,接近自然語言。便於 熱公升級,無狀態不用考慮併發過程中的資源搶占及鎖問題。函式也是物件,也可以賦值給變數,當然函式的引數也可以為另一函式。map 是 python 內建的高階函式,它接收乙個函式 f 和乙個 list,並通過把函式 f 依...