这是我的代码:我希望它创建一个密码,从名称中取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)
答案 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
格式输入。
您的所有子列表(pw
,pw1
& pw2
)都会提供一个新列表。然后,您将这些新创建的列表附加到父列表password
。你错过了附加pw2。因此,在末尾附加时,父列表password
会列出3个列表pw
,pw1
& pw2
。
password = [pw, pw1, pw2] # list of lists
因此,您必须逐个遍历每个列表以形成密码。它增加了不必要的开销最好的方法是extend
而不是append
,而不是这样做。这会将子列表(pw
,pw1
和pw2
)的元素附加到父列表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)