Написал генератор пароля на питоне. Но там все равно хоть и рандомно но много совпадений в буквах, то цифр много.
помогите код улучшить как то не добавляя в него новые функции
И помогите сделать так чтобы пароль всегда начинался с буквы
Нажмите, чтобы раскрыть...
import random
import string
__all__ = ['gen_password']
indexes_to_sets = {
0: string.ascii_uppercase,
1: string.ascii_lowercase,
2: string.punctuation,
3: string.digits,
}
indexes = list(indexes_to_sets)
def gen_password(length: int = random.randint(8, 16)) -> str:
password = '' # или генерим сюда первую букву gen_letter()
for _ in range(length): # если сгенерили первую букву, тогда length - 1
idx = random.choice(indexes)
password += random.choice(indexes_to_sets[idx])
return ensure_password_starts_with_letter(password)
if __name__ == '__main__':
length = 42
password = gen_password(length=length)
assert len(password) == length
Просто рандомную букву из upper/lower поставь до/после генерации пароля, ну что-то аля(можно в начало вставить генерацию только из upper/lower и будет даже лучше, т.к. у тебя всегда будет генериться оная, но тогда длину пароля для итерации меняем на 1 вниз) :
def ensure_starts_with_letter(password: str) -> str:
uidx, lidx = 0, 1
first = password[0]
if (
first not in indexes_to_sets[uidx] and
first not in indexes_to_sets[lidx]
):
idx = random.randint(uidx, lidx)
password = list(password)
password[0] = random.choice(indexes_to_sets[idx])
password = ''.join(password)
return password
def gen_letter() -> str:
idx = random.randint(0, 1)
return random.choice(indexes_to_sets[idx])