乱世英雄 发表于 2020-10-21 21:45:17

求大佬看看我的代码哪里错了

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

print('请通过以下方式提升您的密码安全级别:\n\
                              1.密码必须由数字、字母及特殊字符三种组合\n\
                              2.密码只能由字母开头\n\
                              3.密码长度不能低于16位')

笨鸟学飞 发表于 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)

乱世英雄 发表于 2020-10-21 22:36:33

笨鸟学飞 发表于 2020-10-21 22:30
for each in secret:                                          #然而这个循环还是一直在走啊?(阅 ...

如果把缩进调到和print一起,也还是会出现这种情况啊,这就很不解

昨非 发表于 2020-10-21 22:51:20

for循环嵌套判断又嵌套for循环很容易出现跳出一个循环却跳不出上级循环的状况
所以还是建议三项分开判断
参考答案:
symbols = r'''`!@#$%^&*()_+-=/*{}[]\|'";:/?,.<>'''
chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
nums = '0123456789'

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

# 判断长度
length = len(passwd)

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

if length <= 8:
    flag_len = 1
elif 8 < length < 16:
    flag_len = 2
else:
    flag_len = 3

flag_con = 0

# 判断是否包含特殊字符
for each in passwd:
    if each in symbols:
      flag_con += 1
      break
   
# 判断是否包含字母
for each in passwd:
    if each in chars:
      flag_con += 1
      break

# 判断是否包含数字
for each in passwd:
    if each in nums:
      flag_con += 1
      break   

# 打印结果
while 1 :
    print("您的密码安全级别评定为:", end='')
    if flag_len == 1 or flag_con == 1 :
      print("低")
    elif flag_len == 3 and flag_con == 3 and (passwd in chars):
      print("高")
      print("请继续保持")
      break
    else:
      print("中")

    print("请按以下方式提升您的密码安全级别:\n\
    \t1. 密码必须由数字、字母及特殊字符三种组合\n\
    \t2. 密码只能由字母开头\n\
    \t3. 密码长度不能低于16位")
    break

乱世英雄 发表于 2020-10-21 22:57:08

老哥一语惊醒梦中人啊,一个break只能停止一个for循环,所以我在第一for循环后面加了一个break就ok了
页: [1]
查看完整版本: 求大佬看看我的代码哪里错了