目錄
定義與參數說明
特點
使用場景
常用操作
篩選偶數
去除空字符串
篩選正數
篩選字典
配合集合與元組
注意事項
?
定義與參數說明
filter函數是Python內置的高階函數之一,用于篩選可迭代對象中的元素,根據返回值的布爾結果(True 或 False)決定是否保留該元素。
語法結構:
filter(function, iterable)
- function:過濾函數,必須是一個可以接受單個參數并返回布爾值的函數。返回True→元素保留;返回False→元素丟棄;若傳入None,則默認按元素本身的布爾值來判斷,False的元素會被過濾掉。
- iterable:可迭代對象,如list、tuple、set、dict、str等。
- 返回值:返回一個filter對象(迭代器),需要通過list()、tuple()或set()轉換才能看到完整結果。
特點
特點 | 解釋 |
高階函數 | 函數作為參數傳遞 |
惰性迭代 | 不會一次性生成結果,而是迭代時才逐個判斷 |
結果有序 | 對有序序列(list、tuple、str),保持原順序 |
可與lambda結合 | 簡潔表達條件 |
返回子集 | 最終結果是原集合的子集 |
使用場景
- 篩選數據:保留滿足某個條件的元素。
- 數據清洗:去掉無效、空值、零值等數據。
- 條件過濾:快速應用邏輯判斷。
- 結合其他函數:與map()、reduce() 等配合做復雜處理。
常用操作
篩選偶數
勇者召集了士兵,編號依次是 [1, 2, 3, 4, 5, 6]。他發現偶數編號的士兵能自然結成雙人小隊,配合更默契,而奇數編號總是落單。于是勇者只保留了偶數編號的士兵,形成整齊的戰斗隊列。
nums = [1, 2, 3, 4, 5, 6] # filter()函數接收一個函數和一個序列作為參數,返回一個迭代器。 result = filter(lambda x: x % 2 == 0, nums) print(f"篩選后的結果為:{list(result)}")
對代碼進行運行測試:
去除空字符串
在村口,冒險者們報出名字:["阿爾", "", "塞琳", None, "托馬斯"]。有些人聲音太小,甚至沒開口,勇者聽不見,也不愿收留膽怯之人。他只記住了那些真正大聲喊出自己名字的勇敢者。
words = ["阿爾", "", "塞琳", None, "托馬斯"] result = filter(None, words) print(f'勇者記住的名字為:{list(result)}')
對代碼進行運行測試:
篩選正數
荒野上,戰士們的斗志值被記錄為 [-3, -1, 0, 2, 5, -2, 7]。負數表示已經心灰意冷,0 代表猶豫不前,只有正數象征著仍懷有希望。勇者知道,這些人才能在困境中堅持戰斗,于是只挑選出斗志大于 0 的戰士。
numbers = [-3, -1, 0, 2, 5, -2, 7] result = filter(lambda x: x > 0, numbers) print(f"勇者挑選出的戰士的斗志為:{list(result)}")
對代碼進行運行測試:
篩選字典
遠征需要補給,勇者走訪各村,得到的糧食儲備是:{"綠林村": 10, "石谷村": 0, "霧隱村": 20, "荒地村": -5}。他只會依靠那些有能力貢獻的村莊,把沒有糧食或負債的地方排除掉。
data = {"綠林村": 10, "石谷村": 0, "霧隱村": 20, "荒地村": -5} result = filter(lambda k: data[k] > 0, data) print(f"勇者篩選出的給力的村莊有:{list(result)}")
對代碼進行運行測試:
配合集合與元組
戰場上,勇者面對一群戰士,他們的力量值是 {0, 1, 2, 3, 4, 5}。他只選擇力量大于2的勇士加入遠征隊。同時,他還清點了寶物 (10, -1, 0, 8, 5),只留下真正有價值(≥5)的。
# 從集合中篩選力量強的戰士 s = {0, 1, 2, 3, 4, 5} result1 = filter(lambda x: x > 2, s) print(f"篩選出的得力戰士為:{set(result1)}")# 從元組中挑選價值不低的寶物 t = (10, -1, 0, 8, 5) result2 = filter(lambda x: x >= 5, t) print(f"篩選出的價值不低的寶物為:{tuple(result2)}")
對代碼進行運行測試:
注意事項
- 返回的是迭代器:需要用list()或tuple()等轉換。
- 只能遍歷一次:迭代器消耗后不可復用。
- function返回布爾值:若返回非布爾,會自動轉為布爾值。
- None的特殊用法:filter(None, iterable)會自動剔除布爾值為False的元素。
- 列表推導式替代:小數據集時,[x for x in iterable if condition]更直觀。