首页 > 解决方案 > 为什么我的代码在具有所有必需前提时不打印密码?

问题描述

`f=0
import random
chars_lower= "abcdefghijklmnopqrstuvwxyz"
chars_upper= "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
numbers= "0123456789"
symbols= "¡!¿?<>$#@%&€*+-"
password_length= 8
chars= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789¡!¿?<>$#@%&€*+-"
while f==0:
    password_random= "".join(random.sample(chars, password_length))
    e= 0
    for i in chars_lower:
        for j in chars_upper:
            for n in numbers:
                for k in symbols:
                    if i in password_random and j in password_random and k in password_random and n in password_random:
                        e=1
                        f=1
if e==1:
    print(password_random)`

创建自动密码,以防用户在 3 次尝试后未正确写入密码

t=0
list_lower=[]
list_upper=[]
list_numbers=[]
list_symbols=[]
for i in chars_lower:
    list_lower.append(i)
for j in chars_upper:
    list_upper.append(j)
for n in numbers:
    list_numbers.append(n)
for k in symbols:
    list_symbols.append(k)
for i in range(3):
    name= input("Write a name that contains 8 characters and hit ENTER: ")
    password= input("Write a password that contains 8 characters and hit ENTER: ")
    if len(name)==8 and len(password)==8: 
        for i in password:
            if i in list_lower:
                for j in password:
                    if j in list_upper:
                        for n in password:
                            if n in list_numbers:
                                for k in password:
                                    if k in list_symbols:
                                        t=1
                                    else:
                                        t=2
                            else:
                                t=2
                    else:
                        t=2
            else:
                t=2
    else:
        t=2
    if t==1:
        break

if t==1:
    print("Your user name is",name,"and your password is",password)
elif t==2:
    print("You have already used all your chances to write your password, so your automatic password is:",password_random)

此代码要求用户输入一个包含 8 个字符的用户名和一个包含 8 个字符且至少一个大写、一个小写、一个数字和一个符号的密码。假设满足所有这些前提时,它应该打印用户名和密码。然而,事实并非如此。

标签: python-3.xpasswords

解决方案


正如评论的那样,即使if满足 - 条件,您也不会打破“密码检查”内的任何循环。所以每个循环都会遍历密码中的所有字符。试着print在你的代码中加入一些语句,看看发生了什么。一般来说,嵌套如此多的循环和条件变得几乎不可能阅读。因此,我建议看看 Python 的anyall

使用这些,您可以重构您的密码检查,例如

def check_pw(pw):
    chars = "abcdefghijklmnopqrstuvwxyz"
    numbers = "0123456789"
    symbols = "¡!¿?<>$#@%&€*+-"
    contains_lower = any(l in pw for l in chars)
    contains_upper = any(l in pw for l in chars.upper())
    contains_nbr = any(l in pw for l in numbers)
    contains_sym = any(l in pw for l in symbols)
    return all((contains_lower, contains_upper, contains_nbr, contains_sym))

测试:

pws = ['asdfS7!l', 'asdf', 'TESTASEDFASDF']
for passphrase in pws:
    if len(passphrase) >= 8 and check_pw(passphrase):
        print(f"pw '{passphrase}' is ok.")
    else:
        print(f"pw '{passphrase}' is not ok.")

印刷

pw 'asdfS7!l' is ok.
pw 'asdf' is not ok.
pw 'TESTASEDFASDF' is not ok.

推荐阅读