Python 我再也回不来了

Python 我再也回不来了,python,for-loop,Python,For Loop,因此,我的任务是使用pickle文件的引用创建一个登录函数,到目前为止,我唯一的问题(我注意到)是我永远无法脱离循环 for counter in range(len(Users)): UserN = input("Username: ") if UserN in Users[counter]: PassW = input("Password: ") if PassW

因此,我的任务是使用pickle文件的引用创建一个登录函数,到目前为止,我唯一的问题(我注意到)是我永远无法脱离循环

    for counter in range(len(Users)):
        UserN = input("Username: ")
        if UserN in Users[counter]:
            PassW = input("Password: ")
            if PassW in Users[counter]:
                print("User Authenticated")
                break
            else:
                attempt = 1
                while attempt != 4:
                    print("Password Incorrect | Attempt", attempt)
                    PassW = input("Password: ")
                    if PassW in Users[1]:
                        print("User Authenticated")
                        MainMenu()

                    else:
                        attempt = attempt + 1

                        if attempt == 4:
                            print("\nToo many attempts, you are locked out")
                            exit()
        else:
            print("\nUser not found!\n")

如果用户已通过身份验证,则尝试次数将停止增加,但while循环的条件是stop
trunt==4
,因此它将被卡住,直到用户输入了4次错误的密码

要修复此问题,请在while循环之前添加一个变量
authenticated
,并将其初始化为
False
,然后在用户成功通过身份验证后将其设置为
True

attempt = 1
authenticated = False
while attempt != 4 and !authenticated:
    ...
    if PassW in Users[1]:
        ...
        authenticated = True
或者如果你不想要一个新的变量,就直接打断它

if PassW in Users[1]:
    ...
    break

要中断循环

如果找到密码,则调用另一个函数,但从未退出循环。您应该添加中断语句。

您可以在下添加中断语句

    MainMenu()
    break;

代码中的逻辑似乎很不可靠

此代码假定用户名是第一个出现在
Users
中的用户名;如果第二个用户登录,他们需要输入两次自己的名字,第三个用户需要输入三次,依此类推。如果你在“回合”中输入错误,你将无法登录

我建议采用以下结构:

  • 将变量“Users”转换为字典,将用户名映射为密码
  • 询问用户名
  • 如果用户名未出现,则停止或循环(您可能希望提示询问他们是否要重试,或者只让他们按
    ctrl-D
    停止(并捕捉随后出现的
    EOFError
    键盘中断
    (如果他们按
    ctrl-C
    ),则会发生这种情况)
对于这个问题来说,其他一些问题不是很关键,而是很好的指导方针:

  • 使用正确的样式约定。变量名称不应以大写字符开头。函数也应以大写字符开头。它应该是
    用户
    密码
    主菜单()
  • 您确实不应该将密码存储在pickle文件中;这是一种模糊处理,而不是安全性
  • 当你说用户被锁定时,实际上什么也没有发生。他们并没有真正被锁定;他们可以再试一次。这意味着你可以创建一个简单的密码猜测
  • 让他们输入密码,猜测次数最多
  • 一个好的规则是测试
    trunt>3
    而不是
    trunt==4
    。这在这里并没有什么区别,但在更大的函数中,通常最好将测试稍微“宽一点”

你能分享一个例子说明
用户的结构是什么吗?我假设它是一个列表,但是元素是字符串还是其他数据类型?你能详细说明程序卡在哪个循环中吗?你有两个循环,L1上的
for
和L10上的
while
,它们都有潜在的条件可以永远运行请提供预期结果。显示中间结果与预期结果的不同之处。我们应该能够复制和粘贴连续的代码块,执行该文件,并再现您的问题以及跟踪问题点的输出。这让我们可以根据您的测试数据和所需的数据测试我们的建议输出。