python filter函数_python基础——filter函数
python基礎——filter函數
Python內建的filter()函數用于過濾序列。
和map()類似,filter()也接收一個函數和一個序列。和map()不同的是,filter()把傳入的函數依次作用于每個元素,然后根據返回值是True還是False決定保留還是丟棄該元素。
例如,在一個list中,刪掉偶數,只保留奇數,可以這么寫:
#在一個list中,刪掉偶數,只保留奇數
defis_odd(n):return n%2==1L1=filter(is_odd,[1,2,3,4,5,6,7,8,9,10,15])print(list(L1))#輸出:[1,3,5,7,9,15]
把一個序列中的空字符串刪掉,可以這么寫:
#把一個序列的空字符串刪掉
defnot_empty(s):returns.strip()
L2=filter(not_empty, ['A', '', 'B', 'C', ' '])print(list(L2))#輸出結果:['A','B','C']
'''strip()函數說明:
----------------------------------------------------------------------
s.strip(rm) 刪除s字符串中開頭、結尾處,位于 rm刪除序列的字符
s.lstrip(rm) 刪除s字符串中開頭處,位于 rm刪除序列的字符
s.rstrip(rm) 刪除s字符串中結尾處,位于 rm刪除序列的字符
注意:
1. 當rm為空時,默認刪除空白符(包括'\n', '\r', '\t', ' ')
-----------------------------------------------------------------------'''
可見用filter()這個高階函數,關鍵在于正確實現一個“篩選”函數。
注意到filter()函數返回的是一個Iterator,也就是一個惰性序列,所以要強迫filter()完成計算結果,需要用list()函數獲得所有結果并返回list。
用filter求素數
計算素數的一個方法是埃氏篩法,它的算法理解起來非常簡單:
首先,列出從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開始的奇數序列:
#用filter求素數#可以先構造一個從3開始的奇數序列:(從3開始的偶數序列都不是素數)
def_odd_iter():
n=1
whileTrue:
n+=2
yield n #構造一個生成器,并且是一個無限序列
注意這是一個生成器,并且是一個無限序列。
然后定義一個篩選函數:
#定義一個篩選函數
def_not_divisible(n):return lambda x:x%n >0#Lambda表示生成一個匿名函數#帶有一個參數的Lambda表達式和對應的非匿名函數:
#舉例:#def f(n):#return lambda x: x / n#print ( f(1)(2) ) # n=1; x=2
最后,定義一個生成器,不斷返回下一個素數:
#最后,定義一個生成器,不斷返回下一個素數
defprimes():yield 2 #先返回第一個素數2,然后利用filter()函數不斷產生篩選后的新序列
it=_odd_iter()whileTrue:
n=next(it) #取出序列的第一個數
yield n #返回序列的第一個數
it=filter(_not_divisible,it) #此處用_not_divisible()函數去作用it列表中的每一個數(設為x),
#則函數實際的模樣為_not_divisible(n)(x),函數所執行的操作為:x%n >0,當可以整除時,丟棄,當不能整除時,篩選出來
這個生成器先返回第一個素數2,然后,利用filter()不斷產生篩選后的新的序列。
由于primes()也是一個無限序列,所以調用時需要設置一個退出循環的條件:
#打印1000以內的素數:
defmain():for n inprimes():if n<1000:print(n)else:break
if __name__=='__main__':
main()'''如果我們是直接執行某個.py文件的時候,該文件中那么”__name__ == '__main__'“是True,
但是我們如果從另外一個.py文件通過import導入該文件的時候,
這時__name__的值就是我們這個py文件的名字而不是__main__。
這個功能還有一個用處:調試代碼的時候,在”if __name__ == '__main__'“中加入一些我們的調試代碼,
我們可以讓外部模塊調用的時候不執行我們的調試代碼,但是如果我們想排查問題的時候,
直接執行該模塊文件,調試代碼能夠正常運行'''
注意到Iterator是惰性計算的序列,所以我們可以用Python表示“全體自然數”,“全體素數”這樣的序列,而代碼非常簡潔。
練習
回數是指從左向右讀和從右向左讀都是一樣的數,例如12321,909。請利用filter()濾掉非回數:
#練習
'''回數是指從左向右讀和從右向左讀都是一樣的數,例如12321,909。
請利用filter()濾掉非回數:'''
defis_palindrome(n):return str(n)==str(n)[::-1] #將輸入的數字轉為字符串,將翻轉前和翻轉后的進行比較,如果一致,表示滿足回數
print('1-15000的回數有:')print(list(filter(is_palindrome,range(1,15000))))
運行結果:
小結
filter()的作用是從一個序列中篩出符合條件的元素。由于filter()使用了惰性計算,所以只有在取filter()結果的時候,才會真正篩選并每次返回下一個篩出的元素。
總結
以上是生活随笔為你收集整理的python filter函数_python基础——filter函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python怎么安装request_【p
- 下一篇: horizon client 无法识别域