2012-12-25 265 views
60

我已阅读下面的链接,但没有解决我的问题。
Does Python have a ternary conditional operator?(问题是关于冷凝的if-else语句一行)
把一个if-elif-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] 

回答

91

不,这是不可能的(至少不能用任意语句),也不可取。将所有内容放在一行上最有可能违反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 
+0

为什么第二个表达式不返回0? _i_大于100 – AstralWolf

+1

@AstralWolf:是的,表达式说'2如果我> 100' ... –

+0

嗯,读为'如果我> 100其他0'现在不知道现在 – AstralWolf

36

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

expr1 if condition1 else expr2 if condition2 else expr 

例如:

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

'“pos”'是* not *声明,它是一个表达式。 –

+0

@TimPietzcker谢谢,我更新了帖子,以便更准确。 – Lycha

11

只是在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' 
2

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

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

喜欢的东西:

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

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

(即不是

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

1

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

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

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

2

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

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

基本上i>100i<100不能同时是真实的,所以如果其中一方是True你得到你想要的(2或1),如果没有他们的是True,你0值。

+0

哈哈...这是一个不错的小黑客,我喜欢它;) – akki