1

我正在尝试从文本文件做一个登录系统。
当我输入不在文本中的错误输入时,它会执行我想要它做的事情,即输出“错误的用户名和密码”和“重试”并询问用户名并再次通过。
但是当我输入正确的细节时,循环永远不会中断。它一直在询问用户并通过。
这是我的代码:

def check():
        users = open('student.txt').read().split('\n')
        for i in range(len(users)): users[i] = users[i].split(',')


        while True:
            username = str(input('Username: '))
            password = str(input('Password: '))

            for user in users:
                uname = user[3]
                pword = user[4]

                if uname == username and pword == password:
                    print('Hello ' + user[0] + '.')
                    print('You are logged in as: ' + user[3] +  '.')
                    break
                
                    

            else:
                print('Wrong username/password.')
                print('Try again!\n\n')
    check()
4

4 回答 4

1

break总是离开直接循环构造,即“最里面” 。
对于您的代码是for循环,而不是while包含它的循环。

于 2021-01-16T08:59:23.690 回答
1

使用break语句时,它只会退出当前所在的内循环,这意味着它仍然会循环外循环。解决此问题的常用方法是将嵌套循环重构为函数并使用return语句退出代码。

另一种方法是添加一些continue语句以避免达到第二个break并且仅在退出内部循环时达到它。像这样的东西:

def check():
      users = open('student.txt').read().split('\n')
       for i in range(len(users)):
            users[i] = users[i].split(',')

        while True:
            username = str(input('Username: '))
            password = str(input('Password: '))

            for user in users:
                uname = user[3]
                pword = user[4]

                if uname == username and pword == password:
                    print('Hello ' + user[0] + '.')
                    print('You are logged in as: ' + user[3] + '.')
                    break
            else:
                print('Wrong username/password.')
                print('Try again!\n\n')
                
                # Continue if the inner loop wasn't broken.
                continue

            # Inner loop was broken, break the outer.
            break
于 2021-01-16T08:59:41.073 回答
0

break语句将跳出whileANDfor循环。尽管看起来令人沮丧,但这些 break 语句只会跳出最近的循环。如果你看一下你的代码,你会发现你的 break 语句实际上是for loop在你的while loop. 这意味着您正在突破,for loopwhile loop将继续正常进行。

处理这个问题的一个很好的选择是将你的 while 循环变成一个函数,并用一个语句替换你breakreturn语句。这样你的while循环也将停止!

于 2021-01-16T08:58:29.800 回答
0

正如我在评论中所说,您的break陈述在for循环内的while循环内。break语句不会破坏任何外部循环。

这是一个可能的解决方案

def check():
        users = open('student.txt').read().split('\n')
        for i in range(len(users)): users[i] = users[i].split(',')

        username = str(input('Username: '))
        password = str(input('Password: '))

        for user in users:
            uname = user[3]
            pword = user[4]

             while True:

                if uname == username and pword == password:
                    print('Hello ' + user[0] + '.')
                    print('You are logged in as: ' + user[3] +  '.')
                    break
            
                else:
                    print('Wrong username/password.')
                    print('Try again!\n\n')

check()
于 2021-01-16T08:59:46.100 回答