Python - оператор «И» не работает должным образом - PullRequest
0 голосов
/ 20 марта 2019

По какой-то причине оператор and не работает должным образом в цикле while.

Когда я запускаю код, он выходит из цикла, когда совпадают либо пароль, либо имя пользователя, но не оба.

Любая помощь будет полезна.

    root_password = "password123"
    root_username = "root"
    username = "default"
    password = "default"

    while username != root_username and password != root_password:
        username = input("Username: ")
        password = input("Password: ")
        if username != root_username and password != root_password:
        print("Wrong Credentials")


    print("Welcome")

Ответы [ 3 ]

2 голосов
/ 20 марта 2019

Оператор and точно делает то, что должен, он остается в цикле, пока оба не совпадают. То, что вы хотите, это продолжить цикл, пока оба не совпадут, поэтому вы должны использовать оператор ИЛИ

0 голосов
/ 20 марта 2019

Один из способов сделать это - создать условное выражение, которое проверяет, совпадают ли имя пользователя и пароль, а затем поставить not перед этим условным условием, например:

not (username == root_username and password == root_password)

Это просто проверяет, нет ли у пользователя подходящего имени пользователя и пароля, или нет правильных учетных данных.

Как сказал Спидди, используя законы Де-Моргана, это условие аналогично username != root_username or password != root_password, но это только облегчает чтение и понимание кода.

Вот код с этим изменением:

root_password = "password123"
root_username = "root"
username = "default"
password = "default"

while not (username == root_username and password == root_password):
  username = input("Username: ")
  password = input("Password: ")
  if not (username == root_username and password == root_password):
    print("Wrong Credentials")

print("Welcome")
0 голосов
/ 20 марта 2019

Это приведет к True только в том случае, если оба, имя пользователя и пароль не совпадают.Если имя пользователя правильное, но пароль неправильный, False и True = False, и цикл завершится.Что вам нужно, это запросить «Неверные учетные данные», когда один из них не так, используя ИЛИ.

Это распространенная ошибка при работе с отрицаниями или дополнениями.См. Законы Моргана:

!(username == root_username and password==root_password)

is

username != root_username or password!=root_password
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...