输入后代码停止工作;为什么?我不确定。密码生成器

时间:2015-08-06 23:42:08

标签: python

这是我的代码:我希望它创建一个密码,从名称中取3个字符,从pn(宠物名称)中取3个字符,从生日月起3个字符,然后从日期(日)中添加1或2个数字出生时(1-31)。

目前,当我运行它时,它会在用户输入结束时停止,并且永远不会生成密码。

def password():
    import random

    password = []
    name = input('Enter your name')
    pn = input('Enter your pets name')
    bday = input('Enter your birthday month')
    date = input('Enter the date you were born')
    while name != 'QUIT':
        pw = random.sample(name,3)
        password.append(pw)
        pw1 = random.sample(pn,3)
        password.append(pw1)
        pw2 = random.sample(bday,3)
    return('Your security code is', password + date)

4 个答案:

答案 0 :(得分:1)

您的代码正在进入无限循环。如果name不等于'QUIT',那么while循环条件name != 'QUIT'将永远保持为真。

带有一些清理的示例代码:

import random

def password():
    name = input('Enter your name: ')
    if name == 'QUIT':
        # As soon as you type QUIT, you should quit
        # You shouldn't need to enter all the other information.
        return
    pn = input('Enter your pets name: ')
    bday = input('Enter your birthday month: ')
    date = input('Enter the date you were born: ')

    password_parts = []
    # You need the join because random.sample returns a list
    password_parts.append(''.join(random.sample(name,3)))
    password_parts.append(''.join(random.sample(pn,3)))
    password_parts.append(''.join(random.sample(bday,3)))
    password_parts.append(date)

    return "Your password is: " + ''.join(password_parts)

示例程序运行:

Enter your name: john
Enter your pets name: tommy
Enter your birthday month: april
Enter the date you were born: 25
Your password is: nojmmtpri25

答案 1 :(得分:0)

您的代码没有停止,它正在进入无限循环。这是因为while循环条件几乎总是为真,唯一的例外是用户输入“QUIT”作为其名称。

您不需要循环来生成密码,而是使用简单的if语句来检查“QUIT”的用户条目应该执行:

if name != 'QUIT':

此外,您可能希望从函数返回一个字符串,因此您需要将password列表转换为字符串:

return 'Your security code is {}{}'.format(''.join(password), date)

并且,不使用append()作为随机字符(将子列表添加到password),而是使用extend()(将每个项目添加到password)。

所以把所有这些放在一起:

import random

def password():
    password = []
    name = input('Enter your name')
    if name != 'QUIT':
        pn = input('Enter your pets name')
        bday = input('Enter your birthday month')
        date = input('Enter the date you were born')
        for s in name, pn, bday:
            password.extend(random.sample(s, 3))
        return '{}{}'.format(''.join(password), date)

最后,您可能想重新考虑函数返回的内容。通过使用'Your security code is'前缀构造和返回密码,可以限制函数的重用。如果函数只生成并返回密码,则可以在各种情况下使用。如果用户退出,该函数将返回None。这允许调用代码获取密码(例如,它可以将其存储在数据库中),并检查表示用户退出的None

答案 2 :(得分:0)

我建议你使用下面修改过的代码。即使您没有删除while name != 'QUIT',它仍然可以正常工作: -

def password():
    import random

    password = []
    name = raw_input('Enter your name')
    pn = raw_input('Enter your pets name')
    bday = raw_input('Enter your birthday month')
    date = input('Enter the date you were born')
    while name != 'QUIT':
        pw = random.sample(name,3)
        password.extend(pw)
        pw1 = random.sample(pn,3)
        password.extend(pw1)
        pw2 = random.sample(bday,3)
        password.extend(pw2)
        password = ''.join(password)
        return('Your security code is', password + str(date))

详细修改: -

使用raw_input代替input可以在输入字符串作为名称,宠物名称和月份之前删除键入qoutes(')的开销。因为,raw_input()采用string格式输入。

您的所有子列表(pwpw1& pw2)都会提供一个新列表。然后,您将这些新创建的列表附加到父列表password。你错过了附加pw2。因此,在末尾附加时,父列表password会列出3个列表pwpw1& pw2

password = [pw, pw1, pw2]    # list of lists

因此,您必须逐个遍历每个列表以形成密码。它增加了不必要的开销最好的方法是extend而不是append,而不是这样做。这会将子列表(pwpw1pw2)的元素附加到父列表password。最后,所有生成的字符都在父列表password中。

现在,行密码='' .join(密码),从列表中的所有字符中创建一个字符串。无需遍历列表。但是,您的代码并没有在任何地方连接三个列表。所以它只是返回嵌套在一个列表中的三个列表(实际上是两个列表,因为你错过了附加pw2)。

然后return语句将失败: -

return('Your security code is', password + date)

因为,date是一个整数,代码正在尝试添加一个string的整数,这将抛出TypeError。因此,将其修改为str(date)

如果您还将此日期附加到父列表password,则可以省略此步骤。然后,join语句会将其添加到已形成的password中。但为此,您必须以string格式输入日期: -

date = raw_input('Enter the date you were born')

或将其附加为字符串,如: -

password.append(str(date))

然后您的代码如下: - def密码():         随机导入

    password = []
    name = raw_input('Enter your name')
    pn = raw_input('Enter your pets name')
    bday = raw_input('Enter your birthday month')
    date = raw_input('Enter the date you were born')     # Inputs the date in string format
    while name != 'QUIT':
        pw = random.sample(name,3)
        password.extend(pw)
        pw1 = random.sample(pn,3)
        password.extend(pw1)
        pw2 = random.sample(bday,3)
        password.extend(pw2)
        password.append(date)
        password = ''.join(password)
        return('Your security code is', password)

答案 3 :(得分:0)

I guess that this is what actually you want to do:

def password():
    import random

    while True:
        password = []
        name = input('Enter your name')
        if name == 'QUIT':
            return
        pn = input('Enter your pets name')
        bday = input('Enter your birthday month')
        date = input('Enter the date you were born')
        pw = random.sample(name,3)
        password.append(pw)
        pw1 = random.sample(pn,3)
        password.append(pw1)
        pw2 = random.sample(bday,3)
    print 'Your security code is', password + date

It keeps asking until you type QUIT (and does not return anything)