日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python filter函数_python基础——filter函数

發布時間:2025/3/12 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。