师从‘百测’besttest
今日牛老师布置了一个作业,生成一个随机密码,且要包含大写字母、小写字母、数字和特殊字符,且不能重复。
想着先生成密码,然后用各字符去检查是否存在,使用for嵌套循环。
1 import string 2 l = ['abc','123','123!@#qweA'] 3 i = 0 4 n = 3 5 while i < n: 6 # 从a-zA-Z0-9特殊字符中生成指定数量的随机字符 7 #pwd = ''.join(random.sample(string.ascii_letters + string.digits + string.punctuation, 8)) 8 #使用手动输入测试脚本,请正确输入 9 pwd = input('输入需要测试的密码:') 10 print(pwd) 11 if pwd not in l: 12 for k in string.ascii_lowercase: 13 if k in pwd: #判断密码中是否有小写字母 14 for o in string.ascii_uppercase: 15 if o in pwd: #判断密码中是否有大写字母 16 for p in string.digits: 17 if p in pwd: #判断密码中是否有数字 18 for q in string.punctuation: 19 if q in pwd: #判断密码中是否有特殊字符 20 l.append(pwd) 21 i = i + 1 22 break 23 else: 24 print('没有特殊字符') 25 break 26 else: 27 print('没有数字') 28 break 29 else: 30 print('没有大写字母') 31 break 32 else: 33 print('没有小写字母') 34 break 35 else: 36 print('密码已存在') 37 continue
测试发现,当3、4层for判断要跳出时,怎么写都不能完美解决,有些教程建议使用goto,由于是新手还不准备用这么高深的东西,放弃了。
查了下好像Python语法确实有这个缺陷,最后想了个笨方法结局,广大猿友朋友如果有好的办法请指导!
1 import string 2 l = ['abc','123','123!@#qweA'] 3 i = 0 4 n = 3 5 while i < n: 6 # 从a-zA-Z0-9特殊字符中生成指定数量的随机字符 7 # pwd = ''.join(random.sample(string.ascii_letters + string.digits + string.punctuation, 8)) 8 # 使用手动输入pwd测试代码 9 pwd = input('请输入测试密码:') 10 count = 0 11 if pwd not in l: 12 count = count +1 13 else: 14 print('密码已存在') 15 continue 16 if count == 1: 17 for o in string.ascii_lowercase: 18 if o in pwd: 19 count = count + 1 20 break 21 else: 22 print('不包含小写字母') 23 if count == 2: 24 for p in string.ascii_uppercase: 25 if p in pwd: 26 count = count +1 27 break 28 else: 29 print('不包含大写字母') 30 if count == 3: 31 for q in string.digits: 32 if q in pwd: 33 count = count + 1 34 break 35 else: 36 print('不包含数字') 37 if count ==4: 38 for w in string.punctuation: 39 if w in pwd: 40 l.append(pwd) 41 i = i + 1 42 break 43 else: 44 print('不包含特殊字符')