热门问题
时间线
聊天
视角
Filter (高階函式)
来自维基百科,自由的百科全书
Remove ads
在函數式程式設計中,過濾器(filter)是一個高階函式,它按某種次序處理一個資料結構(通常是列表),來產一個新的資料結構,它精確的包含最初資料結構中給定謂詞對其返回布林值true
的那些元素。
定義
在Python中,filter
在說明文件中的語法是filter(function,iterable)
可以用如下辦法用列表推導式實現
output = [x for x in iterable if function]
在Python2中filter
返回一個list
,而在Python3中filter
返回一個迭代器對象。
在Haskell中,filter
可以如下這樣實現:
filter :: (a -> Bool) -> [a] -> [a]
filter _ [] = []
filter p (x:xs) = [x | p x] ++ filter p xs
這裡的[]
指示空串列,++
是列表串接算子,而[x | p x]
指示有條件持有一個值x
的列表,如果條件p x
成立(求值為True
)。
例子
在Haskell中代碼例子
filter even [1..10]
求值得到列表2, 4, …, 10
,這是通過應用謂詞even
到整數列表1, 2, …, 10
的按原次序的所有元素,並建立謂詞對其返回布林值true
的那些元素的一個新的列表,因而給出的是只包含原列表的偶數成員的一個列表。反過來,代碼例子:
filter (not . even) [1..10]
求值得出列表1, 3, …, 9
,這是通過搜集整數列表1, 2, …, 10
中,謂詞對其返回布林值false
的那些元素(這裡的.
是函式複合算子)。
在Python3中代碼例子
>>>print(list(filter(lambda x:x % 2 == 0,[1,2,3,4,5,6,7,8]))) #输出偶数
[2, 4, 6, 8]
下面是一個過濾器過程的每個步驟的可視演示,對於整數列表X = [0, 5, 8, 3, 2, 1]
依據函式:
這個函式表達了如果是偶數,則返回值是,否則是,這是謂詞。

Remove ads
語言比較
過濾器是很多程式語言的標準函式,比如Haskell[1]、OCaml[2]、Standard ML[3]或Erlang[4]。Common Lisp提供了函式remove-if
和remove-if-not
[5]。Scheme實現要求(SRFI)1提供了Scheme語言過濾器的一個實現[6]。C++提供了演算法remove_if
(可變)和remove_copy_if
(不可變);C++11補充提供了copy_if
(不可變)[7]。Smalltalk為搜集提供了select:
方法。過濾器還可以在支援列表推導式的語言中使用它來實現。
Remove ads
變體
過濾器建立它的結果而不修改最初的列表。很多程式語言還提供破壞性修改列表實際參數的有更快效能的變體。過濾器的其他變體(比如Haskell dropWhile
[18]和partition
[19])也是常見的。常見的純函數式程式設計語言主記憶體最佳化是擁有輸入列表並過濾結果共享最長尾部。
參見
參照
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads