部分函数与lambda的地图列表

时间:2011-03-09 01:35:34

标签: python

我想知道对于大多数示例来说,使用lambdapartial函数是否更“pythonic”?

例如,我可能想在某些列表中应用imap,例如使用以下内容将3添加到每个元素:

imap(lambda x : x + 3, my_list)

或使用partial

imap(partial(operator.add, 3), my_list)

我意识到在这个例子中循环可能更容易实现它,但我正在考虑更多非平凡的例子。

在Haskell中,我很容易在上面的例子中选择部分应用程序,但我不确定Python。对我来说,lambda似乎是更好的选择,但我不知道大多数python程序员的主流选择是什么。

3 个答案:

答案 0 :(得分:17)

要真正等同于imap,请使用生成器表达式:

(x + 3 for x in mylist)

imap类似,这不会立即构建一个完整的新列表,而是按需计算结果序列的元素(因此,如果您链​​接结果,则比列表理解更有效)进入另一个迭代)。

如果你对partial在现实世界中比lambda更好的选择感到好奇,那么它往往是在你处理可变数量的论点时:

>>> from functools import partial
>>> def a(*args):
...     return sum(args)
... 
>>> b = partial(a, 2, 3)
>>> b(6, 7, 8)
26

使用lambda的等效版本将是......

>>> b = lambda *args: a(2, 3, *args)
>>> b(6, 7, 8)
26

稍微简洁一点 - 但lambda确实为您提供了无序应用程序的选项,partial没有:

>>> def a(x, y, z):
...    return x + y - z
...
>>> b = lambda m, n: a(m, 1, n)
>>> b(2, 5)
-2

答案 1 :(得分:5)

在给定的示例中,lambda似乎最合适。它的眼睛也更容易。

我从未见过在野外使用部分功能。

答案 2 :(得分:4)

lambda肯定是常见的很多倍。除非你在学术环境中进行函数式编程,否则你应该远离functools。

这是pythonic。不需要库,甚至内置函数,只需要一个简单的生成器表达式。

( x + 3 for x in my_list )

这会创建一个类似于imap的生成器。 无论如何,如果你打算列出一个列表,请改用列表理解:

[ x + 3 for x in my_list ]