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,请使用生成器表达式:
与imap一样,它不会立即构建一个完整的新列表,而是按需计算结果序列的元素(因此,如果将结果链接到另一个迭代中,它比列表理解效率高得多)。
如果你想知道在现实世界中,partial比lambda更好的选择是在哪里,那么在处理可变数量的论据时,情况往往是这样的:
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 |
- 我能理解我的清单和一个生成器吗?Python似乎什么都有。-p谢谢。
- 感谢您为部分添加了一个最佳案例!
- 无序参数是我在"lambda vs partial"中听到的最好的参数。不过,公平地说,江户十一〔四〕家的速度要比兰姆达斯快,这只是在少数情况下才重要。
在给定的示例中,lambda似乎最合适。对眼睛也比较容易。
我从未见过在野外使用部分函数。
- 赞成使用"在野外"——在有Python的丛林里,对吗?
lambda当然是常见的许多倍。除非您在学术环境中进行函数式编程,否则您应该避免使用函数工具。
这是Python。不需要库,甚至不需要内置,只需要一个简单的生成器表达式。
1
| ( x + 3 for x in my_list ) |
这将创建一个类似于IMAP的生成器。如果你想从中列出一个清单,用清单理解代替:
1
| [ x + 3 for x in my_list ] |
- 此解决方案不会创建第二个列表,也不会向列表中的项目添加3个列表。
- @德米特里:这对手术也是一样的。
- 呃,为什么要避开itertools?它有很多有用的东西在日常节目中…你是说functools吗?
- 你说得对……
- @琥珀:当然,列表理解比IMAP更清晰?我从来没有遇到过对itertools的需求,但这是一个不同的问题…
- 这绝对是做这件事的方法,可能也是最快的。
- imap和列表理解做了不同的事情:前者创建一个生成器;后者创建一个完整的列表。现在,如果您引用的是生成器表达式而不是列表理解,那么您将更接近于正确。
- 列表理解是我最喜欢的python技巧。另外,不要忘记在生成器表达式中使用括号而不是括号,如果您打算稍后再重复使用它,这样做更为理想。
- 我不知道我怎么会错过看到python有列表理解!感谢您回答我的问题并提供更多的Python替代品。
- 当在大列表上执行操作链时,生成器的效率会大大提高。
- imap的特殊优势在于,它可以很容易地将多个iterables合并在一起,而无需首先将它们压缩成元组进行理解。
- 这个答案是错误的;列表理解根本不等同于IMAP。同样,您需要一个生成器表达式。
- -1表示"远离Itertools"
- @pst@glenn maynard:我已经编辑了这篇文章来解决你的问题。