查看全课大纲(第 30 / 51 节)
  1. 1.为什么人人都该学点编程?
  2. 2.计算机与程序设计:你的电脑到底在“想”什么?
  3. 3.Python 这门语言,到底有什么魔力?
  4. 4.Python 开发环境配置:如何拥有你的第一个“编程工具箱”?
  5. 5.如何安装一个更强大的代码编辑器?
  6. 6.汇率兑换1.0:你的第一个“钱生钱”小程序
  7. 7.你的第一行代码,藏着哪些秘密?
  8. 8.汇率兑换2.0(上):让程序看懂“CNY”和“USD”
  9. 9.汇率兑换程序,如何让它“聪明”地判断币种?
  10. 10.汇率兑换程序能一直运行,直到我喊停吗?
  11. 11.汇率兑换4.0:如何把“算钱”功能打包成积木?
  12. 12.汇率兑换5.0:给你的程序穿上“结构化”的西装
  13. 13.怎么用 Python 画一个会动的五角星?
  14. 14.如何让程序自动画出不同大小的五角星?
  15. 15.函数自己调用自己,会发生什么?
  16. 16.用递归画出神奇的分形树
  17. 17.Python 怎么计算你一天躺着不动能消耗多少热量?
  18. 18.如何让程序“活”起来,持续为你服务?
  19. 19.如何让 BMR 计算器更“聪明”?
  20. 20.当程序遇到“不按套路出牌”的用户怎么办?
  21. 21.怎么用 Python 模拟一个“滚雪球”式的存钱计划?
  22. 22.如何用列表记录每一周的存款?
  23. 23.如何让程序自己数数?—— 用 for 循环解放你的双手
  24. 24.52周存钱挑战4.0:你的存款计算器能有多灵活?
  25. 25.52周存钱挑战:怎么根据日期自动查存款?
  26. 26.Python 怎么判断一年中的第几天?
  27. 27.列表 vs 元组:哪个更适合存储月份天数?
  28. 28.用集合给月份分个队,换个思路算天数
  29. 29.把月份和天数“锁”在一起:用字典给数据配个对
  30. 30.Python 怎么判断密码强弱?
  31. 31.Python 怎么给密码设置“防沉迷”系统?
  32. 32.Python 怎么把密码保存到文件里?
  33. 33.Python 怎么读取文件里的密码?
  34. 34.Python 怎么把密码检查工具“打包”起来?
  35. 35.Python 怎么把文件操作也“打包”起来?
  36. 36.计算机怎么“扔骰子”?——用Python模拟随机事件
  37. 37.如何用 Python 模拟掷两个骰子?
  38. 38.怎么用 Python 把骰子轨迹画出来?
  39. 39.骰子点数分布长啥样?用直方图一眼看穿!
  40. 40.用科学计算库让骰子程序“起飞”
  41. 41.空气质量指数怎么算?手把手教你写一个AQI计算器
  42. 42.空气质量指数计算:从零开始,让程序看懂空气
  43. 43.如何读取空气质量数据文件并找出空气质量最好的五个监测点?
  44. 44.JSON 数据怎么变成 Excel 表格?—— 让数据换个“马甲”
  45. 45.Python 怎么让程序自己判断文件类型?
  46. 46.如何让程序自己上网查空气质量?
  47. 47.用美味的汤来解析网页:Beautiful Soup 入门
  48. 48.如何让爬虫自动抓取全国所有城市的空气质量?
  49. 49.爬到的数据怎么存下来?—— 把全国空气质量数据保存为CSV文件
  50. 50.用 pandas 玩转空气质量数据:找出全国空气最好和最差的城市
  51. 51.空气质量数据怎么“洗”干净,还能画成图?

Python 怎么判断密码强弱?

约 21 分钟

小象实战讲义 · Python 入门:8 个小项目边玩边学

你有没有遇到过这样的场景?注册一个新网站,输入密码时,它总会提示你:“密码太弱,请包含数字和字母,长度至少8位”。今天,我们就来亲手打造一个这样的“密码强度检测器”!学完这一节,你就能写一个程序,像网站后台一样,自动给你的密码打分,告诉你它到底安不安全。

💡 核心导读

  • 项目目标:编写一个能根据三条简单规则判断密码强弱的小工具。
  • 核心思路:用一个“强度分数”变量来记录密码满足了多少条规则。
  • 新知识点:学习使用字符串的 isnumeric() 和 isalpha() 方法来检查字符类型。
  • 编程技巧:复习函数的定义与调用,并学习如何在函数中“提前返回”结果。
  • 趣味点:你的程序现在能像真正的安全系统一样思考了!

密码强度是什么?

在我们动手写代码之前,先来聊聊“密码强度”到底是什么。简单来说,密码强度就是一个密码有多难被猜到或者被电脑暴力破解。

想象一下,如果你的密码是“123456”,那破解者可能试一次就成功了。但如果你的密码是“Abc123!@#”,那电脑就需要尝试海量的组合才能撞对,你的账户就安全多了。

所以,很多网站都会设置一些规则来“强迫”我们使用强密码。今天,我们就来实现一个最常用的简易版规则:

  1. 密码长度至少8位(越长越难猜)。
  2. 密码中必须含有数字。
  3. 密码中必须含有字母(大小写都行)。

我们的程序会像一位严格的“密码安检员”,一条一条地检查你的密码是否符合这些规定。

我们的作战计划

怎么用程序来实现这个“安检”呢?思路非常清晰:

  1. 接收输入:让用户输入一个密码。
  2. 设置计分板:创建一个变量(比如叫 strength_level),初始分数为0。
  3. 逐条检查:
    • 如果密码长度≥8,计分板+1。
    • 如果密码含有数字,计分板+1。
    • 如果密码含有字母,计分板+1。
  4. 宣布结果:如果计分板满分(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”这个密码的两个问题:太短,而且没有字母。我们的密码安检员工作得很称职!

📝 动手练一练

你已经成功打造了第一版密码检测器!现在来挑战一下,让它变得更强大。

  1. 规则升级:很多网站还要求密码必须同时包含大写字母和小写字母。你能修改程序,加入这条规则吗?(提示:字符串还有 .islower() 和 .isupper() 方法哦)
  2. 友好提示:现在的程序会把所有错误都列出来。但如果一个密码同时不满足“有数字”和“有字母”,你能修改提示逻辑,只输出一条更概括的信息,比如“密码必须同时包含数字和字母”吗?
  3. 强度分级:现在的判断只有“合格”和“不合格”。你能设计一个更细致的评分系统吗?例如:
    • 弱(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
    下载
看图文没弄懂?展开看本节视频讲解(约 21 分钟)
📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)