Почему мой код не печатает пароль, когда он имеет все необходимые помещения? - PullRequest
0 голосов
/ 05 октября 2019
`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 символов и, по крайней мере, одну заглавную, одну строчную, одну цифру и один символ. Предположительно, когда все эти предпосылки выполнены, следует напечатать имя пользователя и пароль. Однако это не так.

1 Ответ

0 голосов
/ 05 октября 2019

как прокомментировано, вы не нарушаете ни одного из циклов внутри «проверки пароля» - даже если выполняется условие if. Таким образом, каждый цикл будет перебирать все символы в пароле. Попробуйте добавить несколько print операторов в свой код, чтобы увидеть, что происходит. Вообще, вложение такого количества циклов и условных выражений становится практически невозможным для чтения. Поэтому я бы посоветовал взглянуть на Python any и all .

Используя их, вы можете, например, рефакторинг вашей проверки пароля, например

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...