我知道这是一个老问题,但我想补充一个我认为更好的答案。
如果所有必须检查的元素都是可哈希的,则可以使用集合而不是列表或元组。
>>> None not in {1, 84, 'String', (6, 'Tuple'), 3}
这比其他答案中的方法快得多。
>>> import timeit
>>> timeit.timeit("all(v is not None for v in [1, 84, 'String', (6, 'Tuple'), 3])")
1.7880705000000034
>>> timeit.timeit("None not in [1, 84, 'String', (6, 'Tuple'), 3]")
0.35424169999998867
>>> timeit.timeit("None not in (1, 84, 'String', (6, 'Tuple'), 3)")
0.3454340999999772
>>> timeit.timeit("None not in {1, 84, 'String', (6, 'Tuple'), 3}")
0.09577370000002361
此方法的另一个优点是,即使有人定义了__eq__始终返回的类的方法,它也可以为您提供正确的答案True。(当然,如果他们将__hash__方法定义为return hash(None),则此方法将不起作用。但是,任何人都不应这样做,因为它会破坏定义哈希的目的。)
class my_int(int):
def __init__(self, parent):
super().__init__()
def __eq__(self, other):
return True
def __hash__(self):
return hash(super())
print(all(v is not None for v in [1, my_int(6), 2]))
print(None not in [1, my_int(6), 2])
print(None not in (1, my_int(6), 2))
print(None not in {1, my_int(6), 2})