2

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

我可以进行以下工作:

state = 1 if state == 4 else 2

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

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

我怎样才能在一行中实现这一点?

4

5 回答 5

6

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

因为state是一个整数,所以只需使用+,它一个运算符:

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

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

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

state = (state % 4) + 1

它首先实现了您想要实现的目标;限制在和state之间的值。14

于 2015-07-26T14:25:28.800 回答
1

这是不可能的,因为赋值不是 Python 中的表达式

在 Python 中,只有表达式才有值,这与 JavaScript 不同——几乎任何东西,包括赋值,都有值。

但是,您可以像这样编写程序:

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

这使得值取决于状态,而不是赋值。它适用于您的情况,因为状态变量总是被分配一个新值。

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

于 2015-07-26T14:25:46.410 回答
0

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

state = 1 if state == 4 else state + 1
于 2015-07-26T14:26:49.543 回答
0

这样做的另一种方法是:var = test and "when true" or "when false"

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

模数答案对此更好,但以上是有用的捷径

于 2015-07-26T15:16:30.700 回答
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
于 2018-01-25T03:04:00.030 回答