Это все идет в правильном направлении, просто некоторая путаница вокруг строк и кортежей, чтобы прояснить ситуацию.Причина, по которой в ответе заключены квадратные скобки, заключается в том, что
(random.randint(0, 9),
random.randint(0, 9),
random.randint(0, 9),
random.randint(0, 9))
(числа, разделенные запятыми, в круглых скобках) и
passwordletter, passwordnumber
являются кортежами.В итоге вы получили 4-кортеж (цифры) внутри 2-кортежа.Python заключает в скобки их, чтобы вы знали:
('nigc', (5, 4, 9, 6))
означает 2-кортеж со строкой на первом месте и встроенный 4-кортеж на втором месте.
Что нужноЧтобы произойти сейчас, нужно:
- соединить 4-кортеж вместе, чтобы создать строку
- добавить строки друг к другу, чтобы получить полный пароль
Прежде чем объединять числа в строку, вам необходимо преобразовать сами числа в строки, иначе вы получите TypeError
при попытке добавить целые числа в строки.str(5)
создает строку '5'
, поэтому давайте используем str()
для каждого из ваших чисел:
passwordnumber = (str(random.randint(0, 9)),
str(random.randint(0, 9)),
str(random.randint(0, 9)),
str(random.randint(0, 9)))
Но это становится повторяющимся и сложным для чтения.А что, если безопасность станет более жесткой, и вы захотите 12-значный пароль?В Python есть полезное средство, называемое списком, которое отлично подходит для создания списков любого размера.Мы можем использовать один для построения списка чисел без повторения кода:
numbers_list = [str(randint(0, 9)) for _ in range(4)]
Вот полный ответ, намного короче вашего, с использованием пониманий и нескольких других полезных кусочков Python.Обратите внимание на использование str()
для преобразования чисел в строки перед объединением, как упоминалось выше.
from random import choice, randint
name = 'Sherlock Holmes'
name_as_word_list = name.lower().split()
name_no_spaces = ''.join(name_as_word_list)
letters_list = [choice(name_no_spaces) for _ in range(3)]
numbers_list = [str(randint(0, 9)) for _ in range(4)]
password = ''.join(letters_list + numbers_list)
print(password)