I've been learning python for a few days now, and I programmed this password generator after today's lesson (following the 100 days of code on udemy course). This code works like it should and gives me the desired results, but out of pure curiosity, I am interested in optimizing the code even more.
import random
letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
numbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
symbols = ['!', '#', '$', '%', '&', '(', ')', '*', '+']
print("Welcome to the PyPassword Generator!")
nr_letters = int(input("How many letters would you like in your password?\n"))
nr_symbols = int(input(f"How many symbols would you like?\n"))
nr_numbers = int(input(f"How many numbers would you like?\n"))
password = []
for req in range(0, nr_letters + 1):
letter_index = random.randint(0, len(letters))
password.append(letters[letter_index-1])
for sym in range(1, nr_symbols + 1):
symbol_index = random.randint(0,len(symbols))
password.append(symbols[symbol_index-1])
for num in range(1, nr_numbers + 1):
number_index = random.randint(0,len(numbers))
password.append(numbers[number_index-1])
random.shuffle(password)
print(*password,sep='')
"".join(random.choices(f"{string.ascii_letters}0123456789!#$%&()*+", k=int(input('The password length, please!'))))
as well. \$\endgroup\$typer
- it will save you a bit of manual input parsing, while also providing both script arguments and interactive prompts out of the box. (Why care about this - because many people prefer writing./something.py --digits 4 --letters 8 --symbols 1
instead of talking to interactive prompts or use it in scripts easier) \$\endgroup\$pwgen
. You may want to read its manpage for some ideas that might be worth including in your script. \$\endgroup\$