python检查密码安全等级_python新人,求助大佬们这段密码等级判断的代码能否正确运行嘞?万分感谢!...

这篇博客讨论了一段用于检查密码安全等级的Python代码,指出了代码中的问题和潜在的改进方案。博主分析了代码的逻辑,包括密码长度判断、字符种类检查以及循环结构,并提出了更简洁高效的实现方式。
摘要由CSDN通过智能技术生成

#这个是你原来发的代码

#我会在有问题的地方加 # 注释但不会去修改

num = '0123456789'

cap = 'qwertyuiopasdfghjklzxcvbnm'

CAP = 'QWERTYUIOPASDFGHJKLZXCVBNM'

symbol = '~!@#$%^&*()_+/\[]{}?<>'

password = input('请输入您的密码:')

lenth = len(password)

#问题1:在while循环之前lenth已经得到了赋值,如果输入的直接是回车

#lenth不就是0么,那么while是不是一直满足 or lenth == 0的条件呢?

#这样岂不是死循环?

while password.isspace() or lenth == 0:

password = input('密码为空!请重新输入:')

if lenth <= 8 :

lenth_flag = 0

elif 16 >= lenth > 8:

lenth_flag = 1

else:

lenth_flag = 2

count = 0

for each in password:

if each in num:

count += 1

break

#这里就是你后面要求中的问题2:

#我猜你的本意是获取密码password中包含有num cap CAP 中的几种

#但是循环一旦break就不会再继续,也就是你循环执行完毕count一直都会是1

#解决办法其实很简单,我会在后边给你一个非常简单的代码

if each in cap:

count += 1

break

if each in CAP:

count += 1

break

while 1:

grade = lenth_flag + count

if grade == 1 and lenth_flag == 0:

print('密码等级低')

elif grade == [3,2,4] and lenth_flag == 1:

#这里是问题3:

#grade是整型,怎么会和列表划等号?改成in就对了

#但是既是你改成in语句仍有错误

print('密码等级为中')

elif grade == 5 and lenth_flag == 2:

print('密码等级高')

break

#这里是问题4:

#既然是while 1 但循环只是执行1便就break那么定义一个死循环又有什么意义?

#-----------------------------

#下边我给你分享一下我的思路以及我跟你说的问题2中非常容易的代码思路

#题外话:编程就是个逻辑问题,思路很重要

#每种思路代表各自不一样的代码,但是却能解决相同的问题

#这就是每个人的代码都不尽相同的根本原因

#我只是分享我的思路,或许对你有些帮助

#但我绝不想限制你的想法,当你写得多看得多自然就会的多了

#-----------------------------

#思路1:定义一个函数来判断各种情况

#思路2:首先明确如何判断密码难度等级,满足什么条件的密码能够达到什么程度

#思路3:如何能够让代码清晰且高效

#-----------------------------

#我先将思路2,也是本题的最大难点

#我理解的你的想法中,给密码强度设置了两个主要条件

#条件1:密码长度有 0-8  9-16 16以上 的条件

#条件2:密码内容有 数字 小写 大写 符号 的条件,如果我们默认密码主体成分是数字

#       密码中的  小写  大写 符号 就是满足密码强度的判断标准

#       具体我会贴一个图片上去

#代码开始:

#   我会将代码整体全部注释掉

#-----------------------------

'''

num = '0123456789'

cap = 'qwertyuiopasdfghjklzxcvbnm'

CAP = 'QWERTYUIOPASDFGHJKLZXCVBNM'

symbol = '~!@#$%^&*()_+/\[]{}?<>'#标点不全有可能执行到else不在判断区域

#新增一个判断函数,来判断函数中是否存在某种密码要求的条件种类以达到为后期

#快速判断提速

def isTrue(passwords,kinds): #新增一个判断函数

for i in passwords:   #函数的参数为 密码 和 需要判断的种类

if i in kinds:  #逐个读取密码字符,如果该字符确实在该种类之中

return True  #返回 True

return False    #当 for 执行完毕依旧没有 return ,不包含有此种类 False

#这里我加了一个判断中文,其实这一句无关大雅,如果你允许存在中文密码的情况下

def isCH(passwords): #新增一个判断中文

for ch in passwords:

if '\u4e00' <= ch <= '\u9fff':

return True

return False

while True: #这里才是真正的重点

password = input('请输入您的密码:')

if password.isspace() or len(password)==0:#这里把lenth改了,死循环

print('密码为空!请重新输入')

continue #continue的意思是立即结束本次循环,并执行下一次循环

elif isCH(password):

print('请勿输入汉字')

continue

lenth = len(password)

#密码强度从高到低判断不要从低到高,满足高等级的一定满足低等级会判断失误

if lenth > 16 and (isTrue(password,cap) and

isTrue(password,CAP) and

isTrue(password,symbol)):

#如果密码长度16以上并且同时含有cap CAP symbol等级高

print('密码等级高')

elif 16 >= lenth > 8 and ((isTrue(password,cap) and isTrue(password,CAP))or

(isTrue(password,CAP) and isTrue(password,symbol))or

(isTrue(password,symbol) and isTrue(password,cap))):

#如果密码长度9-16并且含有cap CAP symbol任意两种等级中高

print('密码等级中高')

elif 16 >= lenth > 8 and (isTrue(password,cap) or

isTrue(password,CAP) or

isTrue(password,symbol)):

#如果密码长度9-16并且含有cap CAP symbol任意一种等级中

print('密码等级中')

elif 16 >= lenth > 8:

#密码长度9-16且不含cap CAP symbol等级中低

print('密码等级中低')

elif lenth <= 8 :

#密码长度0-8等级低

print('密码等级低')

else:

print('密码不在判断区域!')

#break

'''

#所以我们发现我们的代码让旧不够完善

#我们有没有办法再简洁再改进呢,答案是有的

#接下来我继续讲解改进思路

#其实内容并不多只是感觉比较多

#我尽量分享的详细让你更容易理解

#-----------------------------

#思路开始

#其实我们发现,我的思路和你思路一结合就全都有了,代码也简洁了,效率也提高了

#这是真的,只是你自己还不善于开阔思路

#问题1:我们能不能够以数字来表示密码复杂程度?

#答:肯定答案,可以的

#问题2:既然可以我们怎样能够做到?

#答:方法非常之多,我只分享一个我认为最简单的,剩下的有你自己去思考

#思路1:为什么我们当初定义的函数只是返回了 True or False ?

#       如果我返回的是 1 和 0 会怎样?

#代码如下:

'''

def isTrue(passwords,kinds): #新增一个判断函数

for i in passwords:   #函数的参数为 密码 和 需要判断的种类

if i in kinds:  #逐个读取密码字符,如果该字符确实在该种类之中

return 1  #返回 True

return 0

'''

#思路2:为什么我们要用循环还算密码复杂程度?其他方法不可以吗?

#       如果我用列表怎么样?

#代码如下:

def isTrue(passwords,kinds): #新增一个判断函数

for i in passwords:   #函数的参数为 密码 和 需要判断的种类

if i in kinds:  #逐个读取密码字符,如果该字符确实在该种类之中

return 1  #返回 True

return 0

num = '0123456789'

cap = 'qwertyuiopasdfghjklzxcvbnm'

CAP = 'QWERTYUIOPASDFGHJKLZXCVBNM'

symbol = '~!@#$%^&*()_+/\[]{}?<>'

#验证1

password1 = '234556asdQWE[]'

kindlist1 = [isTrue(password1,num),

isTrue(password1,cap),

isTrue(password1,CAP),

isTrue(password1,symbol)]

print(kindlist1)

#验证2

password2 = '234556asdQWE'

kindlist2 = [isTrue(password2,num),

isTrue(password2,cap),

isTrue(password2,CAP),

isTrue(password2,symbol)]

print(kindlist2)

'''

>>>

[1, 1, 1, 1]

[1, 1, 1, 0]

>>>

'''

#试试证明完全可以

#那么我对kindlist进行sum求和是否就能够得到密码复杂程度的数字表示方法呢?

#答案是完全可以

getsum1 ,getsum2 = sum(kindlist1) ,sum(kindlist2)

print(getsum1,getsum2)

#所以以后的代码就可以不再 那么长那么多and那么多or了

#妈妈再也不用担心你逻辑关系感不强了

#本来剩下的代码我准备也该你敲出来的

#一来我担心你等得着急

#而来我开头说过并不想完全让你按照我的思路进行

#下边就完全交给你自己了

#至于如何判断首字母是否是英文我想我也不需要再多说

#好了,分享到此结束,提前预祝你获得成功!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值