190

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

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

if expression1:
   statement1
elif expression2:
   statement2
else:
   statement3

或者一个真实的例子:

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]
4

14 回答 14

261

不,这是不可能的(至少不是任意陈述),也不是可取的。将所有内容放在一行很可能违反PEP-8,其中规定行的长度不应超过 80 个字符。

这也违背了 Python 的禅宗:“可读性很重要”。(import this在 Python 提示符下键入以阅读整个内容)。

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

>>> 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
于 2012-12-25T09:16:46.143 回答
87

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

expr1 if condition1 else expr2 if condition2 else expr

例如:

a = "neg" if b<0 else "pos" if b>0 else "zero"
于 2012-12-25T09:36:08.597 回答
36

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

if expression1:
   statement1
elif expression2:
   statement2
else:
   statement3

转换为以下一个班轮:

statement1 if expression1 else (statement2 if expression2 else statement3)

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

于 2019-10-10T08:44:56.540 回答
27

只需在 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'
于 2012-12-25T09:42:41.757 回答
8

在我看来,有一个非常难以理解的替代方案,但我还是会出于好奇而分享:

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

于 2016-01-26T16:44:43.210 回答
8

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

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

get如果保证其中一个键的计算结果为:则不需要该方法True

x = {i<0: -1, i==0: 0, i>0: 1}[True]

理想情况下,最多一个键应该评估为True。如果多个键的计算结果为True,则结果似乎无法预测。

于 2016-11-22T13:50:54.960 回答
5

三元运算符是简洁表达式的最佳方式。语法是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
于 2019-05-17T21:14:28.743 回答
5

是的,你可以这样做:

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

x = 2 if i > 100 else ( 1 if i < 100 else 0)
print (x)
于 2021-08-12T16:41:50.727 回答
4
if i > 100:
    x = 2
elif i < 100:
    x = 1
else:
    x = 0

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

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

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

于 2019-01-10T03:24:39.367 回答
3

这也取决于你表达的性质。关于“不这样做”的其他答案的一般建议对于通用语句和通用表达式非常有效。

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

就像是:

def save(): 
   ...
def edit():
   ...
options = {"save": save, "edit": edit, "remove": lambda : "Not Implemented"}

option = get_input()
result = options[option]()

而不是 if-else:

if option=="save":
    save()
...
于 2012-12-25T12:55:19.550 回答
2

人们已经提到了三元表达式。有时以简单的条件赋值为例,可以使用数学表达式来执行条件赋值。这可能不会使您的代码非常具有可读性,但它确实可以在相当短的一行中得到它。你的例子可以这样写:

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

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

于 2012-12-25T21:30:36.927 回答
2

嵌套三元运算符是最好的解决方案——

示例案例 -

4 = 1

3 = 2

2 = 3

1 = 4
a = 4

prio = 4 if a == 1 else (3 if a == 2 else (2 if a == 3 else 1))
于 2021-06-26T13:04:27.677 回答
0

您可以使用嵌套的三元 if 语句。

# if-else ternary construct
country_code = 'USA'
is_USA = True if country_code == 'USA' else False
print('is_USA:', is_USA)

# if-elif-else ternary construct
# Create function to avoid repeating code.
def get_age_category_name(age):
    age_category_name = 'Young' if age <= 40 else ('Middle Aged' if age > 40 and age <= 65 else 'Senior')
    return age_category_name

print(get_age_category_name(25))
print(get_age_category_name(50))
print(get_age_category_name(75))
于 2018-03-31T20:31:50.473 回答
0
MESSAGELENGHT = 39
"A normal function call using if elif and else."
if MESSAGELENGHT == 16:
    Datapacket = "word"
elif MESSAGELENGHT == 8:
     Datapacket = 'byte'
else:
     Datapacket = 'bit'

#similarly for a oneliner expresion:
    

Datapacket = "word" if MESSAGELENGHT == 16 else 'byte' if MESSAGELENGHT == 8 else 'bit'
print(Datapacket)

谢谢

于 2021-02-27T16:03:26.647 回答