Python не перебирает элементы в списке

#python

#python

Вопрос:

Я пытаюсь создать программу, которая вводит пароль, а затем проверяет надежность пароля. Однако эта программа работает не так, как ожидалось. Первоначальная генерация пароля работала нормально до того, как я добавил функцию проверки на прочность, и, кроме функции проверки на прочность, все еще работает. check(passw) Функция также отлично работает сама по себе, просто когда я помещаю ее в for item in passwords_list цикл, она печатает:

 Currently testing: 

Length under 3 characters.
Could not find a number.
Could not find a symbol.
No uppercase characters were found.
No lowercase characters were found.
 

Код выглядит следующим образом:

 import random
import string
adjectives = ['Hairy', 'Skinny', 'Red', 'Flawless']
nouns = ['Rock', 'Table', 'Banana', 'House']
passwords_list = ['']
password = ''

def check(passw):
    safe_unsafe = ['']
    errors_list = ['']
    errors = ''
    if len(passw) < 3:
        errors_list.append('length_under')
        errors = errors   'nLength under 3 characters.'
    if len(passw) > 16:
        errors_list.append('length_above')
        errors = errors   'nLength above 16 characters.'
    if not re.search('[0-9]', passw):
        errors_list.append('numbers')
        errors = errors   'nCould not find a number.'
    for char in passw:
        if char in string.punctuation:
            safe_unsafe.append('y')
        else:
            safe_unsafe.append('n')
    if 'y' in safe_unsafe:
        pass
    else:
        errors_list.append('symbol')
        errors = errors   'nCould not find a symbol..'
    safe_unsafe.clear()
    for char in passw:
        if char in string.ascii_uppercase:
            safe_unsafe.append('y')
        else:
            safe_unsafe.append('n')
    if 'y' in safe_unsafe:
        pass
    else:
        errors_list.append('upper')
        errors = errors   'nNo uppercase characters were found.'
    safe_unsafe.clear()
    for char in passw:
        if char in string.ascii_lowercase:
            safe_unsafe.append('y')
        else:
            safe_unsafe.append('n')
    if 'y' in safe_unsafe:
        pass
    else:
        errors_list.append('lower')
        errors = errors   'nNo lowercase characters were found.'
    safe_unsafe.clear()
    if errors:
        print(errors)
    else:
        print('Your password is all clear!')

    other_t = input('Would you like to test another password? y/n ')
    if other_t == 'y':
        password = str(input('What is your password? '))
        check(password)
    else:
        exit()

num_of_pass = input('How many passwords would you like?')
numbers = input('Would you like numbers? y/n').lower()
symbols = input('Would you like symbols? y/n').lower()
for num in range(int(num_of_pass)):
    password = password   random.choice(adjectives)   random.choice(nouns)
    if numbers == 'y':
        password = password   str(random.randint(1, 100))
    if symbols == 'y':
        password = password   str(random.choice(string.punctuation))
    passwords_list.append(password)
    print(password)
# test the password
for item in passwords_list:
    print('Currently testing '   item)
    check(item)
 

Комментарии:

1. Пожалуйста, покажите полный ввод и вывод сеанса. Например. сколько паролей вы запросили?

Ответ №1:

После некоторого обратного проектирования и тестирования вашего кода, я думаю, я пришел к выводу.

В седьмой строке вы присвоили password_list списку пустую строку. Из-за этого первый пароль, который вы проверили, на самом деле является пустой строкой.

Чтобы исправить это, сделайте password_list = [''] password_list = [] . После внесения этого исправления я смог запустить ваш код.

Ответ №2:

Вы не создаете список epty. Поэтому, когда вы проверяете первый элемент в списке, он проверяет пустую строку, которая не проходит тест.

Затем вы завершаете свою функцию проверки, вызывая ее снова, прежде чем перейти к следующему элементу в цикле for .

Вы должны начать со списка epty, поэтому просто измените passwords_list = [''] на passwords_list = []

И удалите тест другого пароля из функции проверки, чтобы цикл for продолжал выполняться.

Ответ №3:

Сначала вы создаете список с пустой строкой

 password_list = [''] #is wrong

password_list = [] # is correct
 

Во-вторых, ваш код не подходит для работы со списком элементов. Вам нужно удалить последние 6 строк вашего кода, чтобы он работал идеально.

 other_t = input('Would you like to test another password? y/n ')
if other_t == 'y':
    password = str(input('What is your password? '))
    check(password)
else:
    exit()
 

Эти строки следует удалить