名称“randrange”未定义错误,密码生成器

Lau*_*jas 2 random passwords import generator

我正在尝试编写密码生成器,但它不起作用,而且我无法理解该错误。

import random
import string

lw = list(string.ascii_lowercase)
uw = list(string.ascii_uppercase)
ns = list(string.digits)
password = ""

def addLW():
    f = randrange(1, len(lw))
    password = password + lw[f]

def addUW():
    f = randrange(1, len(lw))
    password = password + uw[f]

def addN():
    f = randrange(1, len(lw))
    password = password + ns[f]

funcs = [addLW, addUW, addN]

maxx = input("Password generator.\nMax: ")

if maxx.isdigit():
    maxx = int(maxx)
    for i in range(maxx):
        func = random.choice(funcs)
        func()
    print(f"Password: {password}")
else:
    print("Error")
Run Code Online (Sandbox Code Playgroud)

完整错误:

Traceback (most recent call last):
  File "Password Generator.py", line 29, in <module>
    func()
  File "Password Generator.py", line 14, in addUW
    f = randrange(1, len(lw))
NameError: name 'randrange' is not defined
Run Code Online (Sandbox Code Playgroud)

我不明白,因为我已经导入了“随机”......

pax*_*blo 7

import random
Run Code Online (Sandbox Code Playgroud)

您已导入random. 这意味着您的全局命名空间现在包含到命名空间的绑定random。它不包含randrange()名称空间内的任何其他内容,因此您需要显式使用random.randrange()如果您希望它找到该方法,则

可以使用以下命令将randrange其自身带入全局命名空间:

from random import randrange
Run Code Online (Sandbox Code Playgroud)

但这存在一些问题:

  • 这只randrange(),而不是任何其他东西random
  • 如果您需要其他东西,它会很快用名称污染您的全局名称空间;和
  • 如果你想导入大量的东西,它会变得乏味(除非你 import *,但请参阅前面关于污染全局命名空间的要点)。