【问题标题】:Having trouble with a while loop, it breaks, even though it shouldn'twhile 循环有问题,它会中断,即使它不应该
【发布时间】:2014-12-30 12:21:50
【问题描述】:

我在使用 while 循环时遇到了问题!

我想做的是制作一个简单的帐户创建系统。我想让用户输入一个用户名,如果用户名已经存在,它应该让我再试一次。

但即使用户名存在,它也会继续该功能,并要求我输入密码,并将用户名和密码写入文件。

代码如下:

def create_user():
    passw = open('passwords.txt', 'r+')
    x = 1
    passwr = passw.readlines()
    print "What's your username?"

    while x == 1:
        user = raw_input(">> ")
        for l in passwr:
            a = l.split()  
            if user.lower() not in a[0]:
                x = 0

            else:
                print 'Sorry, that\'s already in use!'

    print "What's your pw?"
    pw = raw_input(">> ")
    passw.seek(0, 2)
    passw.write(user + ' ' + pw + '\n')

文件格式如下:

Username1 Password
Username2 Password

一段时间以来,我一直试图找出问题所在。但似乎无法找到解决方案。

【问题讨论】:

    标签: python while-loop


    【解决方案1】:

    你的验证部分可以更简单试试这样的

    while x == 1:
        user = raw_input(">> ")
        usernames = [i.split()[0] for i in passwr]
        if user.lower() not in usernames:
                x = 0
    
        else:
                print 'Sorry, that\'s already in use!'
    

    然后输出将是

    What's your username?
    >> Username1
    Sorry, that's already in use!
    >> Username2    
    Sorry, that's already in use!
    >> Username3
    What's your pw?
    >> Password
    

    和文件内容

    username1 Password
    username2 Password
    Username3 Password
    

    【讨论】:

      【解决方案2】:

      问题在于,如果有 any 用户具有不同的用户名,则您设置了 x = 0。假设有两个现有用户,foobar。用户输入bar。发生这种情况:

      1. if user.lower() not in a[0]: 产生True,因为user"bar"a[0]"foo"
      2. x 设置为 0
      3. 循环继续到文件中的下一行,a[0] 现在将是 "bar"
      4. if user.lower() not in a[0]: 生成 False,并打印 Sorry, that's already in use!
      5. 循环退出,因为x 已设置为0

      【讨论】:

        【解决方案3】:

        您需要检查== 而不是in,因此您不需要额外分配a = l.split(),将您的if 语句更改为以下:

        if user.lower() == l.split()[0]
        

        因为这项工作用于检查一个 id,如果您需要检查所有 id,您可以在一个列表中获取所有这些并检查:

        while x == 1:
            user = raw_input(">> ")
            user-list=[line.split()[0] for line in passwr]  
            if user.lower() not in user-list:
                    x = 0
        

        【讨论】:

        • 这似乎没有什么不同。
        • @ZanderMøysal 是的。如果您需要检查所有需要列表的用户名,请参阅编辑
        • 是的!我刚刚意识到我检查了用户名是否不在第一个用户名中,如果不是,'x = 0'。谢谢!
        猜你喜欢
        • 2014-12-14
        • 1970-01-01
        • 2016-10-02
        • 1970-01-01
        • 1970-01-01
        • 2019-06-28
        • 2022-01-20
        • 1970-01-01
        • 2021-01-30
        相关资源
        最近更新 更多