Неправильное поведение "ИЛИ" в питоне

Хы... я только учу питона. И я сделал такую ​​программу:

guess = raw_input("please input something...");
while (guess != 'h'):
    guess = raw_input("pleae input something again....");
    print(guess);

print("Thanks...");

Хорошо... Выше программа работает хорошо. Но когда я ставлю "ИЛИ" после догадки!= 'H' вот так:

guess = raw_input("please input something...");
while (guess != 'h') or (guess != 't'):
    guess = raw_input("pleae input something again....");
    print(guess);

print("Thanks...");

Выше программа работает вечно в то время как цикл. Что там происходит? Я думал, что цикл будет завершен после ввода или ч или т

3 ответа

Решение

Ваше состояние всегда выполняется:

(guess != 'h') or (guess != 't')

Всегда верно (если одна часть неверна, это означает, что другая часть есть).

Если вы используете здесь закон Де-Моргана, вы получите нечто более очевидное:

not (guess == 'n' and guess == 't')

Это, очевидно, всегда верно (guess может быть только одно).

Вы, вероятно, хотите:

(guess != 'h') and (guess != 't')

Или еще лучше:

while guess not in 'ht':
while (guess != 'h') or (guess != 't') 

Эта строка в основном говорит: повторите цикл, если мой ввод не "ч" или мой ввод не "т". Поскольку консольный ввод не может быть одновременно h и t, цикл будет повторяться вечно. Вы уверены, что не ищете while guess != 'h' and guess != 't' или же while not (guess == 'h' or guess == 't') (оба они идентичны с логической точки зрения)?

Это не плохое поведение; это то, как булева логика работает на всех языках. Для такого сравнения нужно использовать and,

Другие вопросы по тегам