这是 Python3 中的故意回归(虽然我不知道原因 - 如果你碰巧 - 请在下面评论)以阻止 lambda 并从长远来看 - 完全使用 Python2。
Pythonic 快速修复
(已编辑,之前的想法并没有真正奏效)
也可以在这里查看:https://stackoverflow.com/a/47947955/1338797
如果你的 lambda 是平的,有升级到 Python3 的路径:
lambda (x, y): x + y
变成
lambda xy: (lambda x, y: x + y)(*xy)
不错,但有两个缺点:
欢迎使用 Lisp ;) 它很复杂(但是像 str.join 这样的 Python 语言)
它不会剪切嵌套元组,例如:lambda ((x0, y0), (x1, y1)): abs(x1-x0) + abs(y1-y0)
一个额外的 lambda。
为什么他们强迫我们使用小的 def 函数?
Lambda 不好有几个原因(大约 3-4 可能是有效的):
只是因为:lambda 在 Python 中被破坏了。知道这一点是“pythonic”。
Lambdas(在 Python 中,而不是在其他语言中!我不会在以下几点重复此免责声明)只能处理单个表达式。
Lambda 没有 __name__s。
Lambda 有丑陋的 __repr__esentations。
Lambdas 是 可以使代码变慢。 (经常不必要地创建时)
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.Namedtuples、dataclasses 或 @attr.s 的优越性,但现在我从 OpenCV 得到 list 和 tuples。
我发现使用函数最不痛苦的方式:
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 函数想一个名字。