擅长:python、mysql、java
<p>不,没有别的办法了。你把一切都掩盖了。方法是在<a href="https://mail.python.org/mailman/listinfo/python-ideas" rel="noreferrer">Python ideas mailing list</a>上提出这个问题,但要准备好在那里争论很多以获得一些吸引力。</p>
<p>实际上,不是说“没有出路”,第三种方法可能是实现一个更高级别的lambda调用,只是为了展开参数-但这将立即比您的两个建议更低效,更难阅读:</p>
<pre><code>min(points, key=lambda p: (lambda x,y: (x*x + y*y))(*p))
</code></pre>
<p><strong>更新Python 3.8</strong></p>
<p>到目前为止,Python3.8Alpha1已经可用,并且实现了PEP572-赋值表达式。</p>
<p>因此,如果在lambda中使用一个技巧来执行多个表达式-我通常通过创建一个元组并返回它的最后一个组件来执行,则可以执行以下操作:</p>
<pre><code>>>> a = lambda p:(x:=p[0], y:=p[1], x ** 2 + y ** 2)[-1]
>>> a((3,4))
25
</code></pre>
<p>人们应该记住,这种代码很少比拥有完整功能更具可读性或实用性。尽管如此,还是有可能的用途-如果有各种各样的一行程序可以在这个<code>point</code>上操作,那么有一个namedtuple是值得的,并使用赋值表达式有效地将传入序列“强制转换”到namedtuple:</p>
<pre><code>>>> from collections import namedtuple
>>> point = namedtuple("point", "x y")
>>> b = lambda s: (p:=point(*s), p.x ** 2 + p.y ** 2)[-1]
</code></pre>