Система входа в систему с ошибкой бесконечного цикла

#python

#python

Вопрос:

Я кодирую себе «простую» систему входа в систему, все работает нормально вплоть до LOGIN части.

while Цикл в конце происходит только один раз, даже если я ввел другого пользователя, а не то, что я создал при запуске программы. В какой-то момент я заставил ее работать, но затем возникла другая проблема, из-за которой while цикл повторялся снова и снова.

 import re
users = {}
status = ""


while status != "r":
    status = input("Press R to register!n")

    if status == "r":
        createUser = input("Create your Username: ")
        while len(createUser)< 5:                                   #checks user len
            print("Username should contain at least 5 characters!")

            createUser = input("Create your Username: ")            #repeat if user len < 5

        while not re.match("^[a-z]*$" , createUser):                   # denies blank spaces
            print("Cannot use blank spaces")
            createUser = input("Create your Username: ")

        if createUser in users:
            print("Username already used!")
        else:
            createPass = input("Create your Password: ")
            while len(createPass) < 5:                              #checks pass len
                print("Password too short!n          Password should contain at least 5 characters!n")
                createPass = input("Create your Password: ")        #repeat if pass len < 5

            while not re.match("^[a-z]*$", createPass):  # denies blank spaces
                print("Cannot use blank spaces")
                createPass = input("Create your Password: ")


            else:
                users[createUser] = createPass  #adds user and pass to users
            print("User created!")

        #LOGIN
            for createUser in users:
                username = input("Username: ")
                if username == createUser in users:
                    password = input("Password: ")
                else:
                    while username != createUser:
                        print("User unregistered! Please register!")
                        createUser = input("Create your Username:")
  

Комментарии:

1. Что if username == createUser in users: предполагается делать

2. PS: m a noob , criticise everything you see I Я сделал неправильно, я действительно хочу больше изучать python. Спасибо!

3. Я надеялся, что он проверит, совпадает ли записанное имя пользователя с тем, которое было создано ранее, и, если оно есть, перейдите к вводу пароля..

4. Попробуйте добавить . перейдите к вашей переменной во входной переменной, status = input("Enter 'R' to register: ").lower() .

5. Попробуйте разбить свой код на функции. Вам очень редко нужно использовать три уровня отступов.

Ответ №1:

Во-первых, "^[a-z]*$" тесты не содержат строчных букв, это не означает «нет пробелов», поэтому я исправил это для вас с помощью "\s "

Вам действительно нужно узнать о методах и разбить вашу проблему.

1) Запросите имя пользователя

 def get_username():
    while True:
        uname = input("Create your Username: ")
        if len(uname) < 5:
            print("Username should contain at least 5 characters!")
            continue
        if re.search("\s ", uname):
            print("Cannot use blank spaces")
            continue
        break # input successful
    return uname
  

2) Запросить пароль

 def get_password():
    while True:
        passwd = input("Create your Password: ")
        if len(passwd) < 5:
            print("Password too short!ntPassword should contain at least 5 characters!n")
            continue
        if re.search("\s ", passwd):
            print("Cannot use blank spaces")
            continue
        break # input successful
    return passwd
  

3) Регистрация

 def register():
    while True:
        uname = get_username()
        if uname not in users:
            break  # continue to get password
        else:
            print("Username already used!")

    passwd = get_password()
    if passwd:
        users[uname] = passwd
    print("User created!")
  

4) Попытка входа в систему (максимум 3 попытки). В настоящее время неясно, как вы хотите это запустить…

 def login():
    for i in range(3):
        username = input("Username: ")
        if username in users:
            password = input("Password: ")
            if users[username] != password:
                print("Wrong username or password")
        else:
            print("User does not exist")
    else:
        print("Max attempts reached")
  

5) (необязательно) Узнайте о D.R.Y, поскольку ваши тесты по сути одинаковы

 def test_input(s):
    if len(s) < 5:
        print("Input should contain at least 5 characters!")
        return False
    if re.search("\s ", s):
        print("Cannot use blank spaces")
        return False
    return True
  

6) Запустите некоторый код, который использует все эти методы.

 status = input("Press R to register!n")
if status.lower() == "r":
    register()
  

Комментарии:

1. Ха-ха, мы опубликовали ответ одновременно 😉

2. @MateenUlhaq я заметил 🙂

Ответ №2:

Попробуйте это:

 def login():
    username = input("Username: ")

    if username not in users:
        print("User unregistered! Please register!")
        register()
        return

    password = input("Password: ")

    if users[username] != password
        print("Password invalid")
  

Я переписал ваш код здесь. Обратите внимание, как я разбил его на функции, которые выполняют одну вещь:

  • usernameValidator
  • PasswordValidator
  • GetUserName
  • getPassword
  • Зарегистрироваться
  • войти

Начало программы:

 import re
users = {}
  

Теперь мы определяем некоторые валидаторы для проверки правильности имени пользователя / пароля:

 def usernameValidator(username):
    errorMessage = ""
    if len(username) < 5:
        errorMessage  = "Username should contain at least 5 characters!n"
    if not re.match("^[a-z]*$" , username):       # Note... this checks for more than just blank spaces!
        errorMessage  = "Cannot use blank spacesn"
    if username in users:
        errorMessage  = "Username already used!n"
    return errorMessage

def passwordValidator(password):
    errorMessage = ""
    if len(password) < 5:
        errorMessage  = "Password should contain at least 5 characters!n"
    if not re.match("^[a-z]*$" , password):       # Note... this checks for more than just blank spaces!
        errorMessage  = "Cannot use blank spacesn"
    return errorMessage
  

Теперь мы пишем функции GetUserName / getPassword, которые взаимодействуют с пользователем:

 def getUsername():
    username = input("Create your Username: ")
    errorMsg = usernameValidator(username)
    print(errorMsg)

    return username if errorMsg == "" else ""

def getPassword():
    password = input("Create your Password: ")
    errorMsg = passwordValidator(password)
    print(errorMsg)

    return password if errorMsg == "" else ""
  

Собрав все это вместе, мы пишем register / login:

 def register():
    username = ""
    password = ""

    while username == "":
        username = getUsername()

    while password == "":
        password = getPassword()

    users[username] = password
    print("User created!")

def login():
    username = input("Username: ")

    if username not in users:
        print("User unregistered! Please register!")
        register()
        return

    password = input("Password: ")

    if users[username] != password:
        print("Password invalid")
  

Наконец, мы можем запустить:

 while True:
    status = input("Press R to register!nPress L to loginn")

    if status.lower() == "r":
        register()
    if status.lower() == "l":
        login()
  

Попробуйте это онлайн.