我想知道对于大多数示例来说,使用lambda
或partial
函数是否更“pythonic”?
例如,我可能想在某些列表中应用imap
,例如使用以下内容将3添加到每个元素:
imap(lambda x : x + 3, my_list)
或使用partial
:
imap(partial(operator.add, 3), my_list)
我意识到在这个例子中循环可能更容易实现它,但我正在考虑更多非平凡的例子。
在Haskell中,我很容易在上面的例子中选择部分应用程序,但我不确定Python。对我来说,lambda似乎是更好的选择,但我不知道大多数python程序员的主流选择是什么。
答案 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 ]