【问题标题】:Map list by partial function vs lambda按部分函数与 lambda 映射列表
【发布时间】:2012-11-12 01:38:41
【问题描述】:

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

例如,我可能想在某个列表上应用imap,例如使用以下方法为每个元素添加 3:

imap(lambda x : x + 3, my_list)

或者使用partial:

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

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

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

【问题讨论】:

    标签: python


    【解决方案1】:

    要真正等同于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
    

    【讨论】:

    • 我可以拥有我的列表理解和生成器吗? Python 似乎拥有一切:-p 谢谢。
    • 无序参数是我在“lambda vs partial”中听到的最好的参数。不过公平地说,partials 比 lambda 更快 - 仅适用于重要的罕见情况。
    【解决方案2】:

    在给定的示例中,lambda 似乎是最合适的。眼睛也更舒服。

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

    【讨论】:

    • 赞成使用“在野外”——在丛林中与蟒蛇一起使用,对吗?
    【解决方案3】:

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

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

    ( x + 3 for x in my_list )
    

    这将创建一个生成器,类似于 imap。 如果你还是要从中列出一个列表,请改用列表推导式:

    [ x + 3 for x in my_list ]
    

    【讨论】:

    • 此解决方案确实创建了第二个列表,它不会将 3 添加到列表中的项目。
    • 呃,为什么要避开itertools?里面有很多对日常程序有用的东西……你的意思是functools?
    • @Amber:列表理解肯定比 imap 更干净?我从来没有遇到过对 itertools 的需求,但这是一个不同的问题......
    • imap 和列表解析做不同的事情:前者创建一个生成器;后者创建一个完整列表。现在,如果您要引用 生成器表达式 而不是列表推导式,您会更接近正确。
    • imap 的特殊优势在于它可以轻松获取多个可迭代对象,而无需先将它们压缩成元组以进行理解。
    猜你喜欢
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 2022-07-14
    • 2021-03-28
    • 2011-09-14
    相关资源
    最近更新 更多