Работа логических операторов and и or

Требуется проверить, является ли вводимая строка одной буквой или вводимая строка состоит из букв и ее длина совпадает с длинной заранее загаданного слова.

guessed_word = 'привет'

word_entered = input('Введи целиком слово или  одну букву \n').upper()  # Вводим предположительную букву или слово

while word_entered != word_entered.isalpha() and len(word_entered) != len(guessed_word) or word_entered != word_entered.isalpha() and len(word_entered) != 1:
     word_entered = input('Одну букву или слово целиком \n')

Eсли условие построить на проверку одной буквы, то все работает:

while word_entered != word_entered.isalpha() and len(word_entered) != 1:
     word_entered = input('Одну букву или слово целиком \n')

Но, как только появляется оператор or, все ломается.

Отсюда возникает вопрос, почему оно перестает работать и почему?


Ответы (2 шт):

Автор решения: MaxU

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

Для справки: Таблица приоритетов в Python

Примеры работы логических операторов без явного задания приоритетов:

In [83]: True and False or True and True
Out[83]: True

In [84]: True and False or False and True
Out[84]: False

т.е. True and False or False and True интерпретируется как:

In [89]: (True and False) or (False and True)
Out[89]: False

PS не уверен, что вы именно это имели ввиду когда написали вашу проверку без скобок


требуется чтобы пользователь ввел одну букву или слово длинной равной длинной заранее загаданному слову т.e == len(guessed_word)

while not (word_entered.isalpha() 
           and 
           (len(word_entered) == len(guessed_word) or len(word_entered) == 1)):
    word_entered = input('Одну букву или слово целиком \n')

→ Ссылка
Автор решения: CrazyElf

Добавлю может кому-то более понятное разъяснение. Согласно таблице приоритетов, приведённой в ответе у MaxU уважаемого, у and приоритет выше, чем у or, т.е. сначала выполняются все and, а уже после этого все or, т.е. например такое выражение:

a and b or c and d

Эквивалентно выражению:

(a and b) or (c and d)

И это легко запомнить, если знать, что:

  • and называется логическим умножением
  • or называется логическим сложением

А в каком порядке вычислять такое арифметическое выражение с умножениями и сложениями мы все прекрасно знаем:

a * b + c * d = (a * b) + (c * d)
→ Ссылка