Один способ выхода из цикла работает, а другой не работает - PullRequest
0 голосов
/ 19 февраля 2019

Этот фрагмент кода не работает

    rsp = input("Please enter a command: ").strip()

    while rsp.lower() != "e" or rsp.lower() != "b":
        print("Invalid response, please try again!\n")
        rsp = input("Please enter a command: ").strip()

Но этот код

    while True:
        rsp = input("Please enter a command: ").strip()

        if rsp.lower() == "e" or rsp.lower() == "b":
            break

        print("Invalid response, please try again.\n")

Может кто-нибудь объяснить, почему первый код не работает.Когда я ввожу «e» или «b», я все еще застреваю в цикле while.

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

2 условия не идентичны:

rsp.lower() != "e" or rsp.lower() != "b":

- это не то же самое, что

rsp.lower() == "e" or rsp.lower() == "b":

Вы можете сделать это более понятным следующим образом:

rsp.lower() in ("e", "b"):

, который также имеет дополнительное преимущество использования только одного звонка на .lower().

0 голосов
/ 19 февраля 2019

Проблема заключается в логике цикла while:

while rsp.lower() != "e" or rsp.lower() != "b"

Из-за оператора or, независимо от того, какой символ введен для rsp.lower(), он не будет удовлетворять и одновременно означает «е» и «b».

То есть

if rsp.lower() == "e": тогда оно не удовлетворяет rsp.lower() == "b"

аналогично:

if rsp.lower() == "b": тогда он не удовлетворяет rsp.lower() == "e"

То, что вы хотели бы использовать, это оператор and.Это будет указывать, является ли символ ни "b", ни "e".:

while rsp.lower() != "e" and rsp.lower() != "b":
0 голосов
/ 19 февраля 2019

Независимо от того, что вы введете, оно не будет ни буквой "e", ни буквой "b", поэтому ваше утверждение while всегда верно.

Вместо этого попробуйте rsp.lower ()! = "E" и rsp.lower ()! = "B".

...