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

Mat*_*son 100 python syntax

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

有没有更简单的方法来编写if-elif-else语句,以便它适合一行?
例如,

if expression1:
   statement1
elif expression2:
   statement2
else:
   statement3
Run Code Online (Sandbox Code Playgroud)

[UPDATE]

if i>100:
    x=2
elif i<100:
    x=1
else:
    x=0
Run Code Online (Sandbox Code Playgroud)

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

x=2 if i>100 elif i<100 1 else 0 [WRONG]
Run Code Online (Sandbox Code Playgroud)

Tim*_*ker 152

不,这是不可能的(至少不是任意陈述),也不可取.将所有东西安装在一条线上很可能违反PEP-8,其中规定线的长度不应超过80个字符.

它也反对Python的禅:"可读性很重要".(import this在Python提示符下键入以阅读整个内容).

可以在Python中使用三元表达式,但仅用于表达式,而不用于语句:

>>> a = "Hello" if foo() else "Goodbye"
Run Code Online (Sandbox Code Playgroud)

编辑:

您修改后的问题现在表明除了分配的值之外,这三个语句是相同的.在这种情况下,链式三元运算符确实有效,但我仍然认为它的可读性较差:

>>> 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
Run Code Online (Sandbox Code Playgroud)

  • @AstralWolf:非常感谢!这完美地说明了我试图做出的观点 - 链式三元表达式是可能的,但可读性较差,显然容易误解. (6认同)
  • 如果你需要它更易读,你可以在它周围加上括号,像这样:`a = 1 if i &lt; 100 else (2 if i &gt; 100 else 0)`(未经测试,但我认为它应该可以工作) (3认同)

Lyc*_*cha 55

如果您只需要针对不同情况的不同表达式,那么这可能对您有用:

expr1 if condition1 else expr2 if condition2 else expr
Run Code Online (Sandbox Code Playgroud)

例如:

a = "neg" if b<0 else "pos" if b>0 else "zero"
Run Code Online (Sandbox Code Playgroud)


gus*_*avz 25

尽管有其他一些答案:是的,这是可能的

if expression1:
   statement1
elif expression2:
   statement2
else:
   statement3
Run Code Online (Sandbox Code Playgroud)

转换为以下一个班轮:

statement1 if expression1 else (statement2 if expression2 else statement3)
Run Code Online (Sandbox Code Playgroud)

事实上,你可以将它们嵌套到无穷大。享受 ;)

  • 嗨@loveR,这不是循环,它只是一个嵌套的 if else 语句,因此时间可以忽略不计 (2认同)

Dav*_*Lai 16

只需在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'
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,这比公认的答案更具可读性,因为它保持了第一个子句的结构和概念;只是主观问题。 (3认同)

小智 8

是的,你可以这样做:

i = int(input('type your num here : '))

x = 2 if i > 100 else ( 1 if i < 100 else 0)
print (x)
Run Code Online (Sandbox Code Playgroud)


小智 7

if i > 100:
    x = 2
elif i < 100:
    x = 1
else:
    x = 0
Run Code Online (Sandbox Code Playgroud)

如果你想在一行中使用上述代码,可以使用以下代码:

x = 2 if i > 100 else 1 if i < 100 else 0
Run Code Online (Sandbox Code Playgroud)

这样做时,如果 i > 100,x 将被分配 2;如果 i < 100,x 将被分配 1;如果 i = 100,x 将被分配 0


alf*_*edo 7

三元运算符是简洁表达式的最佳方式。语法是variable = value_1 if condition else value_2. 因此,对于您的示例,您必须应用三元运算符两次:

i = 23 # set any value for i
x = 2 if i > 100 else 1 if i < 100 else 0
Run Code Online (Sandbox Code Playgroud)


Ari*_*iel 5

在我看来,还有一种方法是很难理解的,但我还是会出于好奇而分享:

x = (i>100 and 2) or (i<100 and 1) or 0
Run Code Online (Sandbox Code Playgroud)

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

  • 这看起来像规范的 javascript ;-) (3认同)

Sha*_*ane 5

您可以选择实际使用a的get方法dict

x = {i<100: -1, -10<=i<=10: 0, i>100: 1}.get(True, 2)
Run Code Online (Sandbox Code Playgroud)

get如果其中一个键可以保证计算为,则不需要该方法True

x = {i<0: -1, i==0: 0, i>0: 1}[True]
Run Code Online (Sandbox Code Playgroud)

理想情况下,最多不应将其中一个键评估为True。如果一个以上的键计算为True,则结果似乎不可预测。