Неправильное поведение "ИЛИ" в питоне
Хы... я только учу питона. И я сделал такую программу:
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
,