Filter (高阶函数)

在函数式编程中,过滤器(filter)是一个高阶函数,它按某种次序处理一个数据结构(通常是列表),来产一个新的数据结构,它精确的包含最初数据结构中给定对其返回布尔值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的那些元素(这里的.是)。

在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]依据函数:
::f(x) = \begin{cases} True &\text{ if } x \equiv 0 \pmod{2}\\ False & \text{ if } x \equiv 1 \pmod{2} .\end{cases}

这个函数表达了如果x是偶数,则返回值是True,否则是False,这是谓词。

语言比较
过滤器是很多编程语言的标准函数,比如Haskell、OCaml、Standard ML或Erlang。Common Lisp提供了函数remove-if和remove-if-not。(SRFI)1提供了Scheme语言过滤器的一个实现。C++提供了remove_if(可变)和remove_copy_if(不可变);C++11补充提供了copy_if(不可变)。Smalltalk为搜集提供了select:方法。过滤器还可以在支持列表推导式的语言中使用它来实现。

变体
过滤器建立它的结果而不修改最初的列表。很多编程语言还提供破坏性修改列表实际参数的有更快性能的变体。过滤器的其他变体(比如Haskell dropWhile和partition)也是常见的。常见的纯函数式编程语言是拥有输入列表并过滤结果共享最长尾部。

参见

  • Map (高阶函数)
  • Fold (高阶函数)
  • 列表推导式
  • 卫语句

引用

评论 (0)

  • 还没有评论,来抢沙发吧。