ChatGPT解决这个技术问题 Extra ChatGPT

一行 if 条件赋值

我有以下代码

num1 = 10
someBoolValue = True

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

num1 = 20 if someBoolValue else num1

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

if someBoolValue:
    num1 = 20

我尝试将其替换为 ...else pass,如下所示:num1=20 if someBoolValue else pass。我得到的只是语法错误。我也不能省略 ...else num1 部分。

只需将其全部更改为 num1 = 20 if someBoolValue else 10。然后你也保存 num1=10 行吗?
谢谢。但这不完全是我的代码。我的意思是 num1 已经存在...

v
vidstige

我认为这在 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 的工作方式略有不同。


根据 PEP-308 (docs.python.org/2.5/whatsnew/pep-308.html),如果放在括号中,条件表达式可以更清晰,如 num1 = (20 if someBoolValue else num1)
但请注意除以零语句 - 如果 my_var 为 0,则 num_cats = math.ceil(num_humans / my_var) if my_var > 1 else 1 生成除以零,即使该代码的条件为假
g
gigimon

用这个:

num1 = 20 if someBoolValue else num1

这就是我一直在使用的.. 并正在寻找替代品.. 无论如何谢谢!!
如何调用这个块?我的意思是它叫什么名字?
它是一个三元运算符
如果遍历大型数据集,则不应使用这种方法,因为它会引入不必要的分配,以防我们最终进入 else 语句。
D
Debilski

在一行中:

if someBoolValue: num1 = 20

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

if someBoolValue:
    num1 = 20

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

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


因为它很难阅读,而且您最终可能会被自己的代码弄糊涂,这绝不是一个好主意。
@bdhar,你为什么要把它放在一行上?它不会运行得更快,只是其他人更难阅读
@gnibbler,实际上没有理由。我正在寻找一种更短的形式,具有更好的可读性..
t
the Tin Man

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

(falseVal, trueVal)[TEST]

TEST and trueVal or falseVal

不错的单行条件分配
这个“结构”怎么称呼?在学习 Python 约 6 个月的时间里,我从未见过这种情况。
至少这些不是作业,除非你在它们前面放一个,其次,它们不会按照这里描述的方式工作。第一个创建一个元组,然后按索引选择其中一个元素。它仅适用于返回介于 -1 和 1 之间的整数或 True/False 的测试,因为 boolint 的子类。在所有情况下,如果测试返回的东西只会评估为真,它就会失败并出现异常。第二个只有在 trueVal 本身不评估 false 时才有效,即使测试为 true,也会导致分配 falseVal
它很短,但安全地用作“推荐模式”也非常棘手,请参阅 Bachsau 的上述评论......(所以我否决了它)
b
bad_coder

对于来自 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)

感谢您的回答,我想知道这是什么奇怪的语法以及为什么它不适用于 python3.7:D
请注意,这仅在 Python>=3.8 中可用
关于新 if-else 代码样式的最佳说明。谢谢
V
Vahid Hallaji

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

:=

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

t
the Tin Man

不。我猜你希望像 num1 = 20 if someBoolValue 这样的东西会起作用,但事实并非如此。我认为最好的方法是使用您编写的 if 语句:

if someBoolValue:
    num1 = 20

M
Mike from PSG
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 = 10 + 10 *(someBoolValue == True)'问题定义为'False'条件基本上是无操作。如果需要选择为“False”添加不同的值,那么之前的答案更合适。我是编辑我的帖子还是在评论中这样做?
A
Ajean

如果您希望在某个布尔值为真时调用方法,您可以使用 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
>>>

p
pacholik
num1 = 20 * someBoolValue or num1

j
j raj

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

代码:

num2 =20 if someBoolValue else num1
num1=num2

Y
Yaonan Qian

如果需要,您绝对可以使用 num1 = (20 if someBoolValue else num1) 。


重复上述答案?
R
Rody From Argentina

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


A
Ayesh Weerasinghe

你可以这样做。

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

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