热门问题
时间线
聊天
视角

Filter (高階函數)

来自维基百科,自由的百科全书

Remove ads

函數式程式設計中,過濾器(filter)是一個高階函數,它按某種次序處理一個數據結構(通常是列表),來產一個新的數據結構,它精確的包含最初數據結構中給定謂詞英語Predicate (mathematical logic)對其返回布林值true的那些元素。

定義

Python

Python中,filter在說明文件中的語法是filter(function,iterable)

可以用如下辦法用列表推導式實現

output = [x for x in iterable if function]

在Python2中filter返回一個list,而在Python3中filter返回一個迭代器對象。

Haskell

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的那些元素(這裏的.函數複合算子英語Function composition (computer science))。

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]依據函數:

這個函數表達了如果是偶數,則返回值是,否則是,這是謂詞。

Thumb
在應用過濾器在列表上的時候的處理步驟的演示
Remove ads

語言比較

過濾器是很多程式語言的標準函數,比如Haskell[1]OCaml[2]Standard ML[3]Erlang[4]Common Lisp提供了函數remove-ifremove-if-not[5]Scheme實現要求英語Scheme Requests for Implementation(SRFI)1提供了Scheme語言過濾器的一個實現[6]C++提供了演算法英語Algorithm (C++)remove_if(可變)和remove_copy_if(不可變);C++11補充提供了copy_if(不可變)[7]Smalltalk為搜集提供了select:方法。過濾器還可以在支援列表推導式的語言中使用它來實現。

更多資訊 語言, Filter ...
Remove ads

變體

過濾器建立它的結果而不修改最初的列表。很多程式語言還提供破壞性修改列表實際參數的有更快效能的變體。過濾器的其他變體(比如Haskell dropWhile[18]partition[19])也是常見的。常見的純函數式程式設計語言主記憶體最佳化英語Program optimization是擁有輸入列表並過濾結果共用最長尾部。

參見

參照

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads