在Python中压缩`x if x else y`语句

问题描述 投票:0回答:4

我非常熟悉Python的三元运算符方法:

value = foo if something else bar

我的问题很简单:如果没有事先分配,是否可以从返回操作数之一(

if ...
... if
)引用(
else ...
)中正在评估的术语?

这里的动机是,有时我在

if ...
中使用的表达式正是我想要的三元运算结果;不过,对于较小的表达式,重复它没有问题,但对于较长的表达式,它会有点令人讨厌。以此为例:

value = info.findNext("b") if info.findNext("b") else "Oompa Loompa"
python variable-assignment ternary-operator user-friendly
4个回答
55
投票

没有办法做到这一点,这是故意的。三元 if 只应该用于简单的情况。

如果您想使用计算结果两次,请将其放入临时变量中:

value = info.findNext("b")
value = value if value else "Oompa Loompa"

一旦你这样做了,很明显你在做一些愚蠢的事情,事实上,写这个的Python方式是:

value = info.findNext("b")
if not value:
    value = "Oompa Loompa"

实际上比您最初的尝试少了 5 次击键。 如果您

真的

想要保存击键,您可以这样做: value = info.findNext("b") or "Oompa Loompa"

但是许多风格指南和 BDFL 都不鼓励这样做。

如果您只这样做一次,最好更明确。如果你这样做了六次,那么让

findNext

采用可选的默认值而不是

None
返回就很简单了,而且更好,就像所有这些内置函数和 stdlib 函数一样:

def findNext(self, needle, defvalue=None): # same code as before, but instead of return None or falling off the end, # just return defvalue.

然后你可以这样做:

value = info.findNext("b", "Oompa Loompa")



24
投票
if ... else

。相反,请利用 Python 的合并运算符。


value = info.findNext("b") or "Oompa Loompa"



4
投票

value = bb if (bb := info.findNext("b")) else "Oompa Loompa"



0
投票
主菜单 值 if .else“公司单独 x ” 信息.查找下一个(“b”) K=r²×m⅖×!¼

© www.soinside.com 2019 - 2024. All rights reserved.