Я новичок в программировании и пытаюсь изучить его, выполняя небольшие проекты. В настоящее время я работаю над генератором случайных строк, и у меня это сделано на 99%, но я не могу добиться того, чтобы вывод был таким, каким я хочу.
Во-первых, вот код:
import random
def pwgenerator():
print("This is a randomm password generator.")
print("Enter the lenght of your password and press enter to generate a password.")
lenght = int(input())
template = "abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!" # this is the sample used for choosing random characters
generator = ""
for x in range(lenght): # join fcuntion goes trough str chronologically and I want it fully randomized, so I made this loop
add_on = str(random.sample(template, 1))
generator = generator + add_on
#print(add_on) added this and next one to test if these are already like list or still strings.
#print(generator)
print(generator) # I wanted this to work, but...
for x in range(lenght): #...created this, because I thought that I created list with "generator" and tried to print out a normal string with this
print(generator[x], end = "")
pwgenerator()
Первоначальный код должен был быть таким:
import random
def pwgenerator():
print("This is a randomm password generator.")
print("Enter the lenght of your password and press enter to generate a password.")
lenght = int(input())
template = "abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!"
generator = ""
for x in range(lenght):
generator = generator + str(random.sample(template, 1))
print(generator)
pwgenerator()
Проблема в том, что с этим исходным кодом и, например, вводом 10 я получаю такой результат:
['e']['3']['i']['E']['L']['I']['3']['r']['l']['2']
то, что я хотел бы получить здесь, было бы "e3iELI3rl2"
Как вы можете видеть в первом коде, я пробовал несколько вещей, потому что мне казалось, что я каким-то образом создавал список со списками в качестве элементов, каждый из которых имеет 1 запись. Итак, я бы просто распечатал каждый элемент, но результат был (для пользовательского ввода/длины 10):
['e']['3']
Таким образом, он просто распечатал каждый символ в этом списке в виде строки (включая скобки и кавычки), которую я интерпретирую как все, что я создал, не являющееся списком. но на самом деле все еще строка
Проведя небольшое исследование и предполагая, что я все еще создал строку, я нашел это из W3Schools. Если я правильно понимаю, я делаю все правильно, пытаясь сложить строки вместе.
Не могли бы вы рассказать мне, что здесь происходит, в частности, почему я получаю вывод, который выглядит как список списков? И если вы можете уделить еще немного времени, я также хотел бы услышать о лучшем способе сделать это, но я в основном хочу понять, что происходит, а не получить решение. Я хотел бы найти решение самостоятельно. :D
Ваше здоровье
PS: На всякий случай, если вам интересно: я пытаюсь учиться на практике и в настоящее время следую мини-проектам, предложенным ЗДЕСЬ. Но в этом случае я читал в W3Schools, что метод «объединения» приводит к хронологическим результатам, поэтому я добавил дополнительное усложнение, сделав его действительно случайным.
Вы получаете результат, который вы делаете сейчас, потому что random.sample()
возвращает список, содержащий length
строк. Когда вы делаете str()
в списке, он возвращает строку со скобками и кавычками, потому что это как представлен список строк.
Итак, проблема в том, что random.choice возвращает список строк вместо строки, как вы можете видеть ниже:
template = "abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!"
random.sample(template, 1)
Out[5]: ['H']
Что на самом деле произошло, так это добавление строк, содержащих результат приведения списка (например, ['H'] было преобразовано в "['H']", а затем напечатано на экране как ['H']).
После изменения функции на random.choice она работала нормально:
random.choice(template)
Out[6]: 'j'
Переключите этот random.sample на random.choice в своей функции, и все будет так, как вы ожидали.
Большое спасибо, это решило это: D
И теперь я понял это... так что еще раз спасибо! хД
Функция random.sample()
возвращает список, выбранный из заданной строки.
Вот почему вы получаете кучу списков, сложенных вместе.
"".join(random.sample(letters, length))
, функцияrandom.sample()
выбираетlength
случайных элементовletters
.str.join()
просто присоединяется эти буквы в одну строку. Функционально нет никакой разницы между этим и выполнением того, что вы делаете (в цикле, если вы сделали это правильно)