把一个if-elif-else语句放在一行上?

我已阅读下面的链接,但它不能解决我的问题。
Python是否有三元条件运算符? (这个问题是关于将if-else语句压缩到一行)

有没有更简单的方法来编写一个if-elif-else语句,使其适合于一行?
例如,

if expression1: statement1 elif expression2: statement2 else: statement3 

[UPDATE]

 if i>100: x=2 elif i<100: x=1 else: x=0 

我只是觉得,如果上面的例子可以写成下面的方式,它可以看起来更简洁。

 x=2 if i>100 elif i<100 1 else 0 [WRONG] 

不,这是不可能的(至less没有任何陈述),也不可取。 把所有东西都放在一行上很可能会违反PEP-8的规定,行长不应超过80个字符。

这也反对Python的禅:“可读性计数”。 (在Python提示符下import this来读取整个事物)。

可以在Python中使用三元expression式,但只能用于expression式,不能用于语句:

 >>> a = "Hello" if foo() else "Goodbye" 

编辑:

现在您的修订问题显示,除了赋值之外,三条语句是相同的。 在这种情况下,链式三元运算符确实有效,但我仍然认为它的可读性较差:

 >>> i=100 >>> a = 1 if i<100 else 2 if i>100 else 0 >>> a 0 >>> i=101 >>> a = 1 if i<100 else 2 if i>100 else 0 >>> a 2 >>> i=99 >>> a = 1 if i<100 else 2 if i>100 else 0 >>> a 1 

如果你只需要不同情况下的不同expression式,那么这可能适合你:

 expr1 if condition1 else expr2 if condition2 else expr 

例如:

 a = "neg" if b<0 else "pos" if b>0 else "zero" 

只要在else语句中嵌套另一个if子句。 但是这并没有使它看起来更漂亮。

 >>> x=5 >>> x if x>0 else ("zero" if x==0 else "invalid value") 5 >>> x = 0 >>> x if x>0 else ("zero" if x==0 else "invalid value") 'zero' >>> x = -1 >>> x if x>0 else ("zero" if x==0 else "invalid value") 'invalid value' 

这也取决于你的表情的性质。 关于“不这样做”的其他答案的一般build议对于generics语句和genericsexpression式是非常有效的。

但是,如果您只需要一个“dispacth”表,就像根据给定选项的值调用不同的函数一样,您可以将这些函数放在字典中调用。

就像是:

 def save(): ... def edit(): ... options = {"save": save, "edit": edit, "remove": lambda : "Not Implemented"} option = get_input() result = options[option]() 

(而不是

 if option=="save": save() ... 

在我看来,还有一个很难理解的问题,但我仍然会分享一些好奇心:

 x = (i>100 and 2) or (i<100 and 1) or 0 

更多信息: https : //docs.python.org/3/library/stdtypes.html#boolean-operations-and-or-not

那么,我在几个月前遇到过类似的问题,那么有一天我意识到你实际上可以利用一个dict对象的get方法。

 x = {i>100: 2, i<100: 1}.get(True, 0) 

基本上, i>100i<100不能都是真的,所以如果他们中的任何一个是True你得到你想要的值(2或1),如果他们都不是True ,你会得到0

人们已经提到了三元expression。 有时候以一个简单的条件赋值为例,可以使用mathexpression式来执行条件赋值。 这可能不会让你的代码更具可读性,但它确实可以在很短的时间内完成。 你的例子可以这样写:

 x = 2*(i>100) | 1*(i<100) 

比较结果是True或False,并且与数字相乘的结果可能是1或0.可以使用+而不是| 在中间。