一、为什么要做一个密码生成器?
你有没有这样的习惯: 网站注册的时候,密码总是“qwe123”“abc123”“123456”? 结果一天到晚在找回密码。
更要命的是,安全网站要求:
-
至少8位;
-
必须有大小写;
-
必须带数字;
-
最好还要有特殊字符。

手动想一个有安全又好记的密码,简直是折磨。
今天我们就用Python写一个属于我们自己的密码生成器。
二、最简单的随机密码
还是老规矩,我们先写一个最小可用版本。
2.1. 敲代码
import random
# 定义密码字符池
chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
# 生成随机密码
password = ""
for i in range(10): # 生成10位密码
password += random.choice(chars)
print("你生成的密码是:", password)
2.2. 运行结果

每次运行都会得到不同结果。
2.3. 代码讲解
关键字:import、for...in
import
import中文直译就是引入、导入。我们的代码中使用到了一个random模块,需要使用import显示的导入。
导入之后才能使用这个模块的功能,比如random.choice(chars)。
如果你把import random去掉,IDE就会提示里代码中的random解析不到。

那为什么像print这样的内置函数不需要import呢?
因为像len()、print()、range()这样的内置函数是编译在解释器内部的,不需要导入就可以使用。他们的源码都在Python/bltinmodule.c里。
而random模块是在Python标准库中,直接用Python编写实现的。使用的时候就需要import导进来。

for...in
前文中我们已经知道了while是处理循环的一种关键字。当前代码中的for关键字也是处理循环的另一种方式。
while是我们不知道要循环多少次,直到某个条件改变的场景使用的。
for是我们知道要循环多少次/遍历什么的场景使用的。
# 指定次数
for i in range(5):
print(i)
range(5)会生成序列:0, 1, 2, 3, 4。
for i in依次取出每个数字赋值给i。
循环体内的代码会执行5次。
for 变量 in 序列:
# 循环体
choice函数
这是random模块的一个函数。
这个地址可以查看Python所有模块的函数说明、示例、实现原理:https://docs.python.org/zh-cn/3.14/library/index.html

choice就是从提供的序列里随机的去一个元素。
import random
print(random.choice('懒惰蜗牛'))
#每次运行随机打印四个字中的一个
+=
这是个增强赋值语句,具体说明在:https://docs.python.org/zh-cn/3.14/reference/simple_stmts.html#augmented-assignment-statements

三、升级版:用户可选密码长度
上面写死10位不太灵活。 我们可以自己输入长度:
3.1. 敲代码
import random
chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
length = int(input("请输入密码长度(推荐8~16):"))
password = ""
for i in range(length):
password += random.choice(chars)
print("生成的密码是:", password)
3.2. 运行结果

3.3. 代码讲解

对比着看,其实就是通过input接收了一个字符,通过int()转换成数字,赋值给length变量。
把之前的10这个固定写死的数字替换成了length。
四、更安全的密码
现在的密码只有字母+数字, 我们来加上符号,让他更专业一点。
4.1. 敲代码
import random
import string # 更方便的字符集合
# 组合字符池:小写 + 大写 + 数字 + 符号
chars = string.ascii_letters + string.digits + string.punctuation
length = int(input("请输入密码长度(推荐 12~20):"))
password = "".join(random.choice(chars) for _ in range(length))
print(f"你的安全密码是:{password}")
4.2. 运行结果

4.3. 代码讲解
代码里之前我们定义的一长串字母被替换成了这一句chars = string.ascii_letters + string.digits + string.punctuation。
这是因为我们在最开始import了string这个模块。这个模块给我们提供了非常多的常见字符串的操作。

当前版本生产密码的核心循环和上一个版本是等价的,生成的结果都是一样的。

只是当前版本使用了join这个内置函数对序列进行拼接 + 产生序列使用了生成器表达式(random.choice(chars) for _ in range(length))。
for后面的_表示不关心循环变量。把上一个版本的i改成_也是可以的,因为我们也没有用到i。
生成器表达式的具体说明:https://docs.python.org/zh-cn/3.14/reference/expressions.html#generator-expressions
如果不适应生成器表达式这种写法,就用版本2的写法。
目前我们还不到关心运行效率和内存使用这些的阶段。当前目标,能正确运行就行。
五、新功能
5.1. 功能说明
可以增加两个可选功能:
-
选择是否要包含符号。
-
生成的密码自动复制到剪贴板。
5.2. 敲代码
import random
import string
import pyperclip
letters = string.ascii_letters
digits = string.digits
symbols = string.punctuation
use_symbols = input("是否包含特殊符号?(y/n):").lower() == "y"
length = int(input("请输入密码长度(推荐 12~20):"))
chars = letters + digits + (symbols if use_symbols else "")
password = "".join(random.choice(chars) for _ in range(length))
print(f"\n✅ 已生成密码:{password}")
pyperclip.copy(password)
print("(已复制到剪贴板,可直接粘贴使用)")
5.3. 运行结果
直接赋值代码运行的时候,你会发现代码里有一处在报错。

有个叫"pyperclip"模块找不到,这个模块既不是内置模块(直接使用),也不是标准库模块(import后使用),而是第三方模块。
需要手动安装之后才能使用。
如果使用的是Pycharm这个IDE,会有提示“Install package pyperclip”,表示安装这个模块。
当然你也可以通过左侧的包管理标签进行搜索后安装:

还可以在终端窗口中直接使用命令进行安装:

安装好之后,报错消失了,直接运行代码:

红框中的内容是我直接运行完,Crtl + V粘贴出来的。
pyperclip.copy已经把我们生成的密码复制到了剪切板(类似Crtl + C),直接粘贴即可。
5.4. 代码讲解
这个版本主要就是对输入的“是否包含特殊符号”进行了判断,根据判断处理原始的密码序列(要不要加上符号)。
最后使用一个第三方库的函数,实现了复制。
第三模块的基础介绍、版本历史、安装命令、简单示例内容可以在这个地址去找:https://pypi.org/

六、小结
| 学到的东西 | 用途 |
|---|---|
random 模块 | 生成随机数或随机字符 |
string 模块 | 获取标准字符集 |
"".join() | 拼接字符串 |
| 用户输入 | 自定义功能参数 |
第三方库 pyperclip | 实现复制功能 |

254

被折叠的 条评论
为什么被折叠?



