Python 为什么random.choice不能生成一个随机列表?

Python 为什么random.choice不能生成一个随机列表?,python,Python,我的目标是一个简单的密码生成器。我找不到对random.choice的任何引用。无法随机选择列表元素,因此我的代码结构一定有问题 以下是所需输出的示例,假设我选择“2”作为密码复杂性: ['X'、'$'、3、8、'd'、'+'、''''''UU4、'r'、'%'、'E、2] import string import random def password(): password = [] strength = input('How strong, from 1 to 3?')

我的目标是一个简单的密码生成器。我找不到对random.choice的任何引用。无法随机选择列表元素,因此我的代码结构一定有问题

以下是所需输出的示例,假设我选择“2”作为密码复杂性:

['X'、'$'、3、8、'd'、'+'、''''''UU4、'r'、'%'、'E、2]

import string 
import random
def password():
    password = []
    strength = input('How strong, from 1 to 3?')
    symbol_library= ["&", '+', "#","*", "£", "$", "+", "-", "."]
    gen_integer= password.append(random.randint(0,9))
    gen_letter= password.append(random.choice(string.ascii_letters))
    gen_letter2= password.append(random.choice(string.ascii_letters.lower()))
    gen_symbols = password.append(random.choice(symbol_library))
    func_list= [gen_integer, gen_letter, gen_symbols]
    func_list2 =  [gen_integer, gen_letter, gen_letter2, gen_symbols]
    if strength == '1':
        while len(password)<8:
            password.append(random.choice(func_list))

        print(password)

    elif strength == '2':
        while len(password)<12:
             password.append(random.choice(func_list2))


        print(password)
在python中,当您附加到列表时,返回类型为None,因为.append通常不返回任何内容:

gen_integer= password.append(random.randint(0,9))
gen_letter= password.append(random.choice(string.ascii_letters))
gen_letter2= password.append(random.choice(string.ascii_letters.lower()))
gen_symbols = password.append(random.choice(symbol_library))
即使如此,这一准则:

func_list= [gen_integer, gen_letter, gen_symbols]
...
password.append(random.choice(func_list))
不调用任何gen_smth函数,它只是将函数指针添加到您的密码中,而不是字母、标点符号或数字。

看起来您希望这样:

gen_integer = password.append(random.randint(0,9))
创建一个实际函数,该函数在使用时将在右侧执行操作。这不是它的工作方式。相反,它调用password.append来追加一个特定的值,然后将返回值None存储到变量gen_integer中

这就是为什么您总是得到四个值,后跟四个或八个无值,因为random.choicefunc_list是从一组均为无的值中选择一个随机选项

Python具有间接执行此函数的功能,它们被称为lambdas,但直接定义函数并随机调用可能更好我已经临时硬编码了强度,因此不必连续输入,并将密码转换为字符串:

import string
import random

def gen_integer():
    return f'{random.randint(0, 9)}'

def gen_symbol():
    return random.choice('&+#*£$+-.')

def gen_letter():
    return random.choice(string.ascii_letters)

def gen_letter2():
    return random.choice(string.ascii_letters.lower())

def make_password():
    func_list  = [gen_integer, gen_letter, gen_symbol]
    func_list2 = [gen_integer, gen_letter, gen_symbol, gen_letter2]

    password = ''
    strength = '2' # input('How strong (1 = weak, anything else is strong)?')
    if strength == '1':
        while len(password) < 8:
            password + random.choice(func_list)()
    else:
        while len(password) < 12:
             password += random.choice(func_list2)()

    return password

print(make_password())
如果您确实想使用lambdas,可以使用以下工具:

import string
import random

def make_password():
    gen_integer = lambda: f'{random.randint(0, 9)}'
    gen_symbol  = lambda: random.choice('&+#*£$+-.')
    gen_letter  = lambda: random.choice(string.ascii_letters)
    gen_letter2 = lambda: random.choice(string.ascii_letters.lower())

    func_list  = [gen_integer, gen_letter, gen_symbol]
    func_list2 = [gen_integer, gen_letter, gen_symbol, gen_letter2]

    password = ''
    strength = '2' # input('How strong (1 = weak, anything else is strong)?')
    if strength == '1':
        while len(password) < 8:
            password + random.choice(func_list)()
    else:
        while len(password) < 12:
             password += random.choice(func_list2)()

    return password

print(make_password())

你应该编辑问题,而不是自己评论。在问题中以正确格式的文本显示预期和实际输出的示例。append方法修改一个列表,但不返回任何内容。请原谅,我对编码一无所知,但为什么它会返回“type”?我只想让它从三个随机选择的列表库中复制随机选择的元素作为字符串,并填写列表密码。啊,不用担心。我只是打印出字体来说明这一点。您的代码没有显式打印出类型。基本上,您的变量gen_integer等都是无的,而不是我看到的预期附加列表。您能否解释一下,为什么它会按照从“不需要”调用它的函数列表的相同顺序生成所需的随机字符?我假设它正试图以相同的顺序继续从func_列表中报告,但已超过该列表中的元素数,因为它一直持续到12个字符标记,从而使剩余的点填充为零?感谢您提供了非常有用的答案。那么gen_integer=password.appendrandom.randint0,9(我随后存储在func_列表中随机调用)在哪里失去了作为函数和生成随机整数的能力呢?@Turner,您必须将其创建为lambda或实函数,然后确保使用random.choicefunc_列表调用它-请注意最后的提示。查看我的更新。
import string
import random

def gen_integer():
    return f'{random.randint(0, 9)}'

def gen_symbol():
    return random.choice('&+#*£$+-.')

def gen_letter():
    return random.choice(string.ascii_letters)

def gen_letter2():
    return random.choice(string.ascii_letters.lower())

def make_password():
    func_list  = [gen_integer, gen_letter, gen_symbol]
    func_list2 = [gen_integer, gen_letter, gen_symbol, gen_letter2]

    password = ''
    strength = '2' # input('How strong (1 = weak, anything else is strong)?')
    if strength == '1':
        while len(password) < 8:
            password + random.choice(func_list)()
    else:
        while len(password) < 12:
             password += random.choice(func_list2)()

    return password

print(make_password())
us6£3r8£a8R0
73s0l&73l9#F
0+0lg£h76&zn
6.4.3.gx+gbb
4h7Ep3-2mjp#
yCwql**8&C4z
09ll02jq£d4+
+tg75$#Dgj50
aEX8D1m+L5+j
727j#5eP59ea
import string
import random

def make_password():
    gen_integer = lambda: f'{random.randint(0, 9)}'
    gen_symbol  = lambda: random.choice('&+#*£$+-.')
    gen_letter  = lambda: random.choice(string.ascii_letters)
    gen_letter2 = lambda: random.choice(string.ascii_letters.lower())

    func_list  = [gen_integer, gen_letter, gen_symbol]
    func_list2 = [gen_integer, gen_letter, gen_symbol, gen_letter2]

    password = ''
    strength = '2' # input('How strong (1 = weak, anything else is strong)?')
    if strength == '1':
        while len(password) < 8:
            password + random.choice(func_list)()
    else:
        while len(password) < 12:
             password += random.choice(func_list2)()

    return password

print(make_password())