查看全课大纲(第 30 / 51 节)
- 1.为什么人人都该学点编程?
- 2.计算机与程序设计:你的电脑到底在“想”什么?
- 3.Python 这门语言,到底有什么魔力?
- 4.Python 开发环境配置:如何拥有你的第一个“编程工具箱”?
- 5.如何安装一个更强大的代码编辑器?
- 6.汇率兑换1.0:你的第一个“钱生钱”小程序
- 7.你的第一行代码,藏着哪些秘密?
- 8.汇率兑换2.0(上):让程序看懂“CNY”和“USD”
- 9.汇率兑换程序,如何让它“聪明”地判断币种?
- 10.汇率兑换程序能一直运行,直到我喊停吗?
- 11.汇率兑换4.0:如何把“算钱”功能打包成积木?
- 12.汇率兑换5.0:给你的程序穿上“结构化”的西装
- 13.怎么用 Python 画一个会动的五角星?
- 14.如何让程序自动画出不同大小的五角星?
- 15.函数自己调用自己,会发生什么?
- 16.用递归画出神奇的分形树
- 17.Python 怎么计算你一天躺着不动能消耗多少热量?
- 18.如何让程序“活”起来,持续为你服务?
- 19.如何让 BMR 计算器更“聪明”?
- 20.当程序遇到“不按套路出牌”的用户怎么办?
- 21.怎么用 Python 模拟一个“滚雪球”式的存钱计划?
- 22.如何用列表记录每一周的存款?
- 23.如何让程序自己数数?—— 用 for 循环解放你的双手
- 24.52周存钱挑战4.0:你的存款计算器能有多灵活?
- 25.52周存钱挑战:怎么根据日期自动查存款?
- 26.Python 怎么判断一年中的第几天?
- 27.列表 vs 元组:哪个更适合存储月份天数?
- 28.用集合给月份分个队,换个思路算天数
- 29.把月份和天数“锁”在一起:用字典给数据配个对
- 30.Python 怎么判断密码强弱?
- 31.Python 怎么给密码设置“防沉迷”系统?
- 32.Python 怎么把密码保存到文件里?
- 33.Python 怎么读取文件里的密码?
- 34.Python 怎么把密码检查工具“打包”起来?
- 35.Python 怎么把文件操作也“打包”起来?
- 36.计算机怎么“扔骰子”?——用Python模拟随机事件
- 37.如何用 Python 模拟掷两个骰子?
- 38.怎么用 Python 把骰子轨迹画出来?
- 39.骰子点数分布长啥样?用直方图一眼看穿!
- 40.用科学计算库让骰子程序“起飞”
- 41.空气质量指数怎么算?手把手教你写一个AQI计算器
- 42.空气质量指数计算:从零开始,让程序看懂空气
- 43.如何读取空气质量数据文件并找出空气质量最好的五个监测点?
- 44.JSON 数据怎么变成 Excel 表格?—— 让数据换个“马甲”
- 45.Python 怎么让程序自己判断文件类型?
- 46.如何让程序自己上网查空气质量?
- 47.用美味的汤来解析网页:Beautiful Soup 入门
- 48.如何让爬虫自动抓取全国所有城市的空气质量?
- 49.爬到的数据怎么存下来?—— 把全国空气质量数据保存为CSV文件
- 50.用 pandas 玩转空气质量数据:找出全国空气最好和最差的城市
- 51.空气质量数据怎么“洗”干净,还能画成图?
Python 怎么判断密码强弱?
约 21 分钟
小象实战讲义 · Python 入门:8 个小项目边玩边学
你有没有遇到过这样的场景?注册一个新网站,输入密码时,它总会提示你:“密码太弱,请包含数字和字母,长度至少8位”。今天,我们就来亲手打造一个这样的“密码强度检测器”!学完这一节,你就能写一个程序,像网站后台一样,自动给你的密码打分,告诉你它到底安不安全。
💡 核心导读
- 项目目标:编写一个能根据三条简单规则判断密码强弱的小工具。
- 核心思路:用一个“强度分数”变量来记录密码满足了多少条规则。
- 新知识点:学习使用字符串的
isnumeric()和isalpha()方法来检查字符类型。 - 编程技巧:复习函数的定义与调用,并学习如何在函数中“提前返回”结果。
- 趣味点:你的程序现在能像真正的安全系统一样思考了!
密码强度是什么?
在我们动手写代码之前,先来聊聊“密码强度”到底是什么。简单来说,密码强度就是一个密码有多难被猜到或者被电脑暴力破解。
想象一下,如果你的密码是“123456”,那破解者可能试一次就成功了。但如果你的密码是“Abc123!@#”,那电脑就需要尝试海量的组合才能撞对,你的账户就安全多了。
所以,很多网站都会设置一些规则来“强迫”我们使用强密码。今天,我们就来实现一个最常用的简易版规则:
- 密码长度至少8位(越长越难猜)。
- 密码中必须含有数字。
- 密码中必须含有字母(大小写都行)。
我们的程序会像一位严格的“密码安检员”,一条一条地检查你的密码是否符合这些规定。
我们的作战计划
怎么用程序来实现这个“安检”呢?思路非常清晰:
- 接收输入:让用户输入一个密码。
- 设置计分板:创建一个变量(比如叫
strength_level),初始分数为0。 - 逐条检查:
- 如果密码长度≥8,计分板+1。
- 如果密码含有数字,计分板+1。
- 如果密码含有字母,计分板+1。
- 宣布结果:如果计分板满分(3分),就恭喜用户;否则,就告诉用户哪里不合格。
这个“计分板”的思路是不是很像游戏里的任务达成系统?每完成一个任务就点亮一颗星。我们的密码也要集齐三颗星才算合格!
字符串的“体检报告”
要检查密码,我们得学会“审问”字符串。Python 给字符串准备了很多好用的“体检方法”,可以快速告诉我们字符串的构成。
今天我们会用到其中两个:
str.isnumeric():检查这个字符串是否只由数字组成。比如’123‘.isnumeric()会返回True,而’a123‘.isnumeric()则返回False。str.isalpha():检查这个字符串是否只由字母组成。比如’abc‘.isalpha()返回True,’ab1‘.isalpha()返回False。
注意:这两个方法检查的是“是否只由某种字符组成”,而不是“是否含有某种字符”。这就像问“这杯水是100%纯净水吗?”,而不是问“这杯水里有水分子吗?”。对于“是否含有”的问题,我们需要更精细的方法。
动手编写 1.0 版本
好了,理论准备完毕,让我们打开编辑器,开始写代码吧!记住,我们这一节的核心目标是学会使用 isnumeric() 和 isalpha() 方法,并复习如何用函数来组织代码逻辑。
我们会把检查“是否含有数字”和“是否含有字母”的逻辑分别封装成函数,这样主程序会非常清晰。
"""
作者:小象教研组
功能:判断密码强度
版本:1.0
"""
def check_number_exist(password_str):
"""
判断字符串中是否含有数字
思路:遍历字符串的每个字符,只要有一个是数字,就立刻返回True。
如果遍历完都没找到数字,则返回False。
"""
for c in password_str:
if c.isnumeric(): # 检查当前字符c是否是数字
return True # 是数字,立刻返回True,函数结束
# 循环正常结束,说明没找到数字
return False
def check_letter_exist(password_str):
"""
判断字符串中是否含有字母
思路同上,只是检查方法换成了.isalpha()
"""
for c in password_str:
if c.isalpha(): # 检查当前字符c是否是字母
return True # 是字母,立刻返回True,函数结束
return False
# 主程序开始
# 1. 接收用户输入
# 原程序使用 input(),这里为了你能直接运行,先用一个固定密码代替
# 你可以把下面这行改成 password = input('请输入密码:') 来体验交互
password = 'ABC123def'
# 2. 初始化密码强度计分板
strength_level = 0
# 3. 规则一:检查密码长度
if len(password) >= 8:
strength_level += 1 # 满足条件,分数加1
print('✅ 密码长度符合要求(至少8位)。')
else:
print('❌ 密码长度要求至少8位!')
# 4. 规则二:检查是否含有数字
if check_number_exist(password): # 调用我们写的函数
strength_level += 1
print('✅ 密码包含数字。')
else:
print('❌ 密码要求包含数字!')
# 5. 规则三:检查是否含有字母
if check_letter_exist(password): # 调用我们写的函数
strength_level += 1
print('✅ 密码包含字母。')
else:
print('❌ 密码要求包含字母!')
# 6. 宣布最终结果
print('\n=== 最终检测报告 ===')
if strength_level == 3:
print('🎉 恭喜!密码强度合格!')
else:
print('⚠️ 密码强度不合格!请根据上方提示修改。')
print(f' (当前强度得分:{strength_level}/3)')✅ 密码长度符合要求(至少8位)。
✅ 密码包含数字。
✅ 密码包含字母。
=== 最终检测报告 ===
🎉 恭喜!密码强度合格!代码精讲:
- 函数里的
return:在check_number_exist函数中,一旦if c.isnumeric()成立,我们立刻执行return True。这意味着函数会立即结束,并把True这个结果返回给调用它的地方。后面的字符就不用再检查了,非常高效!这是一种常见的“提前返回”模式。 - 清晰的流程:主程序 (
main函数外的部分) 按照我们“作战计划”里的四步,一步一步执行,逻辑非常清晰。每通过一条规则,就加分并打印成功信息;没通过则打印错误提示。 - 固定值代替
input():为了让代码块能独立运行,我们用一个固定字符串‘ABC123def‘代替了input()。如果你想体验交互,可以把那行改成password = input(‘请输入密码:‘)。
试试不同的密码
让我们用几个例子来测试一下我们程序的“安检”能力。你可以修改上面代码块中 password 的值,然后重新运行。
def check_number_exist(password_str):
"""
判断字符串中是否含有数字
思路:遍历字符串的每个字符,只要有一个是数字,就立刻返回True。
如果遍历完都没找到数字,则返回False。
"""
for c in password_str:
if c.isnumeric(): # 检查当前字符c是否是数字
return True # 是数字,立刻返回True,函数结束
return False
def check_letter_exist(password_str):
"""
判断字符串中是否含有字母
思路同上,只是检查方法换成了.isalpha()
"""
for c in password_str:
if c.isalpha(): # 检查当前字符c是否是字母
return True # 是字母,立刻返回True,函数结束
return False
# 换一个弱密码测试:'123' 太短,而且没有字母
password = '123'
# 初始化密码强度计分板
strength_level = 0
# 规则一:检查密码长度
if len(password) >= 8:
print('✅ 密码长度符合要求。')
else:
print('❌ 密码长度要求至少8位!')
# 规则二:检查是否含有数字
if check_number_exist(password):
strength_level += 1
print('✅ 密码包含数字。')
else:
print('❌ 密码要求包含数字!')
# 规则三:检查是否含有字母
if check_letter_exist(password):
strength_level += 1
print('✅ 密码包含字母。')
else:
print('❌ 密码要求包含字母!')
print(f'\n密码 "{password}" 的强度得分为:{strength_level}/3')❌ 密码长度要求至少8位!
✅ 密码包含数字。
❌ 密码要求包含字母!
密码 "123" 的强度得分为:1/3看,程序准确地指出了“123”这个密码的两个问题:太短,而且没有字母。我们的密码安检员工作得很称职!
📝 动手练一练
你已经成功打造了第一版密码检测器!现在来挑战一下,让它变得更强大。
- 规则升级:很多网站还要求密码必须同时包含大写字母和小写字母。你能修改程序,加入这条规则吗?(提示:字符串还有
.islower()和.isupper()方法哦) - 友好提示:现在的程序会把所有错误都列出来。但如果一个密码同时不满足“有数字”和“有字母”,你能修改提示逻辑,只输出一条更概括的信息,比如“密码必须同时包含数字和字母”吗?
- 强度分级:现在的判断只有“合格”和“不合格”。你能设计一个更细致的评分系统吗?例如:
- 弱(0-1分):打印红色警告。
- 中(2分):打印黄色提示,建议加强。
- 强(3分):打印绿色祝贺。
👉 点击查看第1题参考答案思路
思路:要检查是否同时包含大小写字母,我们需要两个标志变量。遍历密码的每个字符,如果发现小写字母,就把“有小写”标志设为True;如果发现大写字母,就把“有大写”标志设为True。遍历结束后,如果两个标志都是True,则通过这条规则。
关键代码片段(在 1.0 程序基础上新增,其余代码保持不变):
# 新增检查函数:必须同时包含大写和小写字母才返回 True
def check_upper_lower_exist(password_str):
"""
检查字符串中是否同时包含大写和小写字母
"""
has_lower = False
has_upper = False
for c in password_str:
if c.islower():
has_lower = True
elif c.isupper():
has_upper = True
# 如果已经同时找到了,可以提前结束循环
if has_lower and has_upper:
return True
# 循环结束,检查两个标志
return has_lower and has_upper
# 在主程序宣布结果前增加第 4 条规则(password、strength_level 沿用 1.0)
if check_upper_lower_exist(password):
strength_level += 1
print('✅ 密码同时包含大小写字母。')
else:
print('❌ 密码要求同时包含大小写字母!')本章小结
太棒了!你已经完成了“密码强度检测器”的 1.0 版本。回顾一下我们这一节的旅程:
- 我们做了什么:编写了一个可以自动检查密码是否符合长度、数字、字母三条规则的程序。
- 我们新学了什么:掌握了字符串的
isnumeric()和isalpha()这两个“体检”方法,并再次练习了如何定义和调用函数,特别是函数中“提前返回”的写法。 - 项目的趣味:你不再是密码规则的被动接受者了,你现在是规则的制定者和执行者!你的程序已经具备了基础的安全逻辑思维。
📋 行动清单
学完立刻可以做的几件事:
- 运行今天的完整代码,用你自己的常用密码测试一下,看看能得几分?
- 修改代码中的
password变量,多试几种组合(纯数字、纯字母、长短不一),观察程序的输出,彻底理解每条规则。 - 挑战一下“动手练一练”中的题目,尝试给你密码检测器增加新功能。
在下一节,我们将为这个检测器增加一个非常实用的功能:限制用户设置密码的次数(比如最多试5次),并学习一个控制循环的强力语句——break。让你的程序更像一个真实的、有耐心的(但次数有限)的注册页面吧!
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。
- 下载第7章代码包:判断密码强弱(含全部版本 6 个 .py)ZIP · 5KB