python从a-zA-Z0-9特殊字符中生成指定数量的随机字符密码的多层for循环跳出

 

  需求:生成一批随机密码,密码要包含大写字母、小写字母、数字和特殊字符,且不能重复。

    思路一:想着先生成密码,然后用各字符去检查是否存在,使用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('不包含特殊字符')

 ...............................................................................................................................................................................................................................................................................

  高级形态:集合交集的方法,一行代码搞定。

import string
l = ['abc','123','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

 

posted @ 2019-09-20 16:55  会武术的跳跳虎  阅读(913)  评论(0编辑  收藏  举报