#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()
Эти строки следует удалить