[英]How to migrate lambda from python2 to python3 and handle removed tuple parameter unpacking in python3
[英]Most pythonic way to port this tuple unpacking with lambda from Python 2 into Python 3
我有以下Python 2代码,它在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
,而是使用list comprehension:
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。
(编辑,以前的想法并没有真正起作用)另见: https : //stackoverflow.com/a/47947955/1338797
如果你的lambda是扁平的,那么有一条Python3的升级路径:
lambda (x, y): x + y
变
lambda xy: (lambda x, y: x + y)(*xy)
不错,但它有两个缺点:
欢迎来到Lisp;)这是错综复杂的(但是str.join
,就像str.join
一样)
它不会剪切嵌套元组,如: lambda ((x0, y0), (x1, y1)): abs(x1-x0) + abs(y1-y0)
额外的lambda。
def
函数? Lambdas有几个原因是坏的(大约3-4可能是有效的):
仅仅因为: lambda
在Python中被破坏了。 知道这一点是“pythonic”。
Lambda(在Python中,而不是其他语言!我不会在以下几点重复此免责声明)只能处理单个表达式。
__name__
没有__name__
。
__repr__
有丑陋的__repr__
表达。
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行,包括空行填充。
假设您有一个列表或其他可迭代的元组。 您希望使用max(..., key=...)
获得最大值。 之后,您可以直接解压缩元组。 在Python2的时代,它将是:
x, y, w, h = max(faces, key=lambda (x, y, w, h): w * h)
(同样,你可以在这里演讲我讲的优越性typing.Namedtuple
S, dataclasses
,或@attr.s
,但现在我得到一个list
的tuple
来自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的元组。您可以如上所述手动解压缩,然后继续return
结果。
有人会说,它为代码提供了一个更加自我记录的机会,因为我不得不考虑key
函数的名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.