python - 该变量在我的方法中设置为 false,一旦方法运行,它应该更改为 True。但它没有
问题描述
def checkPassword (password):
upper = False
lower = False
number = False
special = False
for i in range (len(password)):
if ((ord(password[i]) >= 65) and (ord(password[i]) <= 90)):
upper = True
elif ((ord(password[i]) >= 97) and (ord(password[i]) <= 122)):
lower = True
elif ((ord(password[i]) >= 0) and (ord(password[i]) <= 9)):
number = True
elif ((ord(password[i]) >= 0) and (ord(password[i]) <= 9)) :
special = True
if ((upper == True) and (lower == True) and (number == True) and (special == True)):
print ("Your password is strong")
else:
print ("Your password is not strong. Make sure to make it a mix between upper and lower case letters, number, and special characters.")
def main():
password = input("Enter a password: ")
checkPassword (password)
输入:
running99*FAST
输出:
Your password is not strong. Make sure to make it a mix between upper and lower case letters, number, and special characters.
问题:这个密码应该作为强密码返回,但它没有。老实说,我不知道我做错了什么。
PS 我正在使用 ASCII 表来识别字母是小写、大写还是数字以及特殊字符。
解决方案
您的电话号码和特别支票无效。所以我用isdigit()
数字代替。另外,什么是特殊字符?如果特殊字符不是小写/大写字符和数字,那么else
最后应该没问题。
upper = False
lower = False
number = False
special = False
password = "running99*FAST"
for i in range (len(password)):
if ((ord(password[i]) >= 65) and (ord(password[i]) <= 90)):
upper = True
elif ((ord(password[i]) >= 97) and (ord(password[i]) <= 122)):
lower = True
elif password[i].isdigit():
number = True
else:
special = True
print (upper,lower,number,special)
if ((upper == True) and (lower == True) and (number == True) and (special == True)):
print ("Your password is strong")
else:
print ("Your password is not strong. Make sure to make it a mix between upper and lower case letters, number, and special characters.")
输出:
True True True True
Your password is strong
对于正则表达式版本:
import re
password = "running99*FAST"
def check(password):
for test in [('lower','[a-z]'),('upper','[A-Z]'),('number','[0-9]'),('special','[^A-Za-z0-9]')]:
if len(re.sub(test[1],"",password)) == len(password):
return False, test[0]
else: return True
print (check(password))
如果正则表达式替换后的长度等于替换前的长度(意味着不存在字符类型),此代码将返回 False。一次违规返回。
以及报告多次违规的 oneliner:
import re
password = "runnFAST"
def check(password):
return [(False, t[0]) if len(re.sub(t[1],"",password)) == len(password) else (True, t[0]) for t in [('lower','[a-z]'),('upper','[A-Z]'),('number','[0-9]'),('special','[^A-Za-z0-9]')]]
print (check(password))
输出:
[(True, 'lower'), (True, 'upper'), (False, 'number'), (False, 'special')]
推荐阅读
- python-3.x - YouCompleteMe 不可用:需要使用 Python (3.6.0+) 支持编译的 Vim
- aws-lambda - 具有 lambda-proxy 集成和 API 模型验证的无服务器框架
- python - 在 Matplotlib 中管理同一子图上多行的刻度
- android - audioplayers 包不能在三星手机(A8 和其他一些)上播放音频,但适用于模拟器和其他品牌手机
- api - 需要 Workday REST API 端点帮助
- python - 查找列名并在整个列值中保留某些字符串
- html - Shrinking div's background color with CSS
- postgresql - 易碎测试查询
- r - R:不能将“闭包”类型强制为“双”类型的向量(时间序列预测)
- javascript - 使用 fetch() 登录后如何重定向用户