2013-05-08 3 views
1

В Python 2.5, я использовал код:с использованием «не» и «или» вместе в Python

yn=raw_input('''This program is for solving linear and quadratic equations. 
    Is this what you want to do? 
    ''') 
    if not 'y' in yn or 'Y' in yn: 
     print 'Program now quitting.' 

для отображения Program now quitting, когда программа закрыта, что должно было произойти, когда уп не содержит «у 'или' Y ', но он также отображался, когда yn содержал «Y», прежде чем остальная часть программы запустилась. Я думаю, что ошибка была вызвана использованием «или» и «не» вместе, так как она не изменилась, когда я изменил if not 'y' in yn or 'Y' in yn: к if not 'y' in yn or not 'Y' in yn:, но исчез, когда я изменил его на

if not 'y' in yn: 
     if not 'Y' in yn: 

Является ли это право ? Что бы я мог сделать, чтобы решить проблему и сохранить эту часть в одной строке?

+1

Возможно, если вы добавите скобки, вы можете получить ее правильно. То, как это написано, неоднозначно. Интерпретатору, возможно, придется выбирать между: (A || B) или (! A) || B. – Renan

+2

'if not yn.lower() == 'y'' может быть проще. – Matthias

+0

Если вы сомневаетесь, посмотрите [«Приоритет оператора»] (http://docs.python.org/2/reference/expressions.html#operator-precedence) и добавьте скобки в порядке очередности: 'in' then' not' то 'или' приводит к 'if ((не ('y' в yn)) или ('Y' в yn)):'. Вы также можете написать 'if 'y' не в yn и 'Y' не в yn' –

ответ

5

if not ('y' in yn or 'Y' in yn): должно работать.

+0

'' yn'' not 'yn' –

+1

@BurhanKhalid' yn' - введенная строка – jamylak

+0

О, в этом случае что-то не так с 'if yn [0] .upper() == 'Y':' –

0
if (not 'y' in yn) or (not 'Y' in yn): 
    print 'Program Now Quitting.' 
0

При использовании сомнения брекеты :)

в зависимости от того, что вы хотите достичь это может быть:

if (not 'y' in yn) or ('Y' in yn): 

или:

if not ('y' in yn or 'Y' in yn): 
2

smitec является правильным, но

if not 'y' in yn.lower(): 

может быть проще.

+0

Я думаю, что это лучший ответ, потому что он следует за [zen of python] (http://www.python.org/dev/peps/pep- 0020 /): 'Явный лучше, чем неявный. Простой лучше, чем complex.' – zmo

+0

Если вы конвертируете 'yn' в нижний регистр, проще использовать сравнение строк:' if yn.lower()! = 'Y': ' – chepner

+0

Решает текущую проблему, но не отвечает на вопрос «не» и «или». Тем не менее, я бы предложил написать его вот так, конечно ;-) – Alfe

0

Пожалуйста, обратите внимание, что написание более читаемым, как

if 'y' not in yn and 'Y' not in yn: 
    pass # ... 

Оператор not in не страдает от проблем, вы просто столкнуться.

Что касается Вашего прямого вопроса: Оператор not связывает с высоким приоритетом, так

not x or y 

интерпретируется как

(not x) or y 

Вы должны установить скобки, если вы хотите изменить это:

not (x or y) 

или транспонировать термин:

not x and not y