孙赖 发表于 2020-9-3 15:07:52

今天在写小甲鱼课后作业的时候又出现了一个问题 求帮助

answer=False
print('--------密码安全性检查程序-------')
temp=input('请键入您的密码')
while   len(temp)<16 and temp.isdigit()==True and temp.isalpha==True and answer==False:
    iflen(temp)<16:
      print('您的密码小于16位,安全强度低,请更改')
      temp=input('在此键入您的新密码')
    iftemp.isdigit()==True:
      print('您的密码安全评级为:低')
      print('请以以下方法提升您的密码安全级别')
      print('1,密码必须由数字,字母及特殊字符三种组合')
      print('2,密码只能由字母开头')
      while   temp.isdigit()==True:
            print('您的密码不符合要求')
            temp=input('请键入您的新密码')
    iftemp.isalpha==True:
      print('您的密码中不能只含有字母')
      while   temp.isalpha==True:
            print('密码必须由数字,字母及特殊字符三种组合')
            temp=input('在此键入您的新密码')
    iftemp.isalpha==False:
      print('您的密码未以字母为开头')
      while   temp.isalpha==False:
            print('密码只能由字母开头')
            temp=input('在此键入您的新密码')
    for i in temp:
      if i in r"'~!@#$%^&*()_=-/,.?<>;:[]{}|\'":
            answer=True
      else:
            answer=False
    ifanswer==False:
      print('您的密码安全评级为:低')
      print('请以以下方法提升您的密码安全级别')
      print('密码必须由数字,字母及特殊字符三种组合')
      while   answer==False:
            print('密码中必须包含有合法的字符')
            print('该程序所支持的合法字符有:')
            print(r"'~!@#$%^&*()_=-/,.?<>;:[]{}|\'")
            temp=input('在此键入您的新密码')
print('您的密码安全评级为:高')
print('请继续保持')
   以上是代码 想做一个程序可以看密码强度 要求是必须大于16位 需要有字母和数字的混合且第一个为字母 带有~!@#$%^&*()_=-/,.?<>;:[]{}|\中的任意符号 我写的这个跑起来随便输入一个都是直接到了最后 好像第一个while之后的所有都没有进行 怎么修改一下啊 各位大佬{:5_100:}

sunrise085 发表于 2020-9-3 15:26:54

第四行,while循环的条件,第三部分 isalpha后面没有写小括号,导致不管你输入什么都不可能进入while循环
另外,你再仔细看看你的while循环的这四个条件是否合适

孙赖 发表于 2020-9-3 16:03:35

sunrise085 发表于 2020-9-3 15:26
第四行,while循环的条件,第三部分 isalpha后面没有写小括号,导致不管你输入什么都不可能进入while循环
...

已经加上了 但是好像还是不太行 不管我输入怎样的密码 都是直接显示最后的评级为高
想要让len(temp)<16 and temp.isdigit()==True and temp.isalpha()==True and answer==False:这四个条件同时不满足时直接进入最后 如果出现任意一个满足的情况就进入下面的循环 但是怎样才能达到这样的效果啊 自己看了好久也每台弄明白{:5_104:}

sunrise085 发表于 2020-9-3 16:10:26

孙赖 发表于 2020-9-3 16:03
已经加上了 但是好像还是不太行 不管我输入怎样的密码 都是直接显示最后的评级为高
想要让len(temp)

用or
while len(temp)<16 or temp.isdigit()==True or temp.isalpha()==True or answer==False

另外,你的这个answer,一开始是直接赋值的啊,都没有进行判断哎,万一人家第一次键入的密码就含有特殊字符呢,那你这程序岂不是冤枉人家了啊

孙赖 发表于 2020-9-3 16:48:18

sunrise085 发表于 2020-9-3 16:10
用or




谢谢大佬 好像确实是应该用or 用了or程序可以进行了 但是又出现了一个问题 就是下面的for循环走不通啊好像 这个我是没有用对吗{:5_104:}

疾风怪盗 发表于 2020-9-3 16:48:55

把你代码改成这样了,试试看
answer = False
print('--------密码安全性检查程序-------')

while answer == False:
    temp = input('请键入您的密码')
    if len(temp) < 2:
      print('您的密码小于16位,安全强度低,请更改')
      answer = False
      continue
    elif temp.isdigit() == True:
      print('您的密码安全评级为:低')
      print('请以以下方法提升您的密码安全级别')
      print('1,密码必须由数字,字母及特殊字符三种组合')
      print('2,密码只能由字母开头')
      print('您的密码不符合要求')
      answer = False
      continue
    elif temp.isalpha() == False:
      print('您的密码未以字母为开头')
      print('密码只能由字母开头')
      answer = False
      continue
    elif temp.isalpha() == True:
      print('您的密码中不能只含有字母')
      print('密码必须由数字,字母及特殊字符三种组合')
      answer = False
      continue
    else:
      standard = r"'~!@#$%^&*()_=-/,.?<>;:[]{}|\'"
      for i in temp:
            answer = True if standard.find(i) > 0 else False

      if answer == True:
            print('您的密码安全评级为:高')
            print('请继续保持')
            break
      else:
            print('您的密码安全评级为:低')
            print('请以以下方法提升您的密码安全级别')
            print('密码必须由数字,字母及特殊字符三种组合')
            print('密码中必须包含有合法的字符')
            print('该程序所支持的合法字符有:')
            print(r"'~!@#$%^&*()_=-/,.?<>;:[]{}|\'")
            continue

孙赖 发表于 2020-9-3 17:18:58

疾风怪盗 发表于 2020-9-3 16:48
把你代码改成这样了,试试看

刚刚跑了一下好像还是不太行 密码中加了特殊符号但是还是会提醒需要特殊符号{:5_104:}

孙赖 发表于 2020-9-3 17:20:50

疾风怪盗 发表于 2020-9-3 16:48
把你代码改成这样了,试试看

请键入您的密码a=1111111111111111111111111111111111111111111111
您的密码安全评级为:低
请以以下方法提升您的密码安全级别
密码必须由数字,字母及特殊字符三种组合
密码中必须包含有合法的字符
该程序所支持的合法字符有:
'~!@#$%^&*()_=-/,.?<>;:[]{}|\'
请键入您的密码a11111111111111111111111111111111=
您的密码安全评级为:高
请继续保持
这是什么情况啊 按说这两种输入的密码不应该是一样的吗

疾风怪盗 发表于 2020-9-3 17:21:13

孙赖 发表于 2020-9-3 17:18
刚刚跑了一下好像还是不太行 密码中加了特殊符号但是还是会提醒需要特殊符号

用的我写的代码么?不会啊,我试过,能识别出特殊符号啊

疾风怪盗 发表于 2020-9-3 17:24:59

本帖最后由 疾风怪盗 于 2020-9-3 17:27 编辑

孙赖 发表于 2020-9-3 17:20
请键入您的密码a=1111111111111111111111111111111111111111111111
您的密码安全评级为:低
请以以下方 ...

      standard = r"'~!@#$%^&*()_=-/,.?<>;:[]{}|\'"
      for i in temp:
            if standard.find(i) > 0:
                answer = True
                break
            else:
                answer = False
这段改成这样
我之前都是把特殊符号写在最后,之前那个循环,最后一位是数字时重新判断为Flase了

sunrise085 发表于 2020-9-3 17:34:33

疾风怪盗 发表于 2020-9-3 16:48
把你代码改成这样了,试试看

你这样写的确不对
这样写的话,最终answer的值是看最后一个字符是不是在standard中,与前面的其他字符就没关系了,因为没循每循环一次,answer就改变一次

疾风怪盗 发表于 2020-9-3 17:36:05

sunrise085 发表于 2020-9-3 17:34
你这样写的确不对
这样写的话,最终answer的值是看最后一个字符是不是在standard中,与前面的其他字符就 ...

本来想错了,想写的简单点
现在改过来了,加个break退出应该就没问题了

孙赖 发表于 2020-9-3 18:15:02

疾风怪盗 发表于 2020-9-3 17:36
本来想错了,想写的简单点
现在改过来了,加个break退出应该就没问题了

在哪加个break退出呢 我也发现这个问题了就是最后的结果好像只看最后一次

疾风怪盗 发表于 2020-9-3 18:17:44

本帖最后由 疾风怪盗 于 2020-9-3 18:25 编辑

孙赖 发表于 2020-9-3 18:15
在哪加个break退出呢 我也发现这个问题了就是最后的结果好像只看最后一次

      standard = r"'~!@#$%^&*()_=-/,.?<>;:[]{}|\'"
      for i in temp:
            if standard.find(i) > 0:
                answer = True
                break
            else:
                answer = False
               

就是这一段,改成这样就行了,一旦找到一个符合的就break,后面的就不用管了

但是还有个问题,如果有一个合法字符,再来一个非法字符,就无法判断了
你要做这个判断密码,最好还是用正则表达式来匹配吧

疾风怪盗 发表于 2020-9-3 18:57:01

孙赖 发表于 2020-9-3 18:15
在哪加个break退出呢 我也发现这个问题了就是最后的结果好像只看最后一次

import re
answer = False
print('--------密码安全性检查程序-------')

while answer == False:
    temp = input('请键入您的密码')
    if len(temp) < 2:
      print('您的密码小于16位,安全强度低,请更改')
      answer = False
      continue
    elif temp.isdigit() == True:
      print('您的密码安全评级为:低')
      print('请以以下方法提升您的密码安全级别')
      print('1,密码必须由数字,字母及特殊字符三种组合')
      print('2,密码只能由字母开头')
      print('您的密码不符合要求')
      answer = False
      continue
    elif temp.isalpha() == False:
      print('您的密码未以字母为开头')
      print('密码只能由字母开头')
      answer = False
      continue
    elif temp.isalpha() == True:
      print('您的密码中不能只含有字母')
      print('密码必须由数字,字母及特殊字符三种组合')
      answer = False
      continue
    else:
      standard = '[~!@#$%^&*()_=-\\\/\\,.?\\<\\>;:\\[\\]\\{\\}\\|a-z0-9A-Z]+'
      #print(re.fullmatch(standard, temp))
      if re.fullmatch(standard, temp) !=None:
            print('您的密码安全评级为:高')
            print('请继续保持')
            answer = True
            break
      else:
            print('您的密码安全评级为:低')
            print('请以以下方法提升您的密码安全级别')
            print('密码必须由数字,字母及特殊字符三种组合')
            print('密码中必须包含有合法的字符')
            print('该程序所支持的合法字符有:')
            print(r"'~!@#$%^&*()_=-/,.?<>;:[]{}|\'")
            answer = False
            continue


正则不太会写,不知道写的对不对,如果用正则就可以匹配出非法字符了

孙赖 发表于 2020-9-3 19:12:02

疾风怪盗 发表于 2020-9-3 18:57
正则不太会写,不知道写的对不对,如果用正则就可以匹配出非法字符了

太感谢了 已经懂了
页: [1]
查看完整版本: 今天在写小甲鱼课后作业的时候又出现了一个问题 求帮助