关于python:部分函数vs lambda的地图列表

Map list by partial function vs lambda

我想知道在大多数例子中,使用lambda还是partial功能更像是"Python"?

例如,我可能想在一些列表上应用imap,比如使用以下命令向每个元素添加3:

1
imap(lambda x : x + 3, my_list)

或使用partial

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

我意识到在这个例子中,一个循环可能可以更容易地完成它,但是我正在考虑更多的非平凡的例子。

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


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

1
(x + 3 for x in mylist)

imap一样,它不会立即构建一个完整的新列表,而是按需计算结果序列的元素(因此,如果将结果链接到另一个迭代中,它比列表理解效率高得多)。

如果你想知道在现实世界中,partiallambda更好的选择是在哪里,那么在处理可变数量的论据时,情况往往是这样的:

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

使用lambda的等效版本是…

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

这稍微不那么简洁-但lambda确实给了您无序应用的选择,而partial没有:

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


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

我从未见过在野外使用部分函数。


lambda当然是常见的许多倍。除非您在学术环境中进行函数式编程,否则您应该避免使用函数工具。

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

1
( x + 3 for x in my_list )

这将创建一个类似于IMAP的生成器。如果你想从中列出一个清单,用清单理解代替:

1
[ x + 3 for x in my_list ]