一行if-condition-assignment

bdh*_*har 113 python if-statement

我有以下代码

num1 = 10
someBoolValue = True
Run Code Online (Sandbox Code Playgroud)

我需要设置的值num120如果someBoolValueTrue; 否则什么都不做.所以,这是我的代码

num1 = 20 if someBoolValue else num1
Run Code Online (Sandbox Code Playgroud)

有什么事我能避免这个...else num1部分让它看起来更干净吗?相当于

if someBoolValue:
    num1 = 20
Run Code Online (Sandbox Code Playgroud)

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

Fro*_*ost 164

我不认为这在Python中是可能的,因为你实际上想要做的事情可能会扩展到这样的事情:

num1 = 20 if someBoolValue else num1
Run Code Online (Sandbox Code Playgroud)

如果排除else num1,您将收到语法错误,因为我非常确定该作业必须实际返回一些内容.

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

if someBoolValue: num1=20
Run Code Online (Sandbox Code Playgroud)

num1 = someBoolValue and 20 or num1出于同样的原因,我不是一个忠实的粉丝.我必须三思而后行.

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

if someBoolValue:
    num1 = 20
Run Code Online (Sandbox Code Playgroud)

这是最好的verison的原因是因为它非常明显你想做什么,你不会混淆自己,或者其他任何人以后会接触到这些代码.

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

  • 根据PEP-308(https://docs.python.org/2.5/whatsnew/pep-308.html),如果放入paren,条件表达式可以更清晰,如`num1 =(20,如果someBoolValue else num1) `. (6认同)

gig*_*mon 40

用这个:

num1 = 20 if someBoolValue else num1
Run Code Online (Sandbox Code Playgroud)

  • 这就是我一直在使用......并寻找替代品......谢谢! (3认同)
  • 它是一个三元运算符 (2认同)
  • 如果循环遍历大型数据集,则不应该使用这种方法,因为它会引入不必要的赋值,以防我们最终进入 else 语句。 (2认同)

Adn*_*n Y 39

对于 Google 未来的时间旅行者,这是一种新方法(从 Python 3.8 开始提供):

\n
b = 1\nif a := b:\n    # this section is only reached if b is not 0 or false.\n    # Also, a is set to b\n    print(a, b)\n
Run Code Online (Sandbox Code Playgroud)\n

这被称为“海象运算符”。更多信息请参阅Python 3.8 中的 What\xe2\x80\x99s 新功能页面。

\n

  • 您能将变量拟合到问题中吗?num1 和 someBoolValue (2认同)

Deb*_*ski 19

在一行中:

if someBoolValue: num1 = 20
Run Code Online (Sandbox Code Playgroud)

但是不要这样做.通常不期望这种风格.为了清晰和一致,人们更喜欢较长的形式.

if someBoolValue:
    num1 = 20
Run Code Online (Sandbox Code Playgroud)

(同样,应该避免使用驼峰帽.所以请使用some_bool_value.)

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

  • 我为什么不应该这样做? (2认同)
  • 补充说明. (2认同)
  • 因为它很难阅读,你可能最终会被自己的代码弄糊涂,这绝不是一个好主意. (2认同)

小智 13

您可以使用以下之一:

(falseVal, trueVal)[TEST]

TEST and trueVal or falseVal
Run Code Online (Sandbox Code Playgroud)

  • 至少这些不是作业,除非你把一个放在它们前面,其次,它们不会像这里描述的那样工作。第一个创建一个元组,然后按索引选择其中一个元素。它仅适用于返回 -1 和 1 之间的整数或 `True`/`False` 的测试,因为 `bool` 是 `int` 的子类。在测试返回的结果只是评估为真的所有情况下,它会因异常而失败。第二个只有在 `trueVal` 本身不评估 false 时才有效,这会导致即使测试为真也会分配 `falseVal`。 (2认同)

Mar*_*ers 5

不,我想你希望有类似的东西num1 = 20 if someBoolValue可行,但事实并非如此.我认为最好的方法是使用if你写的声明:

if someBoolValue:
    num1 = 20
Run Code Online (Sandbox Code Playgroud)


Mik*_*eyB 5

num1 = 10 + 10*(someBoolValue is True)
Run Code Online (Sandbox Code Playgroud)

这是我新的最终答案。先前的答案如下,对于上述问题来说太过分了。Getting_too_clever == not Good。这是先前的答案......如果你想为Truecond添加一件事,为另一件事添加另一件事,那仍然很好False

num1 = 10 + (0,10)[someBoolValue is True]
Run Code Online (Sandbox Code Playgroud)

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

num1 = 10
someBoolValue = True

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

print(f'num1 = {num1}\nsomeBoolValue = {someBoolValue}')
Run Code Online (Sandbox Code Playgroud)

产生了这个输出

num1 = 20
someBoolValue = True
Run Code Online (Sandbox Code Playgroud)


Vah*_*aji 5

如果你肯定会遇到一行代码,Python 3.8引入了被亲切地称为“海象运算符”的赋值表达式

:=

someBoolValue and (num := 20)
Run Code Online (Sandbox Code Playgroud)

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

num = 10
someBoolValue = True

someBoolValue and (num := 20)
print(num) # 20

num = 10
someBoolValue = False

someBoolValue and (num := 20)
print(num) # 10
Run Code Online (Sandbox Code Playgroud)