首页 > 解决方案 > 如何修复由 Python 中的函数引起的这个无限循环?

问题描述

我似乎创建了一个正常工作的银行帐户登录系统。唯一的问题是,一旦登录成功,程序就会陷入循环。例如:假设我创建了我的帐户并将我的用户名设置为“Hello”,并将我的密码设置为“123”。

该程序将排除这些登录详细信息,但是当我稍后尝试使用它们登录时,会发生无限循环。

我尝试通过插入状态的返回/全局值来修正这个问题,甚至将它们放在我程序中尽可能多的位置,但无限循环问题仍然存在。你能帮我找出循环继续执行的原因吗?


users = {}
status = ""

                            #--------------- Login menu -----------------#
def displayMenu():
    global status

    status = input("Are you a registered user? \n1 - Yes \n2 - No \nQ - Quit \n")  
    if status == '1':
        oldUser()
    elif status == '2':
        newUser()
    return status


def mainMenu():
    print("Hello account holder", login,"what service would  you like to use today?")

                            #---------- Screen for new users -------------#

def newUser():
    createLogin = input("Create login name: ")

    if createLogin in users: # check if login name exists
        print ("\nLogin name already exists!\n")
    else:
        createPassw = input("Create password: ")
        users[createLogin] = createPassw # add login and password
        print("\nAccount created!\n")     

                            #---------- Screen for old users -------------#

def oldUser():
    global login

    login = input("Enter login name: ")
    passw = input("Enter password: ")

    # check if user exists and login matches password
    if login in users and users[login] == passw:
        print("\nLogin successful!\n")
        mainMenu()

    else:
        print("\nUser doesn't exist or wrong password!\n")



# Main -------------------------------------------------------------------------------------------------------------


while status != "q":
    status = displayMenu()




标签: pythonfunctionloops

解决方案


您的代码完全按照设计的方式工作。

主循环开始:

while status != "q":
    status = displayMenu()

请注意,如果用户在 中输入"q"displayMenu()而不是"Q". 这可以通过检查status.lower()来解决。

2然后你通过提供作为输入来指定不,你不是注册用户displayMenu()

这会将您带到newUser()创建新帐户的地方。

然后您将返回displayMenu(),这次您可以选择1以注册用户身份登录,将您带到oldUser()

在 中输入登录凭据后oldUser(),您将被带到mainMenu(),它将在其中打印欢迎消息mainMenu(),然后返回 ,然后返回oldUser()displayMenu()然后返回主循环。

除非您期望在 中发生其他事情,否则mainMenu()这里唯一的错误是您没有status在检查它是否是之前对情况进行规范化"q"


推荐阅读