鱼C论坛

 找回密码
 立即注册
查看: 2302|回复: 8

[已解决]python密码检测的提问

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

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

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

x
本人python小白,昨天尝试写一个检测密码复杂程度的脚本,其要求如下:

```python
# 密码安全性检查代码
#
# 低级密码要求:
#   1. 密码由单纯的数字或字母组成
#   2. 密码长度小于等于8位
#
# 中级密码要求:
#   1. 密码必须由数字、字母或特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)任意两种组合
#   2. 密码长度不能低于8位
#
# 高级密码要求:
#   1. 密码必须由数字、字母及特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)三种组合
#   2. 密码只能由字母开头
#   3. 密码长度不能低于16位
```
我想用三个if语句去判断密码中是否分别含有数字,字母和特殊字符,因为还没有学习到正则表达式,我就想用简单的语法来实现这个功能(后来知道了用for循环较好),但是不明白我这个写的有哪里不对(没有大写字母和字母开头的检测,因为暂时想先试一下愈发的正确性):

```python
passwd = input('请输入密码:')
weichang = len(passwd)
lei = 0  
num = 0
alp = 0
zif = 0
if '0' or '1' or '2'or '3' or '4' or '5' or '6' or '7' or '8' or '9' in passwd:
    num = 1
else :
    num = 0

if 'a' or 'b' or 'c' or 'd' or 'e' or'f'or 'g'or 'h' or 'i' or 'j' or 'k' or 'l' or 'm' or 'n' or 'o' or 'p' or 'q' or 'r' or 's' or 't' or 'u' or  'v' or 'w' or 'x' or 'y' or 'z' in 'passwd':
    alp = 1
else:
    alp = 0
if '~' or '!' or '@' or '#' or '$' or '%' or '^' or '&' or '*'or '(' or ')' or '_' or '=' or '-' or '/' or ',' or '.' or '?' or '<' or '>' or ';' or ':' or '[' or ']' or '{' or '}' or '|' or '\\' in 'passwd':
    zif = 1
else:
    zif = 0
```

```python
lei = num + alp +zif
print(weichang,num,alp,zif,lei)                #检测是哪一个数字计算错误
```

但是我检测了一下,发现无论密码是什么样的,num,alp,zif 这三个参数都为1,lei一直都是3,真的不太明白,请大神们指点一下,感谢!
最佳答案
2020-3-25 09:39:07
你这个程序对应你的这个结果啊
if 语句的判断条件中有or和in两种运算符,但是or的优先级要比in低,所以会优先进行in运算,然后在进行or运算,所以不管你输入什么if的条件都为真,所以那三个参数都为1

你也不能吧这些or用括号括起来,那样相当于是if True in passwd  这样就永远为假了

若是你真打算这样写,那就是能是
if '0' in passwd or '1' in passwd or '2' in passwd or '3' in passwd or '4' in passwd ……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-25 09:39:07 | 显示全部楼层    本楼为最佳答案   
你这个程序对应你的这个结果啊
if 语句的判断条件中有or和in两种运算符,但是or的优先级要比in低,所以会优先进行in运算,然后在进行or运算,所以不管你输入什么if的条件都为真,所以那三个参数都为1

你也不能吧这些or用括号括起来,那样相当于是if True in passwd  这样就永远为假了

若是你真打算这样写,那就是能是
if '0' in passwd or '1' in passwd or '2' in passwd or '3' in passwd or '4' in passwd ……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-25 10:31:47 | 显示全部楼层
sunrise085 发表于 2020-3-25 09:39
你这个程序对应你的这个结果啊
if 语句的判断条件中有or和in两种运算符,但是or的优先级要比in低,所以会 ...

谢谢大佬,但是还是不懂为什么优先in运算,if的条件就为真
如果密码里面没有一个数字,为什么 "if '0' or '1' or '2'or '3' or '4' or '5' or '6' or '7' or '8' or '9' in passwd:"条件会为1呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-25 10:37:53 | 显示全部楼层
孜然爱爱 发表于 2020-3-25 10:31
谢谢大佬,但是还是不懂为什么优先in运算,if的条件就为真
如果密码里面没有一个数字,为什么 "if '0' o ...

'0' or '1' or '2'or '3' or '4' or '5' or '6' or '7' or '8' or '9' in passwd

or运算你应该知道吧,各项有一个为真,则结果为真。
你这个逻辑运算式有10项,前面九项都为真啊。由于短路逻辑,只看到'0' ,发现为True,后面的就都不会再去判断了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-25 11:13:12 | 显示全部楼层
sunrise085 发表于 2020-3-25 10:37
'0' or '1' or '2'or '3' or '4' or '5' or '6' or '7' or '8' or '9' in passwd

or运算你应该知道吧 ...

也就是说or两边的"1","2"……都会被当成逻辑语句,从而得到一个布尔类型的值Ture,而没有被当成字符串去处理?
按照这个规律的话,程序首先会判断: '0' or '1' ,所以为Ture,由于短路逻辑,后面的8个数不再判断,所以条件为真,是这样吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-25 11:28:37 | 显示全部楼层
孜然爱爱 发表于 2020-3-25 11:13
也就是说or两边的"1","2"……都会被当成逻辑语句,从而得到一个布尔类型的值Ture,而没有被当成字符串去 ...

是这个意思
但是有一点你说的不对,
'0'就已经为True了,就连'1'都不会判断的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-25 11:46:15 | 显示全部楼层
sunrise085 发表于 2020-3-25 11:28
是这个意思
但是有一点你说的不对,
'0'就已经为True了,就连'1'都不会判断的

'0'的逻辑值不应该是False吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-25 12:00:08 | 显示全部楼层
孜然爱爱 发表于 2020-3-25 11:46
'0'的逻辑值不应该是False吗

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

使用道具 举报

 楼主| 发表于 2020-3-25 20:58:17 | 显示全部楼层
sunrise085 发表于 2020-3-25 12:00
这是字符'0'  不是数字0

所以说字符'0'的逻辑值也为1?好神奇啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-3-15 03:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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