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)
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)