多重 Return 语法如何工作?

How Does the Multiple Return Syntax Work?

我有一个问题,我想 return 基于结果的值。但要做到这一点,我需要有多个 return 语句,如下所示:

if w1 > w2: return 'Computer Wins!!'
elif w1 == w2: return 'Tie War!!'
else:
    return 'I Win!!'

但我看到有人这样写语法:

return ('I Win!!', 'Computer Wins!!', 'Tie War!!')[(w1>w2)-(w1==w2)]

所以,我不确定第二段代码是如何工作的。你能解释一下吗?谢谢!

此表达式使用所有三个 return 值构建一个 tuple,并通过对 bool 执行减法来访问正确的 return 值。它利用了 Python 中的算术运算将 True 解释为 1 并将 False 解释为 0 的事实。

对于计算机win,w1>w2为真,w1==w2为假,所以(w1>w2) - (w1==w2)=1-0=1,元组位置1的元素为returned.

对于平局,操作的结果是-1,遵循相同的逻辑,所以元组的最后一个元素是returned。以同样的方式,对于玩家获胜,操作的计算结果为 0,因此元组的第一个元素是 returned.

这被认为是不好的做法,因为它比使用 if/elif/else 语句更难阅读,正如您必须问这个问题才能理解逻辑所证实的那样!

第二种方法很聪明,但为了可读性我不推荐它:

让我们分解代码


return ('I Win!!', 'Computer Wins!!', 'Tie War!!')[(w1>w2)-(w1==w2)]

注意:在Python中,True计算为1False计算为0

案例

如果 (w1 > w2) 是 True(1) 那么 (w1 == w2) 必然是 False(0)
-> [(w1 > w2) - (w1 == w2)]
-> [1 - 0] 等于 [1]
-> 因此 ('I Win!!', 'Computer Wins!!', 'Tie War!!')[1]
-> 结果是 'Computer Win!!'

如果 (w1 > w2) 为 False(0) 那么 (w1 == w2) 必然为 False(0)
-> [(w1 > w2) - (w1 == w2)]
-> [0 - 0] 等于 [0]
-> 因此 ('I Win!!', 'Computer Wins!!', 'Tie War!!')[0]
-> 结果是 'I win!'

如果 (w1 > w2) 为假 (0) 且 (w1 == w2) 为真 (1) 则
-> [(w1 > w2) - (w1 == w2)]
-> [0 - 1] 等于 [-1]
所以 ('I Win!!', 'Computer Wins!!', 'Tie War!!')[-1] 给出最后一项,即 'Tie War!!'