鱼C论坛

 找回密码
 立即注册
查看: 1737|回复: 9

[已解决]关于第14讲check。py的讨论

[复制链接]
发表于 2021-8-10 11:09:19 | 显示全部楼层 |阅读模式
2鱼币
其实我觉得小甲鱼这个题目还是有漏洞的(他自己也说了有民愤)。
# 密码安全性检查代码
#
# 低级密码要求:
#   1. 密码由单纯的数字或字母组成
#   2. 密码长度小于等于8位
#
# 中级密码要求:
#   1. 密码必须由数字、字母或特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)任意两种组合
#   2. 密码长度不能低于8位
#
# 高级密码要求:
#   1. 密码必须由数字、字母及特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)三种组合
#   2. 密码只能由字母开头
#   3. 密码长度不能低于16位

我审题吧,按照他的说法,无论是高中低级的几个限制条件应该是and的关系啊,但是在他的程序中却又出现了or的关系。
# 打印结果
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("中")


如果硬要按照and 的关系那么123456789和123456789101112314s'这个输入,其实都不可行‘’,但是我仍然认为每个等级的限制条件是并存的!
不知道我举例子对不对,就像是说:一线城市的条件是面积xxx人口xxx经济xxx,这样的话所有的城市也都是按照这个条件来套啊,如果有偏科的(比如经济好可以当一线人口少的只能当二线)情况存在,这个分类方法就失效了,所以应该有其他的评估办法。可是尽管如此,这种评估不失为一种好的方法,但是按照前述的城市等级分类确实是没法子处理我说的这种偏科条件,如果我要自行决定是and还是or的话,那么可能每个人都又不同的答案。

所以我认为这个题目还是有纰漏的。

扯远了,所以各位怎么看这个密码等级的条件是and还是or?




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

passwd= input('请输入需要检查的密码组合:')
# 判断首字符是否为字母
cd1 = (65 <= ord(passwd[0]) <= 90) or (97 <= ord(passwd[0]) <= 122)
# 判断长度
cd2 = len(passwd)
# 判断成分
n,c,s = 0,0,0
for each in passwd:
if each in nums:
n = 1
elif each in chars:
c = 1
elif each in symbols:
s = 1
if (n,c,s)== (1,0,0) or (n,c,s)==(0,1,0 ):
cd3 = 1
elif (n,c,s)== (1,1,0) or (n,c,s)==(1,0,1) or (n,c,s)==(0,1,1):
cd3 = 2
elif (n,c,s)== (1,1,1):
cd3 = 3

# 给出评估
if (0 <= cd2 <= 8) or (cd3 == 1 ):
print('密码强度为低级',tip,sep='\n')
elif (8 <= cd2 <= 16) or (cd3 == 2 ):
print('密码强度为中级',tip,sep='\n')
elif (cd2 >= 16) and (cd3 == 3 ) and (cd1 ==True):
print('密码强度为高级')


我只是尽量满足可行性和面型过程的编程思路。

最佳答案
2021-8-10 11:09:20
or是满足任意条件为低级
高级密码全都是and

最佳答案

查看完整内容

or是满足任意条件为低级 高级密码全都是and
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-10 11:09:20 | 显示全部楼层    本楼为最佳答案   
or是满足任意条件为低级
高级密码全都是and
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-10 11:22:31 | 显示全部楼层
逃兵 发表于 2021-8-10 11:17
or是满足任意条件为低级
高级密码全都是and

那么中级呢?如果满足中级1而没有满足中级2——也即复杂了点但是太短了——那么久很蛋疼了,这时如果是or就默认了短小复杂的,如果是and就没法子判定了。同样的,针对高级的话,也是如此,所以我觉得还是不合适啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-10 11:28:56 | 显示全部楼层
Python初学者8号 发表于 2021-8-10 11:22
那么中级呢?如果满足中级1而没有满足中级2——也即复杂了点但是太短了——那么久很蛋疼了,这时如果是or ...


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

passwd= input('请输入需要检查的密码组合:')
# 判断首字符是否为字母
cd1 = passwd[0] in chars
# 判断长度
cd2 = len(passwd)
# 判断成分
n,c,s = 0,0,0
for each in passwd:
        if each in nums:
                n = 1
        elif each in chars:
                c = 1
        elif each in symbols:
                s = 1
cd3 = n+c+s

# 给出评估
if cd2 <= 8 or cd3 == 1 :
        print('密码强度为低级',tip,sep='\n')
elif cd2 >= 16 and cd3 == 3  and cd1 :
        print('密码强度为高级')
else:
        print('密码强度为中级',tip,sep='\n')
只要满足低级的任一条件就会是低级,只要满足高级的所有条件就会是高级,其它的情况只能是中级
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-10 11:33:46 | 显示全部楼层
2012277033 发表于 2021-8-10 11:28
看了下,你这部分代码过多了,稍微改下成这样更简便些:

只要满足低级的任一条件就会是低级,只要满 ...

牛逼,cd1 = passwd[0] in chars和cd3 = n+c+s来搞我是真没想到,感谢感谢!!

能一眼看出来还是需要功底的,我之所以没想到是因为练太少了吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-10 12:47:42 | 显示全部楼层
Python初学者8号 发表于 2021-8-10 11:33
牛逼,cd1 = passwd[0] in chars和cd3 = n+c+s来搞我是真没想到,感谢感谢!!

能一眼看出来还是需要 ...

多写一些很多自然而然就成为习惯了,经常用django写些测试用的页面,所以习惯了一些python的写法,不过,应该有更简单的语句,只是我没用过,所以不了解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-10 14:39:53 | 显示全部楼层
2012277033 发表于 2021-8-10 12:47
多写一些很多自然而然就成为习惯了,经常用django写些测试用的页面,所以习惯了一些python的写法,不过, ...

我之前用正则来实现,从结果代码行数上看是少了(如果用上你这的判断逻辑的话),
但为了写出那正确的正则表达式,却折腾了很久很久。。
还不如像你这样写,更清晰,更简单。

另外,我咋没想到把 "中强度"的条件归为 else 呢,

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

使用道具 举报

 楼主| 发表于 2021-8-10 15:51:51 | 显示全部楼层
2012277033 发表于 2021-8-10 12:47
多写一些很多自然而然就成为习惯了,经常用django写些测试用的页面,所以习惯了一些python的写法,不过, ...

猜对了,果然还是熟能生巧啊,感谢大哥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-10 15:53:33 | 显示全部楼层
阿奇_o 发表于 2021-8-10 14:39
我之前用正则来实现,从结果代码行数上看是少了(如果用上你这的判断逻辑的话),
但为了写出那正确的正 ...

哈哈哈,所以我现在也发现了,我觉得现阶段我这个初学者还是注重可行性了,至于技术还是简单点来的好,然后过段时间再看自己的代码就可能写的会好点了。

中强度放在else是那位大哥还有小甲鱼的想法,哈哈哈,我也才知道
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-17 11:25:53 | 显示全部楼层
逃兵 发表于 2021-8-10 11:17
or是满足任意条件为低级
高级密码全都是and

想了想你说的有道理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 15:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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