|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
请写一个密码安全性检查的代码代码:check.py
# 密码安全性检查代码
#
# 低级密码要求:
# 1. 密码由单纯的数字或字母组成
# 2. 密码长度小于等于8位
#
# 中级密码要求:
# 1. 密码必须由数字、字母或特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)任意两种组合
# 2. 密码长度不能低于8位
#
# 高级密码要求:
# 1. 密码必须由数字、字母及特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)三种组合
# 2. 密码只能由字母开头
# 3. 密码长度不能低于16位
symbols = r'''`!@#$%^&*()_+-=/*{}[]\|'";:/?,.<>'''
chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
nums = '0123456789'
passwd = input('请输入需要检查的密码组合:')
# 判断长度
length = len(passwd)
while (passwd.isspace() or length == 0) :
passwd = input("您输入的密码为空(或空格),请重新输入:")
length = len(passwd)
if length <= 8:
flag_len = 1
elif 8 < length < 16:
flag_len = 2
else:
flag_len = 3
flag_con = 0
# 判断是否包含特殊字符
for each in passwd:
if each in symbols:
flag_con += 1
break
# 判断是否包含字母
for each in passwd:
if each in chars:
flag_con += 1
break
# 判断是否包含数字
for each in passwd:
if each in nums:
flag_con += 1
break
# 打印结果
while 1 :
print("您的密码安全级别评定为:", end='')
if flag_len == 1 or flag_con == 1 :
print("低")
elif flag_len == 3 and flag_con == 3 and (passwd[0] in chars):
print("高")
print("请继续保持")
break
else:
print("中")
print("请按以下方式提升您的密码安全级别:\n\
\t1. 密码必须由数字、字母及特殊字符三种组合\n\
\t2. 密码只能由字母开头\n\
\t3. 密码长度不能低于16位")
break
==========================================================================================================
在我自己做的时候碰到几个点 不甚明了, 欢迎大牛们不吝赐教;
1, 我 听完课 觉得 遍历 循环是要在 数组或者列表,或者元祖里才可以, 所以我把 symbols , chars, nums 都做成了 列表, 中间有逗号隔开每个元素,结果反而程序跑步起来, 倒是 答案中 一个字符串,反倒是能跑。 不明白其中的原理, str 单引号里的不是应该是个整体吗? 为何却可以遍历?
2 break 的 位置,
for each in passwd:
if each in symbols:
flag_con += 1
break # 我 放在了跟 if 同层级,而不是包进去,结果跑步起来。 何解? 觉得逻辑上没差的,都是跳出一级循环吗。
1,我听完课觉得遍历循环是要在数组或者列表,或者元祖里才可以,答案中为何字符串却可以遍历?
遍历循环遍历的是可迭代对象,而字符串就是可迭代对象,而不止列表,元组,字典,而且 Python 没有数组的概念,除非你导入 numpy 模块才有 array 类型的值
对一个字符串来说,每一个字符都算他的元素,而对列表来说,是列表中的每一个字符串都是他的元素,而遍历就是将可迭代对象的元素一个个遍历循环下去
除非你在列表中是以一个字符为单位的元素,而不是多个字符为单位的字符串,这样就可以正常判断密码中的字符是否包含在列表中,因为 for 循环过程中是循环 password 中一个一个的字符
否则列表是一整个字符串,只有在整个字符串相对应的时候,字符串才算在列表中
举个例子:- >>> temp = ['aa'] # 列表中的元素的 'aa'
- >>> 'a' in temp # 列表中没有元素 'a'
- False
- >>> 'aa' in temp # 列表中有元素 'aa'
- True
复制代码
2,我放在了跟 if 同层级,而不是包进去,结果跑步起来。 何解? 觉得逻辑上没差的,都是跳出一级循环吗。
这里的 if 条件里的是 flag_con += 1 ,你想想如果放 if 内部,那肯定只要 if 成立一次就退出这个循环了
而你如果把 break 放循环外,那么你 for 第一次循环就退出了,所以你只遍历循环了一个字符,不管是什么答案,也只循环一次退出,逻辑差别很大
一个只有在条件成立了才退出,另一个一开始循环第一次就退出。
|
|