2016-02-26 2 views
1

Python имеет функцию Truth Value Testing для всех объектов. Что позволяет более общее определение Boolean Operators, который подходит для всех объектов:Практические примеры оператора Python AND

  • x or y: если х ложна, то у, иначе х
  • x and y: если х ложна, то х, еще у

Я видел практические примеры использования для OR-оператора, например:

ENV_VAR = os.environ.get(‘ENV_VAR’) or <default_value> 

Однако, не я не видел никакого практического EXA с использованием оператора Python AND. Здесь я ищу примеры оператора AND, который использует тестирование истины, например, пример оператора OR выше.

+1

'ОС. getenv ('ENV_VAR', default = default_value) 'лучше – wim

+0

Звучит скорее как JavaScript ... Не уверен, что кто-то использует его в Python. – IanS

+0

Вы не видели 'if condition1 и condition2: do_something'? – gil

ответ

-1

Каждый раз, когда вам нужно заявление, в котором должны быть правдивы две вещи. Например:

# you want to see only odd numbers that are in both lists 
list1 = [1,5,7,6,4,9,13,519231] 
list2 = [55,9,3,20,18,7,519231] 
oddNumsInBothLists = [element for element in set(list1) if element in set(list2) and element % 2] 
# => oddNumsInBothLists = [7, 9, 519231] 

булевы операторы, в частности, и, как правило, могут быть опущены за счет удобства чтения. Встроенная функция all() вернет true, если и только если все ее члены верны. Аналогично, функция any() вернет true, если любой из ее членов является истинным.

shouldBeTrue = [foo() for foo in listOfFunctions] 
if all(shouldBeTrue): 
    print("Success") 
else: 
    print("Fail") 

Возможно, более простой способ думать об этом является то, что or будет использоваться вместо последовательных if-заявлений, тогда как and будет использоваться вместо вложенных if-заявления.

def foobar(foo, bar): 
    if(foo): 
     return foo 
    if(bar): 
     return bar 
    return False 

функционально идентичны:

def foobar(foo, bar): 
    return foo or bar 

И:

def foobar(foo, bar): 
    if(foo): 
     if(bar): 
      return bar 
    return False 

функционально идентичны:

def foobar(foo, bar): 
    return foo and bar 

Это может быть продемонстрировано с помощью простого теста.

class Foo: 
    def __init__(self, name): 
     self.name = name 

test1 = Foo("foo") 
test2 = Foo("bar") 

print((test1 or test2).name) # => foo 
print((test1 and test2).name) # => bar 
print((not test1 and not test2).name) # => AttributeError for 'bool' (False) 
+0

Приведенные примеры не идентичны. – wim

+0

@wim Функционально, я считаю, что они есть. – Goodies

+0

Спасибо @Goodies за ваш ответ, я получаю вашу мысль. Вы объясняете оценку короткого замыкания 'and' и' or'. Однако в ваших примерах функции, поскольку они только верят значение истины на основе 'foo' и' bar', вы опускаете тот факт, что 'and' и' or' также могут возвращать объект. Вот почему они не идентичны. – dawran6

1

К наиболее распространенным использование and в питона просто проверить несколько условий:

if 13 <= age <= 19 and gender == 'female': 
    print "it's a teenage girl" 

Прецеденты для and, которые принимают в своих интересах, возможно, удивительный факт, что x and y возвращает один из операндов , а не возвращать логическое число, немного и далеко друг от друга. Существует почти всегда более четкий и читаемый способ реализации той же логики.

В более раннем коде python вы можете найти конструкцию ниже, что является ошибкой в ​​попытке воспроизвести поведение тернарного оператора C (cond ? : x : y).

cond and x or y 

Это имеет недостаток: если x является 0, None, '', или какой-либо ценности falsey тогда y будет выбран вместо этого, так что это не совсем соответствует версии C.

Ниже «фиксированная» версия:

(cond and [x] or [y])[0] 

Такого рода и/или хаки в основном устарел, так как питон представил conditional expression.

x if cond else y 
0

Функция используется в вашем примере

os.environ.get(‘ENV_VAR’) or <default_value> 

называется оценка короткого замыкания. Если этот аспект AND и OR является предметом вашего вопроса, вы можете найти эту статью Википедии полезным:

https://en.wikipedia.org/wiki/Short-circuit_evaluation

0

я нашел большие примеры для обоих and и or оператора в этом ответе: https://stackoverflow.com/a/28321263/5050657

Прямая цитата из ответа:

Оператор Python or возвращает первое значение Truth-y или последнее значение и останавливается. Это очень полезно для общих заданий программирования, которые нуждаются в резерв значения.

Как этот простой:

print my_list or "no values" 

...

Комплимент с помощью and, которая возвращает первый Ложно-у значение, или последнее значение, и останавливается, используется, когда вам хотите охранник, а не резерв.

Как этот:

my_list and my_list.pop() 
0

Я иногда используя and, когда мне нужно, чтобы получить атрибут объекта, если это не None, в противном случае получить None:

>>> import re 

>>> match = re.search(r'\w(\d+)', 'test123') 

>>> number = match and match.group(1) 

>>> number 
>>> '123' 

>>> match = re.search(r'\w(\d+)', 'test') 

>>> number = match and match.group(1) 

>>> number 
Смежные вопросы