filter()
函式用於過濾序列。和map()
類似,filter()
也接收乙個函式和乙個序列。和map()
不同的是,filter()
把傳入的函式依次作用於每個元素,然後根據返回值是true
還是false
決定保留還是丟棄該元素。
例如,在乙個list中,刪掉偶數,只保留奇數,可以這麼寫:
def is_odd(n):
return n%2==1
print(list(filter(is_odd,[1,2,4,5,6,9,10,15])))
輸出[1, 5, 9, 15]
把乙個序列中的空字串刪掉,可以這麼寫:
def not_empty(s):
return s and s.strip()
print(list(filter(not_empty,['a','b','',none,'c',' '])))
輸出['a', 'b', 'c']
strip()方法是將字串中首尾指定的字元去掉
s=' a '
print(s.strip())
輸出a
可見用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=1while 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) #返回序列的第乙個數
print(n)
yield n
it=filter(_not_divisible(n),it) #構造新序列
這個生成器先返回第乙個素數2
,然後,利用filter()
不斷產生篩選後的新的序列。
由於primes()
也是乙個無限序列,所以呼叫時需要設定乙個退出迴圈的條件:
for n in primes():
if n<1000:
print(n)
else:
break輸出2
35711
1317
1923
2931
3741
4347
5359
6167
7173
7983
8997
101103
107109
113127
131137
139149
151157
163167
173179
181191
193197
199211
223227
229233
239241
251257
263269
271277
281283
293307
311313
317331
337347
349353
359367
373379
383389
397401
409419
421431
433439
443449
457461
463467
479487
491499
503509
521523
541547
557563
569571
577587
593599
601607
613617
619631
641643
647653
659661
673677
683691
701709
719727
733739
743751
757761
769773
787797
809811
821823
827829
839853
857859
863877
881883
887907
911919
929937
941947
953967
971977
983991
997
注意到iterator
是惰性計算的序列,所以我們可以用python表示「全體自然數」,「全體素數」這樣的序列,而**非常簡潔。
回數是指從左向右讀和從右向左讀都是一樣的數,例如12321
,909
。請利用filter()
篩選出回數:
def is_palindrome(n):
n=str(n)#轉換為字串
return n==n[::-1]#將字串反轉
print(list(filter(is_palindrome,range(1,1000))))
輸出[1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99, 101, 111, 121, 131, 141, 151, 161, 171, 181, 191, 202, 212, 222, 232, 242, 252, 262, 272, 282, 292, 303, 313, 323, 333, 343, 353, 363, 373, 383, 393, 404, 414, 424, 434, 444, 454, 464, 474, 484, 494, 505, 515, 525, 535, 545, 555, 565, 575, 585, 595, 606, 616, 626, 636, 646, 656, 666, 676, 686, 696, 707, 717, 727, 737, 747, 757, 767, 777, 787, 797, 808, 818, 828, 838, 848, 858, 868, 878, 888, 898, 909, 919, 929, 939, 949, 959, 969, 979, 989, 999]
python3 map函式和filter函式詳解
map 函式可以對乙個資料進行同等迭代操作。例如 def f x return x x r map f,1,2,3,4,5,6,7,8,9 print list r map函式傳入的第乙個引數就是函式本身,即f。第二個引數是要操作的資料 map 作為高階函式,事實上它把運算規則抽象了,因此,我們不但...
map函式 filter函式 reduce函式
map函式 map函式的結構為 map 處理方法,可迭代物件 相當於for迴圈遍歷可迭代物件中的每乙個元素,對每乙個元素做指定操作,得到乙個和原始資料順序相同的迭代器。在python3中最終得到的結果是乙個迭代器,可以用list 函式轉化為列表,在python2中map函式的結果就是乙個列表。map...
python學習筆記(二) python基礎函式
python之所以強大好用,離不開可以呼叫的各種庫,同時也和他自身函式相關,下面為學習python函式相關知識後整理知識點。1 python函式引數 python函式定義簡單但靈活度非常大。除正常定義的必選引數外,還可以使用預設引數,可變引數,關鍵字引數。預設引數 def power 5 x 2 在...