python 这是三元运算符的正确用法吗

fivyi3re  于 2022-12-28  发布在  Python
关注(0)|答案(1)|浏览(130)

我想从列表中删除一个元素的简短形式,并使用以下代码:

>>> a = [1, 2, 3, 4]
>>> val = 3
>>> a.remove(val) if val in a else None
>>> a
>>> [1, 2, 4]
>>> val = 10
>>> a.remove(val) if val in a else None
>>> a
>>> [1, 2, 4]

显然,它工作,但它是一个正确的使用三元运算符?

oknwwptz

oknwwptz1#

不,这不是Python对三元组的使用。
让我们暂时把这个问题放在一边,看看:

a = [1, 2, 3]
print(a.remove(2))

这样就得到了None,因为.remove()在适当的位置工作。
现在,想想三元的我们为什么要这样做呢?通常是由于对任务的一些决定:

a = [1, 2, 3]
b = "foo" if a[0] == 1 else "bar"
print(b)

如果我们将这种模型应用到三元组中,你将 * 总是得到None *,这有点类似于使用列表解析for side effects

a = [1, 2, 3]
print(a.remove(2) if 2 in a else None)
print(a.remove(10) if 10 in a else None)

如果这个操作总是指向return None,那么任何一个代码的读者都会问,你为什么还要用三进制,一定有一些潜在的原因,因为你有一个else的情况,即使它实际上是一个空操作,因为没有找到值,但是我,作为一个读者,我无法确定条件是True还是False,因为无论哪种情况,我都会得到None
如注解中所述,您可以在一行中完成此操作:

a = [1, 2, 3]
if 2 in a: a.remove(2)
print(a)

这里的意图更加明确,因为不需要后备三元条件。即使如此,像这样的行是“无意义的”,但它比三元条件更好。
不仅如此,正如@nineteendo所指出的,如果将if检查压缩到一行,就会遇到linter问题:参见CO321,更一般地,参见PEP8

相关问题