Python 的过滤函数参数顺序

Python's filter functions arguments order

Python 的 filter and itertools.ifilter 函数具有以下签名:

filter(function, iterable)
itertools.ifilter(predicate, iterable)

是否有任何理由将 predicate 参数放在 iterable 之前?在这种情况下,不能跳过 predicate 参数来简化 filter(bool, [0, 1, 0, 2])filter([0, 1, 0, 2]) 的调用。第二个对我来说看起来更地道。

它有助于理解从中借用 filter 的范例。与其将 filter 视为将函数和列表作为两个参数的函数,不如将其视为采用单个参数(谓词)的函数。 return 值是一个 new 函数,它接受一个列表并且 returns 是一个新列表。从这个意义上讲,filter 是一个函数(实际上是一个函子),即 "lifts" 一个函数变成了一个新的 "category".

例如,假设您有一个谓词 is_even,它接受一个整数作为其参数,return如果参数为偶数则为真,如果为奇数则为假。然后 filter(is_even) 可以被认为是 returning 一个函数,它接受一个 list 整数和 returning 一个 list 的布尔值,每个元素表示相应输入项的均匀性。您可以将该函数应用于列表,这样 filter(is_even)(list_of_ints) 就等同于 Python 中的 filter(is_even, list_of_ints)。这种将多参数函数分解为一系列单参数函数的方法称为 currying.

filter 的类型签名反映了它的起源和 Python 缺乏内置柯里化。您可以使用 functools.partial 模拟此操作,它允许您通过从左到右为定义的参数提供参数来部分应用函数。

from functools import partial
x = partial(filter, is_even)  # lambda lst: filter(is_even, lst)
new_list = x(list_of_ints)
# or just new_list = partial(filter, is_even)(list_of_ints)