Python 初级程序员:密码生成器
正如标题所说,我对编程是完全陌生的。不幸的是,我陷入了可怕的困境。我必须使用ASCII表制作一个随机密码生成器。我不允许导入字符串,也不允许使用字母字符串并从中选择字符,我只允许使用CHR或ORD函数、列表和课堂上教过的其他非常基本的函数。我被鼓励定义自己的功能 我让代码简单地工作,但它执行每个选项3次,因此超过了字符数7-14。因此,我尝试了一个变量,它有三个选择,根据它得到的结果执行大写、小写或数字。这是我目前的代码:Python 初级程序员:密码生成器,python,passwords,ascii,Python,Passwords,Ascii,正如标题所说,我对编程是完全陌生的。不幸的是,我陷入了可怕的困境。我必须使用ASCII表制作一个随机密码生成器。我不允许导入字符串,也不允许使用字母字符串并从中选择字符,我只允许使用CHR或ORD函数、列表和课堂上教过的其他非常基本的函数。我被鼓励定义自己的功能 我让代码简单地工作,但它执行每个选项3次,因此超过了字符数7-14。因此,我尝试了一个变量,它有三个选择,根据它得到的结果执行大写、小写或数字。这是我目前的代码: for loop in range(10): import r
for loop in range(10):
import random
password = ""
randLength = random.randint(7, 14)
lower = random.randint(97, 122)
upper = random.randint(65, 90)
number = random.randint(0, 9)
for n in range(randLength):
randChoice = random.randint(1, 3)
if randChoice == 1:
choice = lower
elif randChoice == 2:
choice = upper
else:
choice = number
result = chr(lower) + chr(upper) + str(number)
password += result
print(password)
到目前为止,我的编码是打印一个小写、一个大写和一个数字(每次都以完全相同的顺序),但它不会重复这个过程以达到所需的随机长度7-14,也不希望每次都保持相同的“模式”,毕竟它是随机的
如何修改代码以防止两个相同的字符在输出中并排出现?请帮助一个新手!谢谢我能想到的最具Python风格的方式是:
>>> from random import sample, randint
>>> from itertools import chain
>>> from string import ascii_letters, digits
>>> print ''.join(sample(list(chain(ascii_letters, digits)), randint(7, 14)))
qniksOzH0w
这将对您和您的限制很好:
for loop in range(10):
import random
password = ""
randLength = random.randint(7, 14)
for n in range(randLength):
lower = random.randint(97, 122)
upper = random.randint(65, 90)
number = random.randint(0, 9)
randChoice = random.randint(1, 3)
while True:
if randChoice == 1:
choice = chr(lower)
elif randChoice == 2:
choice = chr(upper)
else:
choice = str(number)
if not choice in password:
password += choice
break
print(password)
输出:
3UA25yqL
GmdH1dT4M9
6rUUtMe7GkK
G5VSfH4XLP05Q
wbQF2gh29V4sk
yv74xlxL2S2SH
473TUlfh5
N3F5W8j
S5U1K0fcJl4cOE
62R4ZT1k
我能想到的最像蟒蛇的方式是:
>>> from random import sample, randint
>>> from itertools import chain
>>> from string import ascii_letters, digits
>>> print ''.join(sample(list(chain(ascii_letters, digits)), randint(7, 14)))
qniksOzH0w
这将对您和您的限制很好:
for loop in range(10):
import random
password = ""
randLength = random.randint(7, 14)
for n in range(randLength):
lower = random.randint(97, 122)
upper = random.randint(65, 90)
number = random.randint(0, 9)
randChoice = random.randint(1, 3)
while True:
if randChoice == 1:
choice = chr(lower)
elif randChoice == 2:
choice = chr(upper)
else:
choice = str(number)
if not choice in password:
password += choice
break
print(password)
输出:
3UA25yqL
GmdH1dT4M9
6rUUtMe7GkK
G5VSfH4XLP05Q
wbQF2gh29V4sk
yv74xlxL2S2SH
473TUlfh5
N3F5W8j
S5U1K0fcJl4cOE
62R4ZT1k
这里有几个问题,但您所描述的问题是因为结果只是将三个随机字符相加。您没有在任何地方使用“选择”的值:
result = chr(lower) + chr(upper) + str(number)
尝试将以下内容添加到循环中的结果,而不是指定给“选择”:
if randChoice == 1:
result = result + lower
等
一旦你这样做了,你会发现第二个问题…这里有几个问题,但你所描述的一个问题是因为结果只是三个随机字符加在一起。您没有在任何地方使用“选择”的值:
result = chr(lower) + chr(upper) + str(number)
尝试将以下内容添加到循环中的结果,而不是指定给“选择”:
if randChoice == 1:
result = result + lower
等
完成此操作后,您将发现第二个问题…此操作有效:
from random import randint
randLength = randint(7,14)
characters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
password = ''
for i in range(randLength):
password += characters[randint(0, len(characters) - 1)];
print password
这项工作:
from random import randint
randLength = randint(7,14)
characters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
password = ''
for i in range(randLength):
password += characters[randint(0, len(characters) - 1)];
print password
我刚刚试过,但它仍然做同样的事情:-/您的缩进对于
password+=result
是错误的。你的下,上,数字需要移动到内部for循环中。我刚刚试过,它仍然做同样的事情:-/你的缩进错误,因为密码+=结果
。而你的下部
,上部
,编号
需要移动到内部for循环中。你太棒了,我不敢相信我忽略了这么简单的错误,你帮了我大忙!有没有办法使它不在同一行中显示两个相同值的字符?例如22、CC、EE等?字符可以是不同的大小写,所以Ee或Dd,但不是同一个大小写。很抱歉删除您的答案,我在发布后不久了解到,我可能会因为在课堂上在线发布问题而遇到麻烦!然而,现在已经过去了足够的时间,在我的学位期间,工作没有任何意义,所以我重新接受了你的答案。非常感谢很久以前的你:)你太棒了,我不敢相信我忽略了这么简单的错误,你帮了我大忙!有没有办法使它不在同一行中显示两个相同值的字符?例如22、CC、EE等?字符可以是不同的大小写,所以Ee或Dd,但不是同一个大小写。很抱歉删除您的答案,我在发布后不久了解到,我可能会因为在课堂上在线发布问题而遇到麻烦!然而,现在已经过去了足够的时间,在我的学位期间,工作没有任何意义,所以我重新接受了你的答案。感谢所有的时间:)