鱼C论坛

 找回密码
 立即注册
查看: 1887|回复: 4

[已解决]求大佬看看我的代码哪里错了

[复制链接]
发表于 2020-10-21 21:45:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
求大佬看看我的代码哪里错了,为什么有时候输入多个数字和特殊字符会出现多个“高”。原题目是零基础入门学习python(旧)中的14讲课后作业检查密码安全评级的题,代码如下。
  1. secret=input('请输入需要检查的密码组合:')
  2. alpha='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
  3. string1=r'''`!@#$%^&*()_+-=/*{}[]\|'";:/?,.<>'''
  4. math='1234567890'
  5. length=len(secret)
  6. if secret.isalpha() or secret.isdigit() or length<8:
  7.     print('您的密码安全级别评定为:低')
  8. elif length>=16 and (secret[0] in alpha):
  9.     for each in secret:
  10.         if each in string1:
  11.             for i in secret:
  12.                 if i in math:
  13.                     print('您的密码安全级别评定为:高')
  14.             break            
  15.               
  16. else:
  17.     print('您的密码安全级别评定为:中')

  18. print('请通过以下方式提升您的密码安全级别:\n\
  19.                                 1.密码必须由数字、字母及特殊字符三种组合\n\
  20.                                 2.密码只能由字母开头\n\
  21.                                 3.密码长度不能低于16位')
复制代码
最佳答案
2020-10-21 22:51:20
for循环嵌套判断又嵌套for循环很容易出现跳出一个循环却跳不出上级循环的状况
所以还是建议三项分开判断
参考答案:
  1. symbols = r'''`!@#$%^&*()_+-=/*{}[]\|'";:/?,.<>'''
  2. chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
  3. nums = '0123456789'

  4. passwd = input('请输入需要检查的密码组合:')

  5. # 判断长度
  6. length = len(passwd)

  7. while (passwd.isspace() or length == 0) :
  8.     passwd = input("您输入的密码为空(或空格),请重新输入:")
  9.     length = len(passwd)

  10. if length <= 8:
  11.     flag_len = 1
  12. elif 8 < length < 16:
  13.     flag_len = 2
  14. else:
  15.     flag_len = 3

  16. flag_con = 0

  17. # 判断是否包含特殊字符
  18. for each in passwd:
  19.     if each in symbols:
  20.         flag_con += 1
  21.         break
  22.    
  23. # 判断是否包含字母
  24. for each in passwd:
  25.     if each in chars:
  26.         flag_con += 1
  27.         break

  28. # 判断是否包含数字
  29. for each in passwd:
  30.     if each in nums:
  31.         flag_con += 1
  32.         break   

  33. # 打印结果
  34. while 1 :
  35.     print("您的密码安全级别评定为:", end='')
  36.     if flag_len == 1 or flag_con == 1 :
  37.         print("低")
  38.     elif flag_len == 3 and flag_con == 3 and (passwd[0] in chars):
  39.         print("高")
  40.         print("请继续保持")
  41.         break
  42.     else:
  43.         print("中")

  44.     print("请按以下方式提升您的密码安全级别:\n\
  45.     \t1. 密码必须由数字、字母及特殊字符三种组合\n\
  46.     \t2. 密码只能由字母开头\n\
  47.     \t3. 密码长度不能低于16位")
  48.     break
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-10-21 22:30:41 | 显示全部楼层
    for each in secret:                                            #然而这个循环还是一直在走啊?(阅读顺序:3)
        if each in string1:
            for i in secret:                                          #对应这~~~(阅读顺序:2)
                if i in math:
                    print('您的密码安全级别评定为:高')
            break                                                       #这个跳出循环对应我给你标记的循环,注意看缩进(阅读顺序:1)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-21 22:36:33 | 显示全部楼层
笨鸟学飞 发表于 2020-10-21 22:30
for each in secret:                                            #然而这个循环还是一直在走啊?(阅 ...

如果把缩进调到和print一起,也还是会出现这种情况啊,这就很不解
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-21 22:51:20 | 显示全部楼层    本楼为最佳答案   
for循环嵌套判断又嵌套for循环很容易出现跳出一个循环却跳不出上级循环的状况
所以还是建议三项分开判断
参考答案:
  1. symbols = r'''`!@#$%^&*()_+-=/*{}[]\|'";:/?,.<>'''
  2. chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
  3. nums = '0123456789'

  4. passwd = input('请输入需要检查的密码组合:')

  5. # 判断长度
  6. length = len(passwd)

  7. while (passwd.isspace() or length == 0) :
  8.     passwd = input("您输入的密码为空(或空格),请重新输入:")
  9.     length = len(passwd)

  10. if length <= 8:
  11.     flag_len = 1
  12. elif 8 < length < 16:
  13.     flag_len = 2
  14. else:
  15.     flag_len = 3

  16. flag_con = 0

  17. # 判断是否包含特殊字符
  18. for each in passwd:
  19.     if each in symbols:
  20.         flag_con += 1
  21.         break
  22.    
  23. # 判断是否包含字母
  24. for each in passwd:
  25.     if each in chars:
  26.         flag_con += 1
  27.         break

  28. # 判断是否包含数字
  29. for each in passwd:
  30.     if each in nums:
  31.         flag_con += 1
  32.         break   

  33. # 打印结果
  34. while 1 :
  35.     print("您的密码安全级别评定为:", end='')
  36.     if flag_len == 1 or flag_con == 1 :
  37.         print("低")
  38.     elif flag_len == 3 and flag_con == 3 and (passwd[0] in chars):
  39.         print("高")
  40.         print("请继续保持")
  41.         break
  42.     else:
  43.         print("中")

  44.     print("请按以下方式提升您的密码安全级别:\n\
  45.     \t1. 密码必须由数字、字母及特殊字符三种组合\n\
  46.     \t2. 密码只能由字母开头\n\
  47.     \t3. 密码长度不能低于16位")
  48.     break
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-21 22:57:08 | 显示全部楼层
老哥一语惊醒梦中人啊,一个break只能停止一个for循环,所以我在第一for循环后面加了一个break就ok了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-28 16:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表