鱼C论坛

 找回密码
 立即注册
查看: 2599|回复: 13

[已解决]字符串练习题(检查密码安全级别)

[复制链接]
发表于 2017-7-17 14:39:47 | 显示全部楼层 |阅读模式

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

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

x
答案的代码在完成检查密码的安全级别工作后即结束,那么,如果我想要用户一直输入密码,直到符合安全性为“高”的要求后程序才停止,该如何修改以下代码呢?谢谢!


# 密码安全性检查代码
#
# 低级密码要求:
#   1. 密码由单纯的数字或字母组成
#   2. 密码长度小于等于8位
#
# 中级密码要求:
#   1. 密码必须由数字、字母或特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)任意两种组合
#   2. 密码长度不能低于8位
#
# 高级密码要求:
#   1. 密码必须由数字、字母及特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)三种组合
#   2. 密码只能由字母开头
#   3. 密码长度不能低于16位

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 == 2 or flag_con == 2:
        print("中")
    else:
        print("高")
        print("请继续保持")
        break

    print("请按以下方式提升您的密码安全级别:\n\
    \t1. 密码必须由数字、字母及特殊字符三种组合\n\
    \t2. 密码只能由字母开头\n\
    \t3. 密码长度不能低于16位'")
    break
最佳答案
2017-7-17 19:54:58
本帖最后由 向西而笑 于 2017-9-11 16:45 编辑

meet = 1
symbols = r'''`!@#$%^&*()_+-=/*{}[]\|'";:/?,.<>'''
chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
nums = '0123456789'
tip = ("请按以下方式提升您的密码安全级别:\n\
        \t1. 密码必须由数字、字母及特殊字符三种组合\n\
        \t2. 密码只能由字母开头\n\
        \t3. 密码长度不能低于16位'")


while meet:
    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

   #判断开头是否为字母
    if passwd[0]  in chars:
            flag_con +=1

   
    # 打印结果
    while 1:
        print("您的密码安全级别评定为:", end='')
        if flag_len == 1 or flag_con == 1:
            print("低")
            print(tip)
        elif flag_len == 2 or flag_con <= 3:
            print("中")
            print(tip)
        else:
            print("高")
            print("请继续保持")
            meet = 0
        break
搞定了,添加和修改的代码用红色标记了。


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-17 18:27:04 | 显示全部楼层
本帖最后由 向西而笑 于 2017-7-17 19:28 编辑
meet = 1
symbols = r'''`!@#$%^&*()_+-=/*{}[]\|'";:/?,.<>'''
chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
nums = '0123456789'
tip = ("请按以下方式提升您的密码安全级别:\n\
        \t1. 密码必须由数字、字母及特殊字符三种组合\n\
        \t2. 密码只能由字母开头\n\
        \t3. 密码长度不能低于16位'")

while meet:
    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("低")
            print(tip)
        elif flag_len == 2 or flag_con == 2:
            print("中")
            print(tip)
        else:
            print("高")
            print("请继续保持")
            meet = 0
        break

解决思路:要让程序一直跑下去那就要让代码置于循环之中(后面回会学自定义函数,更加方便),当输入的密码强度为高时满足循环条件跳出循环。


所以我一开始定义了一个meet = 1,然后把整段代码放入一个循环中,最后在满足条件的分支插入meet = 0,循环结束,程序结束。
思路不难,但是这个代码有问题,高级强度密码的要求是必须字母开头,我试了下数字开头也可以,头疼

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-17 19:03:30 | 显示全部楼层
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("低")
        length = input('请输入密码:')
    elif flag_len == 2 or flag_con == 2:
        print("中")
        length = input('请输入密码:')
    else:
        print("高")
        print("请继续保持")
        break
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-17 19:20:16 | 显示全部楼层

不行,一直是低强度。
123.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-17 19:22:07 | 显示全部楼层
向西而笑 发表于 2017-7-17 19:20
不行,一直是低强度。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-17 19:54:58 | 显示全部楼层    本楼为最佳答案   
本帖最后由 向西而笑 于 2017-9-11 16:45 编辑

meet = 1
symbols = r'''`!@#$%^&*()_+-=/*{}[]\|'";:/?,.<>'''
chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
nums = '0123456789'
tip = ("请按以下方式提升您的密码安全级别:\n\
        \t1. 密码必须由数字、字母及特殊字符三种组合\n\
        \t2. 密码只能由字母开头\n\
        \t3. 密码长度不能低于16位'")


while meet:
    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

   #判断开头是否为字母
    if passwd[0]  in chars:
            flag_con +=1

   
    # 打印结果
    while 1:
        print("您的密码安全级别评定为:", end='')
        if flag_len == 1 or flag_con == 1:
            print("低")
            print(tip)
        elif flag_len == 2 or flag_con <= 3:
            print("中")
            print(tip)
        else:
            print("高")
            print("请继续保持")
            meet = 0
        break
搞定了,添加和修改的代码用红色标记了。


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-17 20:22:12 | 显示全部楼层
本帖最后由 左手十字 于 2017-7-17 20:24 编辑
meet = 1
symbols = r'''`!@#$%^&*()_+-=/*{}[]\|'";:/?,.<>'''
chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
nums = '0123456789'
tip = ("请按以下方式提升您的密码安全级别:\n\
        \t1. 密码必须由数字、字母及特殊字符三种组合\n\
        \t2. 密码只能由字母开头\n\
        \t3. 密码长度不能低于16位'")

while meet:
    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

   #判断开头是否为字母
    if passwd[0]  in chars:
            flag_con +=1
    else:
            flag_con =1
    
    # 打印结果
    while 1:
        print("您的密码安全级别评定为:", end='')
        if flag_len == 1 or flag_con == 1:
            print("低")
            print(tip)
        elif flag_len == 2 or flag_con == 3:
            print("中")
            print(tip)
        else:
            print("高")
            print("请继续保持")
            meet = 0
        break
我觉得你应该在判断是否包含字母的时候加上一句else语句,要不然你输入多于16个纯数字的密码,级别还是高
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-17 20:37:26 | 显示全部楼层
左手十字 发表于 2017-7-17 20:22
我觉得你应该在判断是否包含字母的时候加上一句else语句,要不然你输入多于16个纯数字的密码,级别还是高

不会,看图:
123.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-18 23:50:00 | 显示全部楼层
非常感谢各位朋友热情、耐心的解答,弄明白了!
看到这么多朋友热心解答问题,感觉来这里真是来对了。我也很想解答别人的问题,无奈目前水平还不够,看了好多问题都回答不了。相信有一天我一定也可以解答别人的问题。大家一起加油!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-8 18:29:47 | 显示全部楼层
向西而笑你好,我运行了你改的那个检查密码安全等级的代码
为什么我输入17个字母后,返回结果等级是高呢?
想请教下,你那边运行是没有问题的吗/
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-8 18:33:38 | 显示全部楼层
向西而笑 发表于 2017-7-17 19:54
meet = 1
symbols = r'''`!@#$%^&*()_+-=/*{}[]\|'";:/?,.'''
chars = 'abcdefghijklmnopqrstuvwxyzABCDE ...

你好,我运行了你改的那个检查密码安全等级的代码
为什么我输入17个字母后,返回结果等级是高呢?
想请教下,你那边运行是没有问题的吗/
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-8 20:40:28 | 显示全部楼层
本帖最后由 向西而笑 于 2017-9-8 21:27 编辑
python小能手 发表于 2017-9-8 18:33
你好,我运行了你改的那个检查密码安全等级的代码
为什么我输入17个字母后,返回结果等级是高呢?
想请教 ...


改动了一个数字可以了
#打印结果 下数第3行改成2了
如果还有什么问题,欢迎指出,可能回帖会有点慢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-10 18:34:28 | 显示全部楼层
本帖最后由 python小能手 于 2017-9-10 19:01 编辑
向西而笑 发表于 2017-9-8 20:40
改动了一个数字可以了
#打印结果 下数第3行改成2了
如果还有什么问题,欢迎指出,可能回帖会有点慢


你好向西,谢谢回复

我又运行你修改后的代码,发现一个小问题......如果数字开头再加字母超过16位,返回结果是等级'低'

   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-11 16:48:03 | 显示全部楼层
python小能手 发表于 2017-9-10 18:34
你好向西,谢谢回复

我又运行你修改后的代码,发现一个小问题......如果数字开头再加字母超过16位,返 ...

把 等于 3 改成 小于等于 了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 22:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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