把一个if-elif的 - else语句在同一行?

问题描述 投票:87回答:10

我已阅读下面的链接,但它并没有解决我的问题。 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]
python syntax
10个回答
144
投票

不,这是不可能的(至少在任意语句不),也不是可取的。在一个线拟合一切都将最有可能违反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

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

47
投票

如果你只需要针对不同的情况不同的表情,那么这可能为你工作:

expr1 if condition1 else expr2 if condition2 else expr

例如:

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

14
投票

只是窝另一个if语句else语句。但是,这并不使它看起来更漂亮的任何。

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

5
投票

您可以选择实际使用getdict方法:

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,结果可能似乎不可预知的。


4
投票

还有那在我看来相当不可读的,但无论如何,我会分享,就像一个好奇的选择:

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


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

上这样做,x将被分配2如果I> 100,1,如果I <100和0若i = 100


2
投票

这也取决于你的表情的性质。对“不这样做”其他答案一般的建议是通用的语句和通用的表情相当有效。

但是,如果你需要的是一个“调度”表一样,呼吁根据给定选项的值不同的功能,你可以把这种函数的字典里打电话。

就像是:

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

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

(也就是说,而不是

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

)


2
投票

人们已经提到的三元表达式。有时候,一个简单的有条件分配作为例子,可以使用数学表达式来有条件分配。这可能不会让你的代码可读性很强,但它确实得到它在一个相当短的线路。您的例子可以这样写:

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

攀比是真或假,然后用数字相乘时将1或0。人们可以使用的A +,而不是|在中间。


1
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.