Каков наилучший способ проверить, имеет ли кортеж какие-либо пустые значения /None в Python?

Каков наилучший/самый эффективный способ проверить, все ли значения кортежа? Нужно ли мне перебирать все элементы кортежа и проверять или есть еще лучший способ?

Например:

t1 = (1, 2, 'abc')
t2 = ('', 2, 3)
t3 = (0.0, 3, 5)
t4 = (4, 3, None)

Проверяя эти кортежи, каждый кортеж, кроме t1, должен возвращать True, то есть есть так называемое пустое значение.

P.S. есть этот вопрос: Проверить, если кортеж содержит только значения None с Python, но это только значения None

Ответ 1

Это очень просто:

not all(t1)

возвращает False, только если все значения в t1 не являются пустыми/ненулевыми, а не None. all коротких замыканий, поэтому он должен проверять элементы до первого пустого, что делает его очень быстрым.

Ответ 2

Был предоставлен ответ, используя все:

not all(t1)

Однако в случае, таком как t3, это вернет True, потому что одно из значений: 0:

t3 = (0.0, 3, 5)

Встроенное ключевое слово 'all' проверяет, являются ли все значения заданного итеративного значения значениями, которые вычисляются отрицательным логическим значением (False). 0, 0.0, '' и None - все равно False.

Если вы хотите протестировать только "Нет" (как следует из названия вопроса), это работает:

any(map(lambda x: x is None, t3))

Возвращает True, если какой-либо из элементов t3 имеет значение None или False, если ни один из них не является.

Ответ 3

В вашем конкретном случае вы можете использовать функцию all(), она проверяет все значения списка как истинные или ложные, обратите внимание на python None, пустая строка и 0 считаются ложными.

Итак -

>>> t1 = (1, 2, 'abc')
>>> t2 = ('', 2, 3)
>>> t3 = (0.0, 3, 5)
>>> t4 = (4, 3, None)
>>> all(t1)
True
>>> all(t2)
False
>>> all(t3)
False
>>> all(t4)
False
>>> if '':
...     print("Hello")
...
>>> if 0:
...     print("Hello")