Python基礎 filter函式

2021-08-31 23:29:08 字數 4205 閱讀 3704

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表示「全體自然數」,「全體素數」這樣的序列,而**非常簡潔。

回數是指從左向右讀和從右向左讀都是一樣的數,例如12321909。請利用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 在...