用lambda将这个元组从Python 2解包到Python 3的最具Python风格的方法
我有下面的Python2代码,它在lambda中解压一个元组。这个lambda包含在for循环中用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
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)
不错,但它有两个缺点:
str.join
)lambda((x0,y0),(x1,y1)):abs(x1-x0)+abs(y1-y0)
def
功能?
lambda不好有几个原因(大约3-4个可能有效):
lambda
在Python中被破坏了。知道这一点真是“蟒蛇式的”\uuuu名称\uuuuu
s\uuuu repr\uuu
表示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互操作更加困难)。请参阅我的答案,了解更一般的情况,而不仅仅是您的特定片段。仅供参考-请参阅理由:-总结:“我们将移除它,因为它会很方便,而且我认识的人都不会使用它。”