Существует на самом деле не лучше, чем способ тестирования каждого состояния индивидуально, но вы можете сделать это компактно в списке понимания, например:
conditions = (xpr0, xpr1, xpr2, xpr3)
print [i for i, xpr in enumerate(conditions) if xpr]
напечатает список индексов выражений, которые являются истинными. Однако это не приведет к короткому замыканию, которое вы получите с помощью or
.
Конечно, вы можете принудительно короткого замыкания с помощью «традиционных» for
цикл с break
заявление, например:
for i, xpr in enumerate(conditions):
if xpr:
print i, xpr
break
хотя это не точно так же, как короткое замыкание выполняется по
if xpr0 or xpr1 or xpr2 or xpr3:
потому что мы уже предварительно вычислены все выражения в conditions
списке.
Как Хиро герой упоминает в комментариях, вы можете проверить, если любой из этих выражений справедливы с
any(conditions)
и будет короткого замыкания точно так же, как традиционные for
петли код выше.
FWIW, как правило, использует выражение any
и all
вместо выражения списка comp, поскольку это позволяет избежать ненужной оценки выражений после достижения точки короткого замыкания, но здесь это не применимо.
Что относительно ['any (xpr1, xpr2, ...)'] (https://docs.python.org/3.5/library/functions.html#any)? для отладки вы можете использовать '[bool (x) для x in (xp1, xpr2, ...)]'. –
@hiro all() возвращает True, если все элементы True, если (...) из UserZer0 возвращает True, если хотя бы один элемент имеет значение True. – Humbalan
@ Хумбалан да, только что заметил и исправил. –