我想从列表中删除一个元素的简短形式,并使用以下代码:
>>> 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]
显然,它工作,但它是一个正确的使用三元运算符?
oknwwptz1#
不,这不是Python对三元组的使用。让我们暂时把这个问题放在一边,看看:
a = [1, 2, 3] print(a.remove(2))
这样就得到了None,因为.remove()在适当的位置工作。现在,想想三元的我们为什么要这样做呢?通常是由于对任务的一些决定:
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。如注解中所述,您可以在一行中完成此操作:
return None
else
True
False
a = [1, 2, 3] if 2 in a: a.remove(2) print(a)
这里的意图更加明确,因为不需要后备三元条件。即使如此,像这样的行是“无意义的”,但它比三元条件更好。不仅如此,正如@nineteendo所指出的,如果将if检查压缩到一行,就会遇到linter问题:参见CO321,更一般地,参见PEP8
if
1条答案
按热度按时间oknwwptz1#
不,这不是Python对三元组的使用。
让我们暂时把这个问题放在一边,看看:
这样就得到了
None
,因为.remove()
在适当的位置工作。现在,想想三元的我们为什么要这样做呢?通常是由于对任务的一些决定:
如果我们将这种模型应用到三元组中,你将 * 总是得到
None
*,这有点类似于使用列表解析for side effects。如果这个操作总是指向
return None
,那么任何一个代码的读者都会问,你为什么还要用三进制,一定有一些潜在的原因,因为你有一个else
的情况,即使它实际上是一个空操作,因为没有找到值,但是我,作为一个读者,我无法确定条件是True
还是False
,因为无论哪种情况,我都会得到None
。如注解中所述,您可以在一行中完成此操作:
这里的意图更加明确,因为不需要后备三元条件。即使如此,像这样的行是“无意义的”,但它比三元条件更好。
不仅如此,正如@nineteendo所指出的,如果将
if
检查压缩到一行,就会遇到linter问题:参见CO321,更一般地,参见PEP8