Проблемы с навигацией по моим циклам в Python

#python #python-3.x

#python #python-3.x

Вопрос:

Я уже спрашивал людей вокруг меня и пытался бесчисленное количество раз получить эту программу исправления. Программа должна иметь возможность добавлять веб-сайты и пароли пользователей столько раз, сколько они захотят, и показывать выбранные ими веб-сайты и пароль.

На данный момент, когда вы отвечаете would you like to add another website? да, он не запрашивает повторно новое имя веб-сайта и пароль, а просто повторяет вопрос would you like to add another website? , также, когда вы ввели имя веб-сайта и пароль и ответили would you like to add another website? нет, затем выбрали вариант 1, чтобы просмотреть существующие учетные записи, он повторяется would you like to add another website? , когда это должно даже появиться в первом варианте

Входные данные и как они должны выводиться:

1) найдите свои существующие пароли
2) сохраните новый пароль для своих приложений
3) просмотрите сводку вашего хранилища паролей
4) успешно выйдите из хранилища паролей 1

У вас нет сохраненных веб-сайтов и паролей

1) найдите свои существующие пароли
2) сохраните новый пароль для своих приложений
3) просмотрите сводку вашего хранилища паролей
4) успешно выйдите из хранилища паролей 2

Как называется веб-сайт / приложение, которое вы добавляете? Instagram

Какой пароль у вашей учетной записи Instagram? bob91

Вы хотели бы добавить еще один веб-сайт? ДА

Как называется веб-сайт / приложение, которое вы добавляете? Facebook

Какой пароль у вашей учетной записи Facebook? bob92

Вы хотели бы добавить еще один веб-сайт? НЕТ

1) Найдите свои существующие пароли
2) Сохраните новый пароль для своих приложений
3) Просмотрите сводку вашего хранилища паролей
4) Успешно выйдите из хранилища паролей 1

введите приложение, которое вы хотите найти пароль для Instagram
имя веб-сайта = instagram
пароль = bob91

Полный код:

 vault_apps = []
app_name = ""
def locker_menu_func():
    print('''You have opened the locker, 
Please select what you would like to do,''')
    locker_menu_var = input('''Press: n1) find your existing passwords n2) save a new password for your appsn3) see a summary of your password locke n4) exit password locker successfullyn---------------------------------------------------------------------------------
    ''')
    print('''----------------------------------------------------------------''')
    while True:
        if locker_menu_var == "1":
            while len(vault_apps) < 1:
                print('''you have nothing stored''')
                if len(vault_apps) > 1:
                    print(vault_apps)

                break
            break
        if locker_menu_var == "2":
            app_name = input('''
What is the name of the website/app your are adding?
''')
            app_password = input('''What is the password of your {} account?
'''.format(app_name))
            vault_apps.append([app_name, app_password])
            while True: 
                ask_again = input('''Would you like to add another app and password? 
            ''')
                if ask_again.lower() == "yes":
                    locker_menu_var = "2"
                elif ask_again.lower() == "no":
                    locker_menu_func()


                else:
                    print("please enter a valid response") #should repeat if user want to add another website
  

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

1. Рекомендую использовать другой подход, при котором вы разделяете проблему на разные задачи. Напишите функцию для обработки запроса у пользователя ввода и просмотра того, что они вам дали. Напишите другие функции по одной для каждой задачи (функции обратного вызова). Затем напишите другую функцию с циклом, который вызывает вашу функцию пользовательского ввода, а затем функцию обратного вызова в соответствии с тем, что выбрал пользователь.

Ответ №1:

Ваш код не работает, потому что вы не break из while True: цикла:

 while True: 
    ask_again = input('''Would you like to add another app and password?''')
    if ask_again.lower() == "yes":
        locker_menu_var = "2"            <--- does not leave while loop
    elif ask_again.lower() == "no":
        locker_menu_func()
    else:
        # etc.
  

Держите свои методы небольшими и обрабатывайте одну проблему, чтобы упростить ваш поток управления, например:

 vault_apps = {}
# ,2,Hallo,Yuhu,y,Hallo2,Yuh,n,3,4
def menu():
    print('n' '-'*40)
    print('1) find your existing passwords')
    print('2) save a new password for your apps')
    print('3) see a summary of your password locker')
    print('4) exit password locker successfully')
    print('-'*40)
    k = None
    while k not in {"1","2","3","4"}:
        k = input("Choose: ")

    return int(k) # return the number chosen 

def input_new_app():
    global vault_apps
    app = None
    while not app:
        app = input("What is your apps name? ")
    pw = None
    while not pw:
        pw = input("What is your apps passphrase? ")
    vault_apps[app]=pw

def print_vault():
    print("Vault content:")
    for key,value in vault_apps.items():
        print(f"  {key:<10}t==>t{value}")

def find_password():
    if vault_apps:
        pass
    else:
        print("nothing in your password store")

def main():
    k = None    
    print('You have opened the locker,nPlease select what you would like to do.')
    while True:  
        choice = menu()
        if choice == 1:
            find_password()
        elif choice == 2:
            input_new_app()
            k = input("Would you like to add another app and password?").lower()
            while  k in {"yes","y"}:
                input_new_app()
        elif choice == 3:
            print_vault()
        elif choice == 4:
            print("Good bye")
            break

main()      
  

Вывод:

 You have opened the locker,
Please select what you would like to do.

----------------------------------------
1) find your existing passwords
2) save a new password for your apps
3) see a summary of your password locker
4) exit password locker successfully
----------------------------------------
Choose: 1
nothing in your password store

----------------------------------------
1) find your existing passwords
2) save a new password for your apps
3) see a summary of your password locker
4) exit password locker successfully
----------------------------------------
Choose: 2
What is your apps name? A
What is your apps passphrase? 66
Would you like to add another app and password? n
----------------------------------------
1) find your existing passwords
2) save a new password for your apps
3) see a summary of your password locker
4) exit password locker successfully
----------------------------------------
Choose: 3 
Vault content:
  A             ==> 66

----------------------------------------
1) find your existing passwords
2) save a new password for your apps
3) see a summary of your password locker
4) exit password locker successfully
----------------------------------------
Choose: 4
Good bye
  

Ответ №2:

Эта логика ошибочна. Как только вы входите в бесконечный цикл while, у вас нет другого способа выйти из него, кроме как ввести «нет». Когда вы вводите «yes», значение locker_menu_var изменяется, но вы не выходите из цикла, поэтому он продолжает повторять одно и то же меню.

             while True:     
            ask_again = input('''Would you like to add another app and password? 
        ''')
            if ask_again.lower() == "yes":
                locker_menu_var = "2"
            elif ask_again.lower() == "no":
                locker_menu_func()
  

Вы смешиваете циклирование и рекурсию, что приводит к путанице. Один из простых способов сделать это:

 vault_apps = []

def locker_menu():

    # the entry message
    msg = '''You have opened the locker, Please select what you would like to do,'''
    print(msg, end="nn")

    # nume options
    menu = ["1) find your existing passwords", 
    "2) save a new password for your apps", 
    "3) see a summary of your password locker", 
    "4) exit password locker successfully"]
    menu_string = f"Press:n{menu[0]}n{menu[1]}n{menu[2]}n{menu[3]}n"

    # now enter the loop
    while True:

        # input variable
        # NOTE: This variable is inside the loop, 
        # so that the user can enter the value everytime
        # the loop repeates.
        locker_menu_var = input(menu_string)

        if locker_menu_var == "1":
            # retrieve password for an existing record.
            # although it's not a good idea to just print
            # all the records, I am not changing your application logic
            # because I don't see any use in it.

            # you missed one case in your logic,
            # which I have fixed here.
            if len(vault_apps) == 0:
                print("you have nothing stored")
            else:
                print(vault_apps)

        elif locker_menu_var == "2":
            # for a new entry
            # enter your logic here
            an = input("app name: ")
            passw = input("password: ")
            vault_apps.append([an, passw])
            done = False # flag for exiting
            while not done:
                inp = input("enter another?")
                if inp == "yes":
                    # enter logic here
                    an = input("app name: ")
                    passw = input("password: ")
                    vault_apps.append([an, passw])
                else:
                    done = True
        elif locker_menu_var == "3":
            # do something
            pass
        elif locker_menu_var == "4":
            return          

if __name__ == "__main__":
    locker_menu()