一行如果条件分配



>我有以下代码

num1 = 10
someBoolValue = True

我需要将num1的值设置为20,如果someBoolValue True;否则什么都不做。所以,这是我的代码

num1 = 20 if someBoolValue else num1

有没有办法避免...else num1部分以使其看起来更干净?相当于

if someBoolValue:
    num1 = 20

我尝试用这样的...else pass替换它:num1=20 if someBoolValue else pass.我得到的只是语法错误。我也不能省略...else num1部分。

我认为这在 Python 中是不可能的,因为你实际尝试做的事情可能会扩展到这样的东西:

num1 = 20 if someBoolValue else num1

如果排除else num1,您将收到语法错误,因为我很确定赋值实际上必须返回一些内容。

正如其他人已经提到的,你可以这样做,但这很糟糕,因为下次阅读那段代码时,你可能会让自己感到困惑:

if someBoolValue: num1=20

出于完全相同的原因,我不是num1 = someBoolValue and 20 or num1的忠实粉丝。我实际上必须三思而后行,这条线在做什么。

实际实现您想要做的事情的最佳方法是原始版本:

if someBoolValue:
    num1 = 20

这是最好的版本的原因是因为它非常明显地想要做什么,并且您不会混淆自己,或者以后会接触到该代码的其他人。

另外,作为旁注,num1 = 20 if someBoolValue是有效的 Ruby 代码,因为 Ruby 的工作方式略有不同。

使用这个:

num1 = 20 if someBoolValue else num1

对于来自 Google 的未来时间旅行者,这里有一种新的方式(从 Python 3.8 开始提供(:

b = 1
if a := b:
    # this section is only reached if b is not 0 or false.
    # Also, a is set to b
    print(a, b)

这被称为"海象操作员"。有关详细信息,请参阅 Python 3.8 中的新增功能页面。

在一行中:

if someBoolValue: num1 = 20

但不要那样做。这种样式通常不是预期的。人们更喜欢较长的形式,以获得清晰和一致。

if someBoolValue:
    num1 = 20

(同样,应避免使用骆驼帽。所以宁愿使用some_bool_value

请注意,不存在没有else部分的内联表达式some_value if predicate因为如果谓词为 false,则不会有返回值。但是,在所有情况下,表达式都必须具有明确定义的返回值。这与Ruby或Perl中的用法不同。

您可以使用以下方法之一:

(falseVal, trueVal)[TEST]
TEST and trueVal or falseVal

如果一行代码肯定会发生在你身上,Python 3.8 引入了赋值表达式,被亲切地称为"海象运算符"。

:=

someBoolValue and (num := 20)

如果第一个布尔表达式True,则该20将分配给num。赋值必须在此处的括号内,否则将出现语法错误。

num = 10
someBoolValue = True
someBoolValue and (num := 20)
print(num) # 20
num = 10
someBoolValue = False
someBoolValue and (num := 20)
print(num) # 10

No.我猜你希望像num1 = 20 if someBoolValue这样的东西会起作用,但它没有。我认为最好的方法是使用您写的if声明:

if someBoolValue:
    num1 = 20
num1 = 10 + 10*(someBoolValue is True)

这是我新的最终答案。先前的答案如下,对于所述问题来说矫枉过正。Getting_too_clever == not Good . 这是先前的答案...如果您想为 True cond 添加一件事,为False添加另一件事,仍然很好:

num1 = 10 + (0,10)[someBoolValue is True]

你提到num1已经有一个应该单独保留的值。 我假设num1 = 10因为这是帖子的第一个语句,所以到达20的操作是添加10

num1 = 10
someBoolValue = True
num1 = 10 + (0,10)[someBoolValue is True]
print(f'num1 = {num1}nsomeBoolValue = {someBoolValue}')

产生了此输出

num1 = 20
someBoolValue = True
num1 = 20 * someBoolValue or num1
如果您希望在

某个布尔值为真时调用方法,则可以放置else None来终止三位一体。

>>> a=1
>>> print(a) if a==1 else None
1
>>> print(a) if a==2 else None
>>> a=2
>>> print(a) if a==2 else None
2
>>> print(a) if a==1 else None
>>>

这是我能建议的。 使用另一个变量派生 if 子句并将其分配给 num1。

法典:

num2 =20 if someBoolValue else num1
num1=num2

如果你愿意,你绝对可以使用num1 =(如果某个BoolValue else num1,则为20(。

另一种方式 num1 = (20*boolVar)+(num1*(not boolVar))

你可以

这样做。

try:
    a = [i for i in [20] if False][0]
except IndexError:
    print("Do what ever you want here")

你可以通过这种方式解决问题,但是,使用"try/except block"并不是python的最佳实践。

最新更新