师从‘百测’besttest
今日牛老师布置了一个作业,生成一个随机密码,且要包含大写字母、小写字母、数字和特殊字符,且不能重复。
想着先生成密码,然后用各字符去检查是否存在,使用for嵌套循环。
import string
l = ['abc','','123!@#qweA']
i = 0
n = 3
while i < n:
# 从a-zA-Z0-9特殊字符中生成指定数量的随机字符
#pwd = ''.join(random.sample(string.ascii_letters + string.digits + string.punctuation, 8))
#使用手动输入测试脚本,请正确输入
pwd = input('输入需要测试的密码:')
print(pwd)
if pwd not in l:
for k in string.ascii_lowercase:
if k in pwd: #判断密码中是否有小写字母
for o in string.ascii_uppercase:
if o in pwd: #判断密码中是否有大写字母
for p in string.digits:
if p in pwd: #判断密码中是否有数字
for q in string.punctuation:
if q in pwd: #判断密码中是否有特殊字符
l.append(pwd)
i = i + 1
break
else:
print('没有特殊字符')
break
else:
print('没有数字')
break
else:
print('没有大写字母')
break
else:
print('没有小写字母')
break
else:
print('密码已存在')
continue
测试发现,当3、4层for判断要跳出时,怎么写都不能完美解决,有些教程建议使用goto,由于是新手还不准备用这么高深的东西,放弃了。
查了下好像Python语法确实有这个缺陷,最后想了个笨方法结局,广大猿友朋友如果有好的办法请指导!
import string
l = ['abc','','123!@#qweA']
i = 0
n = 3
while i < n:
# 从a-zA-Z0-9特殊字符中生成指定数量的随机字符
# pwd = ''.join(random.sample(string.ascii_letters + string.digits + string.punctuation, 8))
# 使用手动输入pwd测试代码
pwd = input('请输入测试密码:')
count = 0
if pwd not in l:
count = count +1
else:
print('密码已存在')
continue
if count == 1:
for o in string.ascii_lowercase:
if o in pwd:
count = count + 1
break
else:
print('不包含小写字母')
if count == 2:
for p in string.ascii_uppercase:
if p in pwd:
count = count +1
break
else:
print('不包含大写字母')
if count == 3:
for q in string.digits:
if q in pwd:
count = count + 1
break
else:
print('不包含数字')
if count ==4:
for w in string.punctuation:
if w in pwd:
l.append(pwd)
i = i + 1
break
else:
print('不包含特殊字符')
...............................................................................................................................................................................................................................................................................
今天牛老师教了个集合交集的方法,一行代码搞定。
import string
l = ['abc','','123!@#qweA']
i = 0
n = 3
while i < n:
# 从a-zA-Z0-9特殊字符中生成指定数量的随机字符
#pwd = ''.join(random.sample(string.ascii_letters + string.digits + string.punctuation, 8))
#使用手动输入测试脚本,请正确输入
pwd = input('输入需要测试的密码:')
print(pwd)
if pwd not in l:
if (set(pwd) & set(string.ascii_letters)) and (set(pwd) & set(string.ascii_uppercase)) and \
(set(pwd) & set(string.digits)) and (set(pwd) & set(string.punctuation)):
i = i + 1
print('成功一个')
else:
print('密码不符合要求')
else:
print('密码已存在')
continue