【发布时间】:2015-12-22 16:44:39
【问题描述】:
Python 的 filter 和 itertools.ifilter 函数具有以下签名:
filter(function, iterable)
itertools.ifilter(predicate, iterable)
是否有任何理由将predicate 参数放在iterable 之前?在这种情况下,不能跳过predicate 参数来简化filter(bool, [0, 1, 0, 2]) 对filter([0, 1, 0, 2]) 的调用。第二个对我来说看起来更惯用。
【问题讨论】:
-
第二个没有任何意义。过滤没有谓词的列表?那怎么行?请记住,显式优于隐式 (
import this)。 -
@VincentSavard:奇怪的是,实际上有一个没有谓词的过滤定义行为。如果您将
None作为谓词传递,则其工作方式与传递bool或lambda x: x相同。 -
可能是因为map、filter、reduce等函数都出自函数式编程的传统,所以filter的参数顺序就是从这些函数中提取的。对于 map 和 reduce,这个参数顺序更有意义,虽然我很同情你关于 filter 单独的论点。
-
部分应用有意义:
even_filter = functools.partial(itertools.ifilter, lambda x: x % 2 == 0); foo = even_filter(foo) -
此外,在函数世界中,您可以将
filter视为一个函数,它接受一个参数(过滤器函数)并返回一个 new 函数,该函数接受一个list 作为参数并返回过滤后的列表。柯里化模糊了filter(func, iterable)和filter(func)(iterable)之间的界限。
标签: python parameter-passing idioms