#这个是你原来发的代码
#我会在有问题的地方加 # 注释但不会去修改
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了
#妈妈再也不用担心你逻辑关系感不强了
#本来剩下的代码我准备也该你敲出来的
#一来我担心你等得着急
#而来我开头说过并不想完全让你按照我的思路进行
#下边就完全交给你自己了
#至于如何判断首字母是否是英文我想我也不需要再多说
#好了,分享到此结束,提前预祝你获得成功!
|