Python一行if-else与不同的运算符

时间:2015-07-26 14:24:27

标签: python conditional-expressions augmented-assignment

我正在摆弄一行if if和for python中的语句并遇到以下问题:

我可以做类似以下的工作:

state = 1 if state == 4 else 2

但我想在相同的上下文中使用=和+ =,如下所示:

state = 1 if state == 4 else state+=1

如何在一行中实现这一点?

5 个答案:

答案 0 :(得分:5)

+=不是运算符,而是语句。您不能在表达式中使用语句。

由于state是一个整数,只需使用+,其中 是一个运算符:

state = 1 if state == 4 else state + 1

最终结果与使用+=就地添加完全相同。

更好的是,使用%模数运算符:

state = (state % 4) + 1

首先实现了你想要达到的目标;将state限制为14之间的值。

答案 1 :(得分:1)

这是不可能的,因为assignment不是Python中的expression

只有表达式在Python中具有值,例如与JavaScript不同 - 几乎任何东西,包括赋值,都有值。

你可以这样写你的程序,但是:

state = 1 if state == 4 else state + 1

这使得值以状态为条件,而不是赋值。它适用于您的情况,因为状态变量总是被赋予一个新值。

在一般情况下,假设您要根据当前状态更新不同的变量,您应该坚持使用常规if语句。不要过度使用三元运算符(x if C else y) - 只有在它使代码更具可读性时才使用它。

答案 2 :(得分:0)

您已将结果分配给state,因此您可以:

state = 1 if state == 4 else state + 1

答案 3 :(得分:0)

另一种方法是: var = test和“when true”或“when false”

state = state == 4 and 1 or state + 1

模数答案对此更好,但上面是有用的快捷方式

答案 4 :(得分:0)

使用lambda:

state = (lambda n:[n+1,0][n==4] )(state)

所以,实质上:

[n+1,0][1] #True(1):表示索引#1,即0 [n+1,0][0] #False(0):表示获取索引#0,即n + 1

为了使其更具可读性,我将其细分为一个函数:

def myfunc(n):
    ans = [ n+1, 0 ]
    if n==4:
        return ans[1] # which is the value 0
    else:
        return ans[0] # which is n+1

state=6
state=myfunc(state) # returns 7
state=4
state=myfunc(state) # returns 0