鱼C论坛

 找回密码
 立即注册
查看: 1559|回复: 14

[已解决]求 问 第14讲最后一题这样写为什么出错

[复制链接]
发表于 2020-3-5 03:25:05 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 sanmylc 于 2020-3-5 13:11 编辑

def c():
     print("1. 密码必须由数字、字母及特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)三种组合\n2.密码只能由字母开头\n3.密码长度不能低于16位")


number ="0123456789"
st = "qwertyuiopasdfghjkzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"
tf = r"~!@#$%^&*()_=-/,.?<>;:[]{}\|"
val = input("请输入需要检查的密码组合:")
leng =len(val)
if (leng > 16 and val in number and
    val in st and val in tf and
    val.starswith(val in st)):
     print("您的密码安全等级评定为:高")

elif (8 < leng <= 16   and
      val in number  and (val in st or tf)) :
     print("您的密码安全等级评定为:中")
     c()
elif leng <= 8 and  (val in number or st):
     print("您的密码安全等级评定为:低")               
     c()
elif passwd.isspace() or leng == 0 :
     print("输入为空")
else:
     print("请输入为有效数字!")




以下是程序运行:
请输入需要检查的密码组合:ertyy155
您的密码安全等级评定为:低
1. 密码必须由数字、字母及特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)三种组合
2.密码只能由字母开头
3.密码长度不能低于16位
>>>
=============== RESTART: C:\Users\Administrator\Desktop\密码评级程序.py ==============
请输入需要检查的密码组合:1546615134
请输入为有效数字!
>>>
=============== RESTART: C:\Users\Administrator\Desktop\密码评级程序.py ==============
请输入需要检查的密码组合:15454getr
请输入为有效数字!
>>>
=============== RESTART: C:\Users\Administrator\Desktop\密码评级程序.py ==============
请输入需要检查的密码组合:fgfgf1546546
请输入为有效数字!
>>>
=============== RESTART: C:\Users\Administrator\Desktop\密码评级程序.py ==============
请输入需要检查的密码组合:tert1235446874df%1561
请输入为有效数字!
>>>
最佳答案
2020-3-5 17:08:58
sanmylc 发表于 2020-3-5 13:07
确实谢谢  但是程序 判断为什么会出问题


你的代码中,有好几个错误:
1.把输入的整个密码val直接用in来判断是否在三个组合里,当然结果是False,除非正好和组合的顺序一样的密码,比如'qwert'或者'123456'才可能获得一个True。正确的做法是用迭代的方法把密码每个字符分开来做判断。
2.例如,val in st or tf 这样的代码,首先运算val in st,结果为False,然后运算是False or tf,结果就是返回tf的值,根本不是你想要的结果,正确的应该是val in (st or tf )。
3.条件覆盖不全,比如密码长于16位但不符合高的,会错过下面的判断而去了else,显然这是不对的结果。
ps:你只要输入小于等于8位的密码,必定会判断为低,你想想为什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-5 04:10:07 | 显示全部楼层
我的运行没有问题,可能的原因是你没有在首行加上以下代码,中文需要
# -*- coding: utf-8 -*-
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-5 09:50:59 | 显示全部楼层
你的代码中st变量的字母表里面差了一个小写的l。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-5 13:07:08 | 显示全部楼层
ouyunfu 发表于 2020-3-5 04:10
我的运行没有问题,可能的原因是你没有在首行加上以下代码,中文需要
# -*- coding: utf-8 -*-

主要是程序判定  出了问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-5 13:07:51 | 显示全部楼层
txxcat 发表于 2020-3-5 09:50
你的代码中st变量的字母表里面差了一个小写的l。

确实谢谢  但是程序 判断为什么会出问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-5 14:56:40 | 显示全部楼层
为什么会出现跳过判断 难道是逻辑错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-5 15:21:03 | 显示全部楼层
那个题本身就有问题,高中低 三挡 按照划分 有重复有遗漏 你用韦恩图看看;此题不建议做
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-3-5 17:08:58 | 显示全部楼层    本楼为最佳答案   
sanmylc 发表于 2020-3-5 13:07
确实谢谢  但是程序 判断为什么会出问题


你的代码中,有好几个错误:
1.把输入的整个密码val直接用in来判断是否在三个组合里,当然结果是False,除非正好和组合的顺序一样的密码,比如'qwert'或者'123456'才可能获得一个True。正确的做法是用迭代的方法把密码每个字符分开来做判断。
2.例如,val in st or tf 这样的代码,首先运算val in st,结果为False,然后运算是False or tf,结果就是返回tf的值,根本不是你想要的结果,正确的应该是val in (st or tf )。
3.条件覆盖不全,比如密码长于16位但不符合高的,会错过下面的判断而去了else,显然这是不对的结果。
ps:你只要输入小于等于8位的密码,必定会判断为低,你想想为什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-6 03:04:32 | 显示全部楼层
txxcat 发表于 2020-3-5 17:08
你的代码中,有好几个错误:
1.把输入的整个密码val直接用in来判断是否在三个组合里,当然结果是False ...

经过您的指点我写出来了 感谢!
def C():
     print("1. 密码必须由数字、字母及特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)三种组合\n2.密码只能由字母开头\n3.密码长度不能低于16位")

def m(ou):
     print("您的密码等级为:%s"%ou)

def P(x,n):
    for i in range(len(x)):
        if x in n:
            return True
        else:
            continue
     
number ="0123456789"
st = "qwertyuiopasfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"
tf = r"~!@#$%^&*()_=-/,.?<>;:[]{}\|"

Hi = "高"
Mi = "中"
Li = "低"

val = input("请输入需要检查的密码组合: ")
leng  = len(val)

if leng > 16:
     if P(val,number) and P(val,st) and P(val,tf) and (val[0] in st):
          m(Hi)
          print("请继续保持")

elif 16 >= leng >8:
     if P(val,number) and (P(val,st) or P(val,tf)):
          m(Mi)
          C()
     else:
          if leng <= 8:
               m(Li)
               C()
          else:
               m(Li)
               C()   
         
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-6 03:09:19 | 显示全部楼层
TJBEST 发表于 2020-3-5 15:21
那个题本身就有问题,高中低 三挡 按照划分 有重复有遗漏 你用韦恩图看看;此题不建议做

确实 这个判断条件混乱  但是终于搞明白 成员操作符 in 不是用来判断一个字符串是否包含另外一个字符串
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 11:12:42 | 显示全部楼层
in 是可以判断字符串是否包含在另一个字符串中的,例如:
>>> a='abc'
>>> b='abcdefg'
>>> a in b
True
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-6 13:40:15 | 显示全部楼层
txxcat 发表于 2020-3-6 11:12
in 是可以判断字符串是否包含在另一个字符串中的,例如:
>>> a='abc'
>>> b='abcdefg'

>>> a="abc"
>>> b="ac"
>>> a in b
False
然而这样就会返回false
还是不能整体拿来判断
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 14:53:44 | 显示全部楼层
sanmylc 发表于 2020-3-6 13:40
>>> a="abc"
>>> b="ac"
>>> a in b

b是a的子集,a当然不在b里,所以是False,反过来b in a就是True了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-6 21:08:47 | 显示全部楼层
txxcat 发表于 2020-3-6 14:53
b是a的子集,a当然不在b里,所以是False,反过来b in a就是True了

>>> a="abc"
>>> b="ac"
>>> b in a
False
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 22:33:14 | 显示全部楼层
本帖最后由 txxcat 于 2020-3-6 23:04 编辑
sanmylc 发表于 2020-3-6 21:08
>>> a="abc"
>>> b="ac"
>>> b in a


看错了,是ac,不是ab……
想了一下,可以用set来做这个判断:
  1. a="abc"
  2. b="ac"
  3. aa=set(a)
  4. bb=set(b)
  5. bb.issubset(aa)
复制代码

不过似乎在本题不适用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 02:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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