鱼C论坛

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

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

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

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

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

x
求大佬看看我的代码哪里错了,为什么有时候输入多个数字和特殊字符会出现多个“高”。原题目是零基础入门学习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[0] 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: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[0] in chars):
        print("高")
        print("请继续保持")
        break
    else:
        print("中")

    print("请按以下方式提升您的密码安全级别:\n\
    \t1. 密码必须由数字、字母及特殊字符三种组合\n\
    \t2. 密码只能由字母开头\n\
    \t3. 密码长度不能低于16位")
    break
想知道小甲鱼最近在做啥?请访问 -> 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

如果把缩进调到和print一起,也还是会出现这种情况啊,这就很不解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[0] in chars):
        print("高")
        print("请继续保持")
        break
    else:
        print("中")

    print("请按以下方式提升您的密码安全级别:\n\
    \t1. 密码必须由数字、字母及特殊字符三种组合\n\
    \t2. 密码只能由字母开头\n\
    \t3. 密码长度不能低于16位")
    break
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-18 07:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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