2013-12-04 4 views
2

В моем проекте я использовал или, но в некоторых случаях это работает, и в некоторых случаях это терпит неудачу. Я не могу понять Почему?Как использовать или оператор в python

if (a or b) is not True: 
    # This works for me 


if (a or b) == "Django" and (c or d) == "Pyramid": 
    # This fails me everytime 
+5

Вы должны читать документы - вы понятия не имеете, что «или» действительно ;-) –

ответ

3

a or b вычисляет a если a вычисляет True. Если a - False, a or b - b.

Например:

[] or 'a' #evaluates to 'a' 
'a' or None #evaluates to 'a' 
[] or None #evaluates to None 
None or [] #evaluates to [] 

Ваш (a or b) == 'Django' должен быть a == 'Django' or b == 'Django'.

('Django' or 'Nomatterwhat') == 'Django' #True 
([] or 'Django') == 'Django' #True 
('Mono' or 'Django') == 'Django' #False 

Сказав теоретическую часть, попробуйте запустить эту маленькую программу, чтобы увидеть, как or и and работы (особенно ленивая оценка часть):

def x(): 
    print('X') 
    return False 

def y(): 
    print('Y') 
    return True 

print ('-' * 20) 
x() or y() 
print ('-' * 20) 
y() or x() 
print ('-' * 20) 
x() and y() 
print ('-' * 20) 
y() and x() 
+0

'б ==«Djange'' ??? ???? опечатка: D –

+0

@KDawG исправлена. Спасибо. – Hyperboreus

+0

Нет второго вопроса из ответа, который вы мне дали ... Спасибо – manjusha

0

Ваши круглые скобки находятся не в том месте. (a or b) всегда будет возвращать первый из a или b, который истинно, так:

>>> a = "Django" 
>>> b = "Pyramid" 
>>> (a or b) 
"Django" 
>>> (a or b) == "Django" 
True 

но

>>> (b or a) 
"Pyramid" 
>>> (b or a) == "Django" 
False 

То, что вы на самом деле хотите, чтобы написать это:

>>> a == "Django" or b == "Django" 
True 

Однако, альтернативный способ его написания, который может быть лучше во многих случаях:

if "Django" in (a, b) or "Pyramid" in (a, b): 
    ... 

Или, если есть много вариантов:

if set([a, b, c, ...]) & set(["Django", "Pyramid", ...]): 
    ... 
+0

В какой версии python и в которой реализация разрешает '' Django '' или 'Pyramid'' 'True'? И еще более интересно: зачем «(« Django »или« Pyramid ») ==« Django'' быть «ложным»? – Hyperboreus

+0

Я пробовал его как в 3.3, так и в 2.7 (cython), и в обеих версиях я получаю совершенно разные результаты, как те, которые вы разместили. – Hyperboreus

+0

Извините, опечатка! Это должно быть «Django», я исправлю ответ и сделаю смысл более ясным – aquavitae

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