判断密码强度/判断密码强度(2)

去社区提问

简介:判断密码强弱2.0版本,增加限制密码设置次数的功能。

案例描述

欢迎来到今天的课堂~

上节课我们完成了判断密码强度程序的1.0版本,学习判断字符出是否由数字/字母组成,获得字符串长度等方法。

还记得上节课定义了下面两个函数:

  1. def check_number_exist(password_str):
  2. # 判断字符串中是否含有数字
  3. for c in password_str:
  4. if c.isnumeric():
  5. return True
  6. return False
  1. def check_letter_exist(password_str):
  2. # 判断字符串中是否含有字母
  3. for c in password_str:
  4. if c.isalpha():
  5. return True
  6. return False

函数check_number_existcheck_letter_exist分别用来判断字符串中是否包含数字和字母。这两个函数的思路几乎相同:逐个判断字符串中的每一个字符,当遇到数字/字母时,就返回True,如果循环一直遍历到字符串的最后一个元素依然没有遇到数字/字母,则返回False。

上面两个函数中,我们使用return语句来终止循环,这节课我将为你介绍新的方法完成循环控制,实现下面的功能:

案例分析

循环的控制

循环的控制主要依靠break语句和continue语句,它们都可以用来终止循环,那么二者有什么区别呢?

  • break语句

break语句用于终止整个循环

  • continue语句

只终止本次循环,而不终止整个循环的执行

仔细读了读上面的解释,你明白二者的差别了吗?还没理解也没关系,我来举个例子你就懂啦。

你正在和小伙伴一起玩室内卡丁车,大家约定开车绕场地跑十圈。

现在开到了第5圈,continue就好比这时突然电话响了,你停下来接了个电话,直接在第6圈重新跟上队伍继续前进。

break终止地非常干脆,跑到第5圈你撞上了围栏,车子不能启动,只能直接退出游戏了。

了解breakcontinue的不同作用后,请你尝试思考下面两个程序的输出结果分别是什么:

代码练习:

编程区

  1. for i in range(1,10):
  2. if i % 3 ==0:
  3. break
  4. print(i)

终端区

代码练习:

编程区

  1. for i in range(1,10):
  2. if i % 3 == 0:
  3. continue
  4. print(i)

终端区

上面的两段代码只有一行之差,输出结果却完全不同,下面我们就一起来分析分析。

  1. for i in range(1,10):
  2. if i % 3 == 0:
  3. break
  4. print(i)

for循环中i会依次等于1-9这九个数字,当i%3==0也就是i能被3整除时,执行break语句,终止循环。我们来把程序的执行过程梳理一下:

首先i=1,1不能被3整除,不满足条件i%3==0,执行print()语句,打印1;

i=2,2不能被3整除,不满足条件i%3==0,执行下面的print()语句,打印2;

i=3,3可以被3整除,满足条件i%3==0,执行break,终止整个循环,程序结束。

  1. for i in range(1,10):
  2. if i % 3 == 0:
  3. continue
  4. print(i)

这段代码中,i同样会依次等于1-9,当i%3==0时,执行continue语句。同样来梳理一下它的执行过程:

首先i=1,1不能被3整除,不满足条件i%3==0,执行print()语句,打印1;

i=2,2不能被3整除,不满足条件i%3==0,执行print()语句,打印2;

i=3,3能被3整除,满足i%3==0,执行continue,终止本次循环,循环体内的语句直接忽略跳过,也就不执行print()打印数字3,而是直接进入下一次循环,i=4。

i=4i=5时,都不满足if条件,顺利打印出数字4、5;当i=6时,可以整除3,满足if条件,执行continue语句,终止本次循环,变量i直接等于7,进入下一次循环。

同理当i=7i=8时,打印输出,i=9时,执行continue语句,终止本次循环。

现在你应该能区分break和continue在终止循环时的不同作用了吧~

break是直接终止整个循环,而continue只是结束本次循环。

现在就可以改写判断字符串是否含有数字/字母的函数了~

逐个检查字符串中的每个字符,当出现数字时,就结束整个循环,请你在下面注释处填入一行语句,应该怎样书写呢?

  1. def check_number_exist(password_str):
  2. # 判断字符串中是否含有数字
  3. has_number = False
  4. for c in password_str:
  5. if c.isnumeric():
  6. has_number = True
  7. # 请在下方添加一行代码
  8. return has_number

函数最终的返回值是has_number,先为它设置初始值False;

逐一判断字符串中的字符,当判断字符串中出现数字时,修改has_number为True,结束整个循环,返回主函数;

若字符串始终未出现数字,循环执行完毕后返回主函数。

结束整个循环使用的控制语句是break,我们来把函数补充完整:

  1. def check_number_exist(password_str):
  2. # 判断字符串中是否含有数字
  3. has_number = False
  4. for c in password_str:
  5. if c.isnumeric():
  6. has_number = True
  7. break
  8. return has_number

请你按照上面的代码思考判断字符串是否含有字母的函数应该如何定义。

其实我们只需要把if判断条件修改一下,更换为判断字母的方法str.isalpha()

  1. def check_letter_exist(password_str):
  2. # 判断字符串中是否含有字母
  3. has_letter = False
  4. for c in password_str:
  5. if c.isalpha():
  6. has_letter = True
  7. break
  8. return has_letter

主函数不做变化,我们来运行代码试试看~

  1. def check_number_exist(password_str):
  2. # 判断字符串中是否含有数字
  3. has_number = False
  4. for c in password_str:
  5. if c.isnumeric():
  6. has_number = True
  7. break
  8. return has_number
  9. def check_letter_exist(password_str):
  10. # 判断字符串中是否含有字母
  11. has_letter = False
  12. for c in password_str:
  13. if c.isalpha():
  14. has_letter = True
  15. break
  16. return has_letter
  17. password = input('请输入密码:')
  18. # 密码强度
  19. strength_level = 0
  20. # 规则1:密码长度大于8
  21. if len(password) >= 8:
  22. strength_level += 1
  23. else:
  24. print('密码长度要求至少8位!')
  25. # 规则2:包含数字
  26. if check_number_exist(password):
  27. strength_level += 1
  28. else:
  29. print('密码要求包含数字!')
  30. # 规则3:包含字母
  31. if check_letter_exist(password):
  32. strength_level += 1
  33. else:
  34. print('密码要求包含字母!')
  35. if strength_level == 3:
  36. print('恭喜!密码强度合格!')
  37. else:
  38. print('密码强度不合格!')

到这里本节课的任务就完成了一大半!下一项任务是给用户设置密码最多尝试次数,同样要用到循环和控制循环终止的语句。

设置最大尝试次数为5次

用户输入密码,如果符合要求,终止循环,密码设置成功;如果不符合要求则提示用户再次设置密码

若用户已尝试5次,密码均不符合要求,则自动退出循环,密码设置失败。

变量try_times存放用户最大尝试次数:

  1. try_times = 5

这里我们使用while循环,请你思考下面代码的注释提示的地方应该分别添加哪一行代码使得程序实现预想功能呢?

  1. try_times = 5
  2. while try_times > 0:
  3. password = input('请输入密码:')
  4. # 密码强度
  5. strength_level = 0
  6. # 规则1:密码长度大于8
  7. if len(password) >= 8:
  8. strength_level += 1
  9. else:
  10. print('密码长度要求至少8位!')
  11. # 规则2:包含数字
  12. if check_number_exist(password):
  13. strength_level += 1
  14. else:
  15. print('密码要求包含数字!')
  16. # 规则3:包含字母
  17. if check_letter_exist(password):
  18. strength_level += 1
  19. else:
  20. print('密码要求包含字母!')
  21. if strength_level == 3:
  22. print('恭喜!密码强度合格!')
  23. # 添加一行代码终止循环
  24. else:
  25. print('密码强度不合格!')
  26. # 添加一行代码,强度不合格,尝试次数减1

当用户设置的密码符合要求,就不需要用户再进行输入,直接退出整个循环就可以了,因此密码强度合格时,应该添加break语句终止循环。

循环执行条件是try_times>0,密码强度不合规时,变量try_times要执行自减操作:try_times -= 1

怎么样?你答对了吗?

下面将空缺的两行代码补齐,运行程序:

  1. try_times = 5
  2. while try_times > 0:
  3. password = input('请输入密码:')
  4. # 密码强度
  5. strength_level = 0
  6. # 规则1:密码长度大于8
  7. if len(password) >= 8:
  8. strength_level += 1
  9. else:
  10. print('密码长度要求至少8位!')
  11. # 规则2:包含数字
  12. if check_number_exist(password):
  13. strength_level += 1
  14. else:
  15. print('密码要求包含数字!')
  16. # 规则3:包含字母
  17. if check_letter_exist(password):
  18. strength_level += 1
  19. else:
  20. print('密码要求包含字母!')
  21. if strength_level == 3:
  22. print('恭喜!密码强度合格!')
  23. break
  24. else:
  25. print('密码强度不合格!')
  26. try_times -= 1

为了让程序更完整,当密码设置次数大于5时,提示用户尝试次数过多,设置失败。

try_times初始值5,每执行一次循环自减1,所以当try_times<=0时,输出提示语句。

  1. def check_number_exist(password_str):
  2. """
  3. 判断字符串中是否含有数字
  4. """
  5. has_number = False
  6. for c in password_str:
  7. if c.isnumeric():
  8. has_number = True
  9. break
  10. return has_number
  11. def check_letter_exist(password_str):
  12. """
  13. 判断字符串中是否含有字母
  14. """
  15. has_letter = False
  16. for c in password_str:
  17. if c.isalpha():
  18. has_letter = True
  19. break
  20. return has_letter
  21. try_times = 5
  22. while try_times > 0:
  23. password = input('请输入密码:')
  24. # 密码强度
  25. strength_level = 0
  26. # 规则1:密码长度大于8
  27. if len(password) >= 8:
  28. strength_level += 1
  29. else:
  30. print('密码长度要求至少8位!')
  31. # 规则2:包含数字
  32. if check_number_exist(password):
  33. strength_level += 1
  34. else:
  35. print('密码要求包含数字!')
  36. # 规则3:包含字母
  37. if check_letter_exist(password):
  38. strength_level += 1
  39. else:
  40. print('密码要求包含字母!')
  41. if strength_level == 3:
  42. print('恭喜!密码强度合格!')
  43. break
  44. else:
  45. print('密码强度不合格!')
  46. try_times -= 1
  47. print()
  48. if try_times <= 0:
  49. print('尝试次数过多,密码设置失败!')
本关总结

本节课我们主要学习了两个循环控制语句break和continue,了解二者的用法和不同之处。

下节预告

设置的密码可不可以存储在文件中?下节课我将为你介绍Python文件读写操作,记得准时围观哦~

想要领取课程资料和更多同学一起交流学习,欢迎添加班主任微信。

扫描二维码添加班主任微信

已经添加班主任的同学无需重复扫码,直接联系对应老师即可。

判断密码强度 1/3

判断密码强度(2)

1.0x

恭喜完成本课时的学习!
坚持学习

行动力超过

累计学习

学习下一课时