Day6:Python实现随机密码生成器

一、为什么要做一个密码生成器?

你有没有这样的习惯: 网站注册的时候,密码总是“qwe123”“abc123”“123456”? 结果一天到晚在找回密码。

更要命的是,安全网站要求:

  • 至少8位;

  • 必须有大小写;

  • 必须带数字;

  • 最好还要有特殊字符。

image-20251017152207154

手动想一个有安全又好记的密码,简直是折磨。

今天我们就用Python写一个属于我们自己的密码生成器。

二、最简单的随机密码

还是老规矩,我们先写一个最小可用版本。

2.1. 敲代码

import random
 ​
 # 定义密码字符池
 chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
 ​
 # 生成随机密码
 password = ""
 for i in range(10):  # 生成10位密码
     password += random.choice(chars)
 ​
 print("你生成的密码是:", password)

2.2. 运行结果

image-20251017153045441

每次运行都会得到不同结果。

2.3. 代码讲解

关键字:import、for...in

import

import中文直译就是引入、导入。我们的代码中使用到了一个random模块,需要使用import显示的导入。

导入之后才能使用这个模块的功能,比如random.choice(chars)。

如果你把import random去掉,IDE就会提示里代码中的random解析不到。

image-20251017153710458

那为什么像print这样的内置函数不需要import呢?

因为像len()、print()、range()这样的内置函数是编译在解释器内部的,不需要导入就可以使用。他们的源码都在Python/bltinmodule.c里。

而random模块是在Python标准库中,直接用Python编写实现的。使用的时候就需要import导进来。

image-20251017154252256

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

image-20251017155654339

choice就是从提供的序列里随机的去一个元素。

 import random
 print(random.choice('懒惰蜗牛'))
 #每次运行随机打印四个字中的一个

+=

这是个增强赋值语句,具体说明在:https://docs.python.org/zh-cn/3.14/reference/simple_stmts.html#augmented-assignment-statements

image-20251017160212681

三、升级版:用户可选密码长度

上面写死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. 运行结果

image-20251017160415723

3.3. 代码讲解

image-20251017160504656

对比着看,其实就是通过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. 运行结果

image-20251017160819846

4.3. 代码讲解

代码里之前我们定义的一长串字母被替换成了这一句chars = string.ascii_letters + string.digits + string.punctuation。

这是因为我们在最开始import了string这个模块。这个模块给我们提供了非常多的常见字符串的操作。

image-20251017161152487

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

image-20251017162705152

只是当前版本使用了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. 功能说明

可以增加两个可选功能:

  1. 选择是否要包含符号。

  2. 生成的密码自动复制到剪贴板。

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. 运行结果

直接赋值代码运行的时候,你会发现代码里有一处在报错。

image-20251017165427362

有个叫"pyperclip"模块找不到,这个模块既不是内置模块(直接使用),也不是标准库模块(import后使用),而是第三方模块。

需要手动安装之后才能使用。

如果使用的是Pycharm这个IDE,会有提示“Install package pyperclip”,表示安装这个模块。

当然你也可以通过左侧的包管理标签进行搜索后安装:

image-20251017165924282

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

image-20251017170030467

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

image-20251017170211597

红框中的内容是我直接运行完,Crtl + V粘贴出来的。

pyperclip.copy已经把我们生成的密码复制到了剪切板(类似Crtl + C),直接粘贴即可。

5.4. 代码讲解

这个版本主要就是对输入的“是否包含特殊符号”进行了判断,根据判断处理原始的密码序列(要不要加上符号)。

最后使用一个第三方库的函数,实现了复制。

第三模块的基础介绍、版本历史、安装命令、简单示例内容可以在这个地址去找:https://pypi.org/

image-20251017170952490

六、小结

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

懒惰蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值