Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用lambda将这个元组从Python 2解包到Python 3的最具Python风格的方法_Python_Lambda - Fatal编程技术网

用lambda将这个元组从Python 2解包到Python 3的最具Python风格的方法

用lambda将这个元组从Python 2解包到Python 3的最具Python风格的方法,python,lambda,Python,Lambda,我有下面的Python2代码,它在lambda中解压一个元组。这个lambda包含在for循环中 for lab, lab_pred, length in zip(labels, labels_pred, sequence_lengths): accs += map(lambda (a, b): a == b, zip(lab, lab_pred)) 将其移植到Python 3中的最佳方法是什么?我认为最好的解决方案是不要使用map和lambda,而是使用列表理解: a

我有下面的Python2代码,它在lambda中解压一个元组。这个lambda包含在for循环中

    for lab, lab_pred, length in zip(labels, labels_pred, sequence_lengths):
        accs += map(lambda (a, b): a == b, zip(lab, lab_pred))

将其移植到Python 3中的最佳方法是什么?

我认为最好的解决方案是不要使用
map
lambda
,而是使用列表理解:

accs += [a == b for a, b in zip(lab, lab_pred)]

如果您喜欢功能性风格,有:

from operator import eq
from itertools import starmap

accs.extend(starmap(eq, zip(lab, lab_pred)))

这是Python3中的有意回归(尽管我不知道其原理-如果你碰巧遇到-请在下面进行评论),以阻止
lambda
,并且从长远来看-完全使用Python2

肾盂快速修复 (经过编辑,以前的想法没有真正起作用) 另见此处:

如果您的lambda是扁平的,则有一个到Python3的升级路径:

lambda (x, y): x + y
变成

lambda xy: (lambda x, y: x + y)(*xy)
不错,但它有两个缺点:

  • 欢迎使用Lisp;)它很复杂(但像pythonic,比如
    str.join

  • 它不会剪切嵌套元组,比如:
    lambda((x0,y0),(x1,y1)):abs(x1-x0)+abs(y1-y0)

  • 一个额外的lambda

  • 为什么他们强迫我们使用小型
    def
    功能? lambda不好有几个原因(大约3-4个可能有效):

  • 仅仅因为:
    lambda
    在Python中被破坏了。知道这一点真是“蟒蛇式的”

  • Lambdas(在Python中,而不是在其他语言中!我不会在以下几点中重复此免责声明)只能处理单个表达式

  • lambda没有
    \uuuu名称\uuuuu
    s

  • lambda有难看的
    \uuuu repr\uuu
    表示

  • lambda会使代码变慢。(经常不必要地创建时)

  • lambda很慢。(与竞争构造相比,运行)

  • (无论如何,5和6只与大多数性能关键代码相关)

    建议使用Python中的小函数,他们认为这没有问题,因为它只需要多花2行代码。(2而不是0,因为lambda可以内联)。因此,
    lambda x,y:x==y
    变成:

    def are_equal(x, y):
        return x == y
    
    (忘记这里的
    operator.eq
    ,无论如何,并不是每个lambda在这个模块中都有它的等价物)

    实际上,如果您坚持使用PEP-8,这个函数在局部范围内需要额外的4行,在全局范围内需要额外的6行,包括空行填充

    示例情形:如何保持兼容性 假设您有一个列表,或其他元组的iterable。您希望使用
    max(…,key=…)
    获得最大值。之后,您可以直接解压缩元组。在Python2时代,它将是:

    x, y, w, h = max(faces, key=lambda (x, y, w, h): w * h)
    
    (同样,你可以在这里教训我关于
    键入.Namedtuple
    s、
    数据类
    @attr.s
    的优越性,但现在我从OpenCV得到了
    列表

    我发现最简单的方法是使用函数:

    def face_area(*args):
        x, y, w, h = args if len(args) == 4 else args[0]
        return w * h
    
     x, y, w, h = max(faces, key=face_area)
    
    Python2将在
    args
    中获得一个嵌套元组,Python3将获得一个长度为4的元组。您可以如上所述手动将其解压缩,然后继续执行
    返回
    打包结果


    有人会说,这给代码提供了一个更加自我记录的机会,因为我必须为
    函数想出一个名称。

    当然!将lambda与
    映射
    过滤器
    一起使用有点愚蠢,因为这意味着你在每个项上调用函数只是为了执行lambda中的表达式,而带有列表comp(或gen exp)的eas直接执行表达式。Python函数调用的开销比C函数调用大得多,因此在不需要时最好避免调用。除了Python 3函数参数中缺少元组解包外,还有另一个问题:
    map
    在Python 3中返回迭代器而不是列表。这是许多函数的情况Python 2中的返回列表。这只是Python核心开发人员教学方法的另一个例子-打破一些东西“教他们”变得更“pythonic”(并使Py2/Py3互操作更加困难)。请参阅我的答案,了解更一般的情况,而不仅仅是您的特定片段。仅供参考-请参阅理由:-总结:“我们将移除它,因为它会很方便,而且我认识的人都不会使用它。”