【问题标题】:How to specify variables with random in Python如何在 Python 中随机指定变量
【发布时间】:2020-09-29 23:23:37
【问题描述】:

我正在创建一个密码生成器,它获取所需密码的长度、字母的数量以及数字的数量。密码需要包含大写字母以及数字和特殊字符。 我不知道如何指定密码中的字母和数字的数量。这是我目前所拥有的:

import random

charslet ="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
charsnum = "1234567890"
charssym = "!@#$%^&*"

def password():
    pwd = ""

    passlen = int(input("How long do you want the password to be?: "))
    passlet = int(input("How many letters do you want in your password?: "))
    passnum = int(input("How many numbers do you want in your password?: "))
    passsym = int(passlen - (passlet + passnum))
    chars = ""

    for let in range(passlet):
        chars += random.choice(charslet)
    for num in range(passnum):
        chars += random.choice(charsnum)
    for sym in range(passsym):
        chars += random.choice(charssym)



    for p in range(passlen):
        pwd += random.choice(chars)

    print(pwd)

password()

【问题讨论】:

  • 对于初学者,不要给你的函数和局部变量同名。看起来您确实指定了这两个数字。请澄清您的问题。
  • 谢谢,我刚改成pwd。当我运行程序并输入变量时,输出的密码不符合我的标准。例如,我为 passlen 设置了 10 个,passlet 设置了 3 个,passnum 设置了 3 个。所以理论上我应该收到一个包含 3 个字母、3 个数字和 4 个符号的密码,但我收到了 4##&$*c40# 作为我的输出。
  • 这里有一个 Python 习惯用法:当你在做一个 for 循环并且你不关心来自 range() 的值时,你可以使用一个下划线作为你的变量名称:_ 您的代码使用letnumsym 作为循环值的变量名,但您的代码不需要将它们用于任何事情。这没有错,但是使用 _ 成语几乎就像在评论中说“我们不关心这里的循环值,我们只想循环特定次数”。

标签: python python-3.x random


【解决方案1】:

我认为最后一部分让你感到困惑。您正在使用正确数量的特定字符构建 chars 变量,但最后您会再次在它们之间进行选择。

你可以改变:

for p in range(passlen):
    password += random.choice(chars)

# option 1 - works better if working with lists
list_chars = list(chars)
random.shuffle(chars)
password = "".join(list_chars)

# option 2 - simpler solution for strings
password = "".join(random.sample(char, len(char)))

您也可以在没有 for 循环的情况下使用 shuffle 来选择之前的字符,例如:

# for this to work your `charslet` must be a list
random.shuffle(charslet)
chars += "".join(charslet[:passlet])

【讨论】:

  • 我遵循了你的第一个建议,但又得到 TypeError: 'str' object does not support item assignment
  • 我已经修复了代码,shuffle 不适用于字符串,你必须使用列表,所以在这种情况下,我将当前字符串转换为列表,然后将其加入回字符串洗牌。它现在应该可以工作了。
  • 包含一个使用random.sample的新选项
  • 非常感谢,我按照您所说的将要洗牌的字符串更改为列表,效果很好。
【解决方案2】:

这是更正后的代码:

    import random

    charslet ="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    charsnum = "1234567890"
    charssym = "!@#$%^&*"

    def password():
        pwd = ""

        passlen = int(input("How long do you want the password to be?: "))
        passlet = int(input("How many letters do you want in your password?: "))
        passnum = int(input("How many numbers do you want in your password?: "))
        passsym = int(passlen - (passlet + passnum))
        chars = ""

        for let in range(passlet):
            chars += random.choice(charslet)
        for num in range(passnum):
            chars += random.choice(charsnum)
        for sym in range(passsym):
            chars += random.choice(charssym)



        list_chars = list(chars)
        random.shuffle(list_chars)
        pwd = "".join(list_chars)

        print(pwd)

    password()

我换了:

    for p in range(passlen):
        password += random.choice(chars)

    list_chars = list(chars)
    random.shuffle(list_chars)
    pwd = "".join(list_chars)

将更改后的chars 变量放入一个列表中,我可以对其进行洗牌、随机化并允许我将其分配给pwd

【讨论】:

    猜你喜欢
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多