Подтвердить что ты не робот

Как вы используете OR, AND в условных выражениях?

Я нашел себя много раз, с вещами, в которых мне нужно быть всем или хотя бы равным чему-то, и я бы написал что-то вроде этого:

if a==1 and b==1:
   do something

или

if a==1 or b==1:
   do something

Если количество вещей невелико, это нормально, но оно по-прежнему не является элегантным. Итак, есть ли лучший способ для значительного количества вещей сделать это? Спасибо.

4b9b3361

Ответ 1

Вариант 1: любой/все

В общем случае посмотрите any и all:

if all(x == 1 for x in a, b, c, d):

if any(x == 1 for x in a, b, c, d):

Вы также можете использовать любой итеративный вариант:

if any(x == 1 for x in states):

Вариант 2 - цепочка и

В первом примере вы можете использовать логическое цепочку операторов:

if a == b == c == d == 1:

В качестве второго примера вы можете использовать in:

if 1 in states:

Вариант 3: любой/все без предиката

Если вам все равно, правда ли это, вы можете упростить:

if any(flags):

if all(flags):

Ответ 2

Проверьте это

if all(x >= 2 for x in (A, B, C, D)):

где A, B, C, D - все переменные...

Ответ 3

Мне нравится эта форма как легко понятная в Python

def cond(t,v):
    return t == v

a=1
b=3    
tests=[(a,1),(b,2)]

print any(cond(t,v) for t,v in tests)  # eq to OR  
print all(cond(t,v) for t,v in tests)  # eq to AND     

Печать

True
False

Тогда cond() может быть как можно сложнее.

Вы можете предоставить пользователю возможность вызова или использовать операторский модуль для большей гибкости:

import operator

def condOP(t,v,op=operator.eq):
    return op(t,v)

a=1
b=3    
tests=[(a,1,operator.eq),(b,2,operator.gt)]

print any(condOP(*t) for t in tests)  # eq to OR  
print all(condOP(*t) for t in tests)  # eq to AND 

Или даже проще:

tests=[(a,1,operator.eq),(b,2,operator.gt)]

print any(func(t,v) for t,v,func in tests)  # eq to OR  
print all(func(t,v) for t,v,func in tests)  # eq to AND