Python 初级程序员:密码生成器

Python 初级程序员:密码生成器,python,passwords,ascii,Python,Passwords,Ascii,正如标题所说,我对编程是完全陌生的。不幸的是,我陷入了可怕的困境。我必须使用ASCII表制作一个随机密码生成器。我不允许导入字符串,也不允许使用字母字符串并从中选择字符,我只允许使用CHR或ORD函数、列表和课堂上教过的其他非常基本的函数。我被鼓励定义自己的功能 我让代码简单地工作,但它执行每个选项3次,因此超过了字符数7-14。因此,我尝试了一个变量,它有三个选择,根据它得到的结果执行大写、小写或数字。这是我目前的代码: for loop in range(10): import r

正如标题所说,我对编程是完全陌生的。不幸的是,我陷入了可怕的困境。我必须使用ASCII表制作一个随机密码生成器。我不允许导入字符串,也不允许使用字母字符串并从中选择字符,我只允许使用CHR或ORD函数、列表和课堂上教过的其他非常基本的函数。我被鼓励定义自己的功能

我让代码简单地工作,但它执行每个选项3次,因此超过了字符数7-14。因此,我尝试了一个变量,它有三个选择,根据它得到的结果执行大写、小写或数字。这是我目前的代码:

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,但不是同一个大小写。很抱歉删除您的答案,我在发布后不久了解到,我可能会因为在课堂上在线发布问题而遇到麻烦!然而,现在已经过去了足够的时间,在我的学位期间,工作没有任何意义,所以我重新接受了你的答案。感谢所有的时间:)