鱼C论坛

 找回密码
 立即注册
查看: 1484|回复: 16

[已解决]python新人,求助大佬们这段密码等级判断的代码能否正确运行嘞?万分感谢!

[复制链接]
发表于 2021-1-6 07:00:40 | 显示全部楼层 |阅读模式

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

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

x
num = '0123456789'
cap = 'qwertyuiopasdfghjklzxcvbnm'
CAP = 'QWERTYUIOPASDFGHJKLZXCVBNM'
symbol = '~!@#$%^&*()_+/\[]{}?<>'
password = input('请输入您的密码:')
lenth = len(password)
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
    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:
        print('密码等级为中')
    elif grade == 5 and lenth_flag == 2:
        print('密码等级高')
    break
           
最佳答案
2021-1-6 09:22:13
本帖最后由 qq1151985918 于 2021-1-6 09:30 编辑

我感觉还是有点小问题的给改了改,希望能有帮助
num = '0123456789'
cap = 'qwertyuiopasdfghjklzxcvbnm'
CAP = 'QWERTYUIOPASDFGHJKLZXCVBNM'
symbol = '~!@#$%^&*()_+/\[]{}?<>'#标点不全有可能执行到else不在判断区域

def isTrue(passwords,kinds): #新增一个判断函数
    for i in passwords:
        if i in kinds:
            return True
    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
    
    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    
        
'''---------------------------------
num = '0123456789'
cap = 'qwertyuiopasdfghjklzxcvbnm'
CAP = 'QWERTYUIOPASDFGHJKLZXCVBNM'
symbol = '~!@#$%^&*()_+/\[]{}?<>'
password = input('请输入您的密码:')
lenth = len(password)
while password.isspace() or lenth == 0:#这不是死循环么因为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
    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:
        print('密码等级为中')
    elif grade == 5 and lenth_flag == 2:
        print('密码等级高')
    break

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

使用道具 举报

发表于 2021-1-6 08:07:12 | 显示全部楼层
不能够的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-6 08:15:37 | 显示全部楼层
本帖最后由 洋洋痒 于 2021-1-6 08:19 编辑

第一密码为空重新输入后加lenth = len(password)重新给lenth赋值
第二for each in password:里面的break结束的是for循环只要一次break,for循环就不再往下运行了
第三最后的while 1:下边直接来个break。你细品,为什么要用while语句,直接   
    grade = lenth_flag + count
    if grade == 1 and lenth_flag == 0:
        print('密码等级低')
    elif grade == [3,2,4] and lenth_flag == 1:
        print('密码等级为中')
    elif grade == 5 and lenth_flag == 2:
        print('密码等级高')
不行吗
而且三个判断里的条件也不正确,你这个没有包括(grade==1 or grade==2) and lenth_flag==0的情况
grade==[2,3,4]改为grade in [2,3,4]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-1-6 08:37:25 | 显示全部楼层
num = '0123456789'
cap = 'qwertyuiopasdfghjklzxcvbnm'
CAP = 'QWERTYUIOPASDFGHJKLZXCVBNM'
symbol = '~!@#$%^&*()_+/\[]{}?<>'
password = input('请输入您的密码:')
lenth = len(password)
while password.isspace() or lenth == 0:
    password = input('密码为空!请重新输入:')
    lenth = len(password)
if lenth <= 8 :
    lenth_flag = 0
elif 16 >= lenth > 8:
    lenth_flag = 1
else:
    lenth_flag = 2
count = 0
n=0
c=0
C=0
for each in password:
    if each in num and n==0:
        count += 1
        n=1
    if each in cap and c==0:
        count += 1
        c=1
    if each in CAP and C==0:
        count += 1
        C=1
if lenth_flag == 0 or count in [1,2]:
    print('密码等级低')
elif count == 3 and lenth_flag == 2:
    print('密码等级高')
else:
    print('密码等级为中')
   

我不知道你最后判断密码难度条件具体是什么,你可以根据要求再改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-6 09:22:13 | 显示全部楼层    本楼为最佳答案   
本帖最后由 qq1151985918 于 2021-1-6 09:30 编辑

我感觉还是有点小问题的给改了改,希望能有帮助
num = '0123456789'
cap = 'qwertyuiopasdfghjklzxcvbnm'
CAP = 'QWERTYUIOPASDFGHJKLZXCVBNM'
symbol = '~!@#$%^&*()_+/\[]{}?<>'#标点不全有可能执行到else不在判断区域

def isTrue(passwords,kinds): #新增一个判断函数
    for i in passwords:
        if i in kinds:
            return True
    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
    
    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    
        
'''---------------------------------
num = '0123456789'
cap = 'qwertyuiopasdfghjklzxcvbnm'
CAP = 'QWERTYUIOPASDFGHJKLZXCVBNM'
symbol = '~!@#$%^&*()_+/\[]{}?<>'
password = input('请输入您的密码:')
lenth = len(password)
while password.isspace() or lenth == 0:#这不是死循环么因为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
    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:
        print('密码等级为中')
    elif grade == 5 and lenth_flag == 2:
        print('密码等级高')
    break

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

使用道具 举报

 楼主| 发表于 2021-1-6 20:49:43 | 显示全部楼层
非常谢谢您!虽然看上去迷迷糊糊的,也是刚开始学,所以代码也会有一些很低级的错误,谢谢你的耐心讲解,我会多看几遍,把你的代码理清,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-6 21:21:01 | 显示全部楼层
洋洋痒 发表于 2021-1-6 08:37
我不知道你最后判断密码难度条件具体是什么,你可以根据要求再改

您好!非常感谢你的耐心回复,可能判断条件你不清楚
# 低级密码要求:
#   1. 密码由单纯的数字或字母组成
#   2. 密码长度小于等于8位
#
# 中级密码要求:
#   1. 密码必须由数字、字母或特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)任意两种组合
#   2. 密码长度不能低于8位
#
# 高级密码要求:
#   1. 密码必须由数字、字母及特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)三种组合
#   2. 密码只能由字母开头
#   3. 密码长度不能低于16位
然后刚才我运行了你的代码,就是即使有三种组合超过16位也是返回低等级,这里重新给n,c,C赋1,我也不太理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-6 21:22:53 | 显示全部楼层
qq1151985918 发表于 2021-1-6 09:22
我感觉还是有点小问题的给改了改,希望能有帮助

你好,这里死循环我不太明白, ==  不是判断吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-6 21:30:08 From FishC Mobile | 显示全部楼层
我好好整理一下给你好好讲一下,尽量详细,你稍等。也会讲一些我重新写的代码的改进,和你后来说的要求。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-1-6 21:40:15 | 显示全部楼层
qq1151985918 发表于 2021-1-6 21:30
我好好整理一下给你好好讲一下,尽量详细,你稍等。也会讲一些我重新写的代码的改进,和你后来说的要求。

好的,谢谢,我把你的代码多看几遍
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-6 21:56:10 | 显示全部楼层
小智1998 发表于 2021-1-6 21:40
好的,谢谢,我把你的代码多看几遍

我有几点疑问,不知道您方不方便解答
1:设置的判断函数的原因
2:isTrue(password,cap)请问这段代码是内置函数吗?是的话她的BIF名称是什么嘞?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-6 22:48:05 | 显示全部楼层
#这个是你原来发的代码
#我会在有问题的地方加 # 注释但不会去修改


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了
#妈妈再也不用担心你逻辑关系感不强了
#本来剩下的代码我准备也该你敲出来的
#一来我担心你等得着急
#而来我开头说过并不想完全让你按照我的思路进行
#下边就完全交给你自己了
#至于如何判断首字母是否是英文我想我也不需要再多说
#好了,分享到此结束,提前预祝你获得成功!
捕获.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-1-6 23:20:50 | 显示全部楼层
小智1998 发表于 2021-1-6 21:56
我有几点疑问,不知道您方不方便解答
1:设置的判断函数的原因
2:isTrue(password,cap)请问这段代码 ...

我在后边回复中有详细讲,至于那个函数,是我按照需求自己定义自己写的函数,并不是BIF,自己要学会根据自己需求量身定做属于自己需求的函数,来加快代码执行率和容易理解程度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-7 21:33:48 | 显示全部楼层
qq1151985918 发表于 2021-1-6 23:20
我在后边回复中有详细讲,至于那个函数,是我按照需求自己定义自己写的函数,并不是BIF,自己要学会根据 ...

感谢你的细心指导,今天琢磨了一天终于有点理解了,太谢谢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-7 22:18:29 From FishC Mobile | 显示全部楼层
小智1998 发表于 2021-1-7 21:33
感谢你的细心指导,今天琢磨了一天终于有点理解了,太谢谢了

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

使用道具 举报

发表于 2021-1-8 13:47:06 | 显示全部楼层

详细看完之后看到大佬最后一个用列表这个数据结构就很强能不能够用字典呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-8 14:01:37 From FishC Mobile | 显示全部楼层
LittlePigHo 发表于 2021-1-8 13:47
详细看完之后看到大佬最后一个用列表这个数据结构就很强能不能够用字典呢?

我们从可行性来讲,当然是可以的。但是从代码的简洁程度和实际效果来讲是不建议的。因为对于字典来说不仅仅有value还有key,对字典进行赋值和求和操作也要更显得复杂。所以我认为,可以用字典甚至字符串来实现,但是从效果讲确实是不建议。你可以自己动手试一试哪一种效果会更好。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 20:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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