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

时间:2012-12-25 09:09:13

标签: python syntax

我已阅读下面的链接,但它没有解决我的问题 Does Python have a ternary conditional operator?(问题是将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]

13 个答案:

答案 0 :(得分:132)

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

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

可以在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

答案 1 :(得分:43)

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

expr1 if condition1 else expr2 if condition2 else expr

例如:

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

答案 2 :(得分:12)

在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'

答案 3 :(得分:4)

在我看来,有另一种选择是不可读的,但无论如何我都会分享好奇心:

public static class ImmutableListService {

    public void handle(Message<ImmutableList<String>> data) {
        System.out.println("!!!!" + data);
    }

}

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

答案 4 :(得分:4)

您可以选择实际使用get的{​​{1}}方法:

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,则结果似乎无法预测。

答案 5 :(得分:3)

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,则x将被分配;如果i = 100,则x将被分配给

答案 6 :(得分:3)

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

if expression1:
   statement1
elif expression2:
   statement2
else:
   statement3

转换为以下一种衬纸:

statement1 if expression1 else (statement2 if expression2 else statement3)

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

答案 7 :(得分:2)

它还取决于你的表达的性质。关于&#34;没有做到的其他答案的一般建议&#34;对于泛型语句和泛型表达式非常有用。

但如果你需要的只是一个&#34; dispacth&#34; table,like,根据给定选项的值调用不同的函数,可以将函数放入字典中调用。

类似的东西:

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

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

(而不是

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

答案 8 :(得分:2)

人们已经提到过三元表达。有时使用简单的条件赋值作为示例,可以使用数学表达式来执行条件赋值。这可能不会使您的代码具有可读性,但它确实可以在相当短的时间内完成。您的示例可以这样写:

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

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

答案 9 :(得分: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))

答案 10 :(得分:0)

ternary operator是表达简洁的最佳方法。语法为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

答案 11 :(得分: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)

谢谢

答案 12 :(得分:0)

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

示例案例 -

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))