Python的过滤器函数参数顺序

Python的过滤器函数参数顺序,python,parameter-passing,idioms,Python,Parameter Passing,Idioms,Python的和函数具有以下特征: filter(function, iterable) itertools.ifilter(predicate, iterable) 是否有任何理由将谓词参数置于iterable之前?在这种情况下,不能跳过谓词参数来简化filterbool[0,1,0,2]调用,而只调用filter[0,1,0,2]。对我来说,第二个更为惯用。这有助于理解过滤器借用的范例。不要把filter看作是一个函数,它接受一个函数和一个列表作为两个参数,而应该把它看作是一个函数,它接受

Python的和函数具有以下特征:

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

是否有任何理由将谓词参数置于iterable之前?在这种情况下,不能跳过谓词参数来简化filterbool[0,1,0,2]调用,而只调用filter[0,1,0,2]。对我来说,第二个更为惯用。

这有助于理解过滤器借用的范例。不要把filter看作是一个函数,它接受一个函数和一个列表作为两个参数,而应该把它看作是一个函数,它接受一个参数,即谓词。返回值是一个新函数,它接受一个列表并返回一个新列表。从这个意义上说,过滤器实际上是一个函数,一个将函数提升到新类别的函子

例如,假设您有一个谓词是_偶数,它以整数作为参数,如果参数是偶数,则返回true;如果参数是奇数,则返回false。然后filteris_甚至可以被认为是返回一个函数,该函数接受一个整数列表,并返回一个布尔值列表,每个元素表示相应输入项的均匀性。您可以将该函数应用于列表,以便filteris\u evenlist\u of int与Python中的filteris\u even,list\u of int完全相同。这种将多参数函数分解为一系列单参数函数的方法称为currying

过滤器的类型签名反映了它的起源和Python缺乏内置的curry。您可以使用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)

第二个没有任何意义。过滤没有谓词的列表?那怎么行呢?记住显式导入要比隐式导入好。@VincentSavard:奇怪的是,实际上有一个定义的行为用于过滤而不使用谓词。如果将None作为谓词传递,则其工作原理与传递bool或lambda x:x相同。可能是因为map、filter和reduce等函数来自函数式编程的传统,因此filter的参数顺序与之不同。对于map和reduce,这个参数顺序更有意义,尽管我赞同你关于过滤器的观点;foo=even\u filterFoo另外,在函数世界中,您可以将filter视为一个函数,它接受一个参数filter函数并返回一个新函数,该函数接受一个列表作为参数并返回一个过滤列表。咖喱模糊了filterfunc、iterable和FilterFuncterable之间的界限。