whoiswho1

Пользователь

Регистрация: 01.01.2019

Сообщения: 142

Рейтинг: 12

whoiswho1

Регистрация: 01.01.2019

Сообщения: 142

Рейтинг: 12

Написал генератор пароля на питоне. Но там все равно хоть и рандомно но много совпадений в буквах, то цифр много.

помогите код улучшить как то не добавляя в него новые функции

Цитата:
import string
import random

lower_letters = string.ascii_lowercase
upper_letters = string.ascii_uppercase
digits = string.digits
symbols = string.punctuation
password = str()

result = [0,1,2,3]
components = [lower_letters, upper_letters, digits, symbols]

length = random.randint(8,16)

for i in range(length):

template = str()

for item in result:


template += random.choice(components[item - 1])

password += random.choice(template)

print(password)
Нажмите, чтобы раскрыть...

И помогите сделать так чтобы пароль всегда начинался с буквы

ContraX5

Пользователь

Регистрация: 19.09.2016

Сообщения: 5844

Рейтинг: 1495

Нарушения: 20

ContraX5

Регистрация: 19.09.2016

Сообщения: 5844

Рейтинг: 1495

Нарушения: 20

ну напиши там иф пароль первый знак цифра то все начинается по новой, это все так муторно придумывать

whoiswho1

Пользователь

Регистрация: 01.01.2019

Сообщения: 142

Рейтинг: 12

whoiswho1

Регистрация: 01.01.2019

Сообщения: 142

Рейтинг: 12

ContraX5 сказал(а):

ну напиши там иф пароль первый знак цифра то все начинается по новой, это все так муторно придумывать

Нажмите, чтобы раскрыть...

нулевой номер в пароле проверить на isalpha и рерандомить в случае фолса?

ну эт реально впадлу делать

ContraX5

Пользователь

Регистрация: 19.09.2016

Сообщения: 5844

Рейтинг: 1495

Нарушения: 20

ContraX5

Регистрация: 19.09.2016

Сообщения: 5844

Рейтинг: 1495

Нарушения: 20

я последний раз пайтон открывал 2 месяца назад, урок 13 регулярные выражения, там ты найдешь поиск по шаблону, если первый знак цифра

Gissh

Пользователь

Регистрация: 21.03.2015

Сообщения: 5505

Рейтинг: 8996

Gissh

Регистрация: 21.03.2015

Сообщения: 5505

Рейтинг: 8996

img

1) сделай ограничения в количестве повторяющихся символов, т.е. допустим что бы две буквы подряд не попадались

2) так же можешь проверять сколько определенных типов символов уже есть в пароле и уравнивать их

whoiswho1 сказал(а):

И помогите сделать так чтобы пароль всегда начинался с буквы

Нажмите, чтобы раскрыть...

заведи себе массивы с спец. символами/буквами/цифрами и пропиши что бы он начинался всегда с букв, а потом массивы выбирались рандомно

ContraX5

Пользователь

Регистрация: 19.09.2016

Сообщения: 5844

Рейтинг: 1495

Нарушения: 20

ContraX5

Регистрация: 19.09.2016

Сообщения: 5844

Рейтинг: 1495

Нарушения: 20

import re

s ='ASASSSASASASAAA'
result = re.match('A',s)#match ищет в начале строки
print (result)

изи, разберешься, в место А поставишь 1234565787980


Renderhauer

Пользователь

Регистрация: 14.12.2013

Сообщения: 16049

Рейтинг: 16708

Renderhauer

Регистрация: 14.12.2013

Сообщения: 16049

Рейтинг: 16708

генеришь только букву, генеришь все остальное на на символ короче

потом сложение строки 1 и строки 2 (конкатенация hmmclueless.png)

Justp1ayer

Пользователь

Регистрация: 18.08.2013

Сообщения: 1607

Рейтинг: 1129

Justp1ayer

Регистрация: 18.08.2013

Сообщения: 1607

Рейтинг: 1129

img

Проверки на "если первая буква не символ" делает лишние итерации кода, просто сгенерируй букву и вставь в начало перед выполнением дальнейшего кода

KRATI

Пользователь

Регистрация: 25.09.2021

Сообщения: 3317

Рейтинг: 1495

KRATI

Регистрация: 25.09.2021

Сообщения: 3317

Рейтинг: 1495

img
whoiswho1 сказал(а):

result = [0,1,2,3]

Нажмите, чтобы раскрыть...
whoiswho1 сказал(а):

for item in result:

Нажмите, чтобы раскрыть...
whoiswho1 сказал(а):
components[item - 1]
Нажмите, чтобы раскрыть...

это тааак странно PepeCringe.png?1598477741

whoiswho1

Пользователь

Регистрация: 01.01.2019

Сообщения: 142

Рейтинг: 12

whoiswho1

Регистрация: 01.01.2019

Сообщения: 142

Рейтинг: 12

krati сказал(а):

это тааак странно PepeCringe.png?1598477741

Нажмите, чтобы раскрыть...

я учился всю жизнь на ccnp и win сервер, и питон начал учить буквально 3 недели назад для ансибла и той же автоматизации и генерации к примеру паролей, если не сложно то поясни в чем проблема


Justp1ayer сказал(а):

Проверки на "если первая буква не символ" делает лишние итерации кода, просто сгенерируй букву и вставь в начало перед выполнением дальнейшего кода

Нажмите, чтобы раскрыть...

спасибо, сделал как ты сказал и все вышло. т.е теперь у меня генерируется пароль и отдельно генерируется буква рандомная и к букве приставляю пароль и выходит все норм

YoshkinKot

Пользователь

Регистрация: 20.06.2016

Сообщения: 15488

Рейтинг: 6113

YoshkinKot

Регистрация: 20.06.2016

Сообщения: 15488

Рейтинг: 6113

Цитата:

import string
import random


def pick_from(components):

return random.choice(random.choice(components))


lower_letters = string.ascii_lowercase
upper_letters = string.ascii_uppercase
digits = string.digits
symbols = string.punctuation


components= [lower_letters, upper_letters, digits, symbols]

length = random.randint(8,16)

password = pick_from([lower_letters, upper_letters])
for i in range(length):

password += pick_from(components)

print(password)

Нажмите, чтобы раскрыть...

Сначала выбираем компоненту, потом в ней элемент: random.choice(random.choice(components)).

Это тоже самое, что по элементу выписать, а потом выбрать элемент среди них. По комбинаторным соображениям.

Работать при этом будет быстрее, запись короче. Сплошные плюсы.


Так, как мы этой вещью будем пользоваться 2 раза, то имеет смысл дать название этому действию: пусть будет pick_from.


А вообще, не забывай, что random по дефолту это PRNG. И для генерации паролей лучше использовать secrets.choice.

ekk_0tsu

Пользователь

Регистрация: 17.04.2022

Сообщения: 46

Рейтинг: 10

ekk_0tsu

Регистрация: 17.04.2022

Сообщения: 46

Рейтинг: 10

whoiswho1 сказал(а):

Написал генератор пароля на питоне. Но там все равно хоть и рандомно но много совпадений в буквах, то цифр много.

помогите код улучшить как то не добавляя в него новые функции


И помогите сделать так чтобы пароль всегда начинался с буквы

Нажмите, чтобы раскрыть...

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])


whoiswho1

Пользователь

Регистрация: 01.01.2019

Сообщения: 142

Рейтинг: 12

whoiswho1

Регистрация: 01.01.2019

Сообщения: 142

Рейтинг: 12

ekk_0tsu сказал(а):

import random
import string



__all__ = ['gen_password']


indexes_to_sets = {
0: string.ascii_uppercase,
1: string.ascii_lowercase,
2: string.punctuation,
3: string.digits,
}



def gen_password(length: int = random.randint(8, 16)) -> str:
indexes = list(indexes_to_sets)
password = ''


for _ in range(length):

idx = random.choice(indexes)

password += random.choice(indexes_to_sets[idx])


return password



if __name__ == '__main__':
length = 42
password = gen_password(length=length)

assert len(password) == length


Просто рандомную букву из upper/lower поставь до/после генерации пароля

Нажмите, чтобы раскрыть...

Приветик. не особо понял отличия твоего кода от своего в плане генерации пароля, если он не такой очевидный можешь пояснить? И почему
if __name__ == '__main__':
length = 42
тогда длинна пароля становится 42,а над рандомно от 8 до 16, и вроде если вставить

length = random.randint(8, 16)
работает как надо.

Поясни пожалуйста. код выглядит красиво

Jaood

Пользователь

Регистрация: 09.09.2019

Сообщения: 3401

Рейтинг: 2051

Jaood

Регистрация: 09.09.2019

Сообщения: 3401

Рейтинг: 2051

whoiswho1 сказал(а):

length = 42

Нажмите, чтобы раскрыть...

Просто потому что

Цитата:

42 — ответ на главный вопрос жизни, вселенной и всего такого.

Нажмите, чтобы раскрыть...

ekk_0tsu

Пользователь

Регистрация: 17.04.2022

Сообщения: 46

Рейтинг: 10

ekk_0tsu

Регистрация: 17.04.2022

Сообщения: 46

Рейтинг: 10

whoiswho1 сказал(а):

Приветик. не особо понял отличия твоего кода от своего в плане генерации пароля, если он не такой очевидный можешь пояснить? И почему
if __name__ == '__main__':
length = 42
тогда длинна пароля становится 42,а над рандомно от 8 до 16, и вроде если вставить

length = random.randint(8, 16)
работает как надо.

Поясни пожалуйста. код выглядит красиво

Нажмите, чтобы раскрыть...


Привет, ну ты захардкодил длину пароля, я сделал более юзер-френдли)
У тебя 1 вложенный цикл там, а можно легко обойтись без него. template какой-то создается, из которого потом берутся рандомно литералы. А можно за один проход взять случайный литерал из возможных наборов сразу. Потом не нужно писать в переменные module path, у них же и так запись короткая, и в коде всегда будет видно что и откуда используется. Плюс не стоит создавать пустую строку так - str( ). Пиши литеральное обозначение для конкретного типа, так код читать проще)

whoiswho1

Пользователь

Регистрация: 01.01.2019

Сообщения: 142

Рейтинг: 12

whoiswho1

Регистрация: 01.01.2019

Сообщения: 142

Рейтинг: 12

ekk_0tsu сказал(а):


Привет, ну ты захардкодил длину пароля, я сделал более юзер-френдли)
У тебя 1 вложенный цикл там, а можно легко обойтись без него. template какой-то создается, из которого потом берутся рандомно литералы. А можно за один проход взять случайный литерал из возможных наборов сразу. Потом не нужно писать в переменные module path, у них же и так запись короткая, и в коде всегда будет видно что и откуда используется. Плюс не стоит создавать пустую строку так - str( ). Пиши литеральное обозначение для конкретного типа, так код читать проще)

Нажмите, чтобы раскрыть...

спасибо) но пока не понимаю литералы, даже в твоем коде глаз не отличает литералы от кода(

Sudjiro

Пользователь

Регистрация: 17.12.2011

Сообщения: 18571

Рейтинг: 6282

Sudjiro

Регистрация: 17.12.2011

Сообщения: 18571

Рейтинг: 6282

whoiswho1 сказал(а):

Написал генератор пароля на питоне. Но там все равно хоть и рандомно но много совпадений в буквах, то цифр много.

помогите код улучшить как то не добавляя в него новые функции


И помогите сделать так чтобы пароль всегда начинался с буквы

Нажмите, чтобы раскрыть...

Цитата:
from random import choice

digits = '0123456789'
lowercase_letters = 'abcdefghijklmnopqrstuvwxyz'
uppercase_letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
punctuation = '!#$%&*+-=?@^_'

chars = ''

pwd_length = 15


chars += digits
chars += uppercase_letters
chars += lowercase_letters
chars += punctuation

password = ''

for i in range(pwd_length):

password += choice(chars)

print('\n', password, '\n', sep='')
Нажмите, чтобы раскрыть...

Вот моя реализация, писла давненько, но всё понятно

Дринбибиска

Пользователь

Регистрация: 28.05.2013

Сообщения: 4403

Рейтинг: 1912

Дринбибиска

Регистрация: 28.05.2013

Сообщения: 4403

Рейтинг: 1912

img
whoiswho1 сказал(а):

нулевой номер в пароле проверить на isalpha и рерандомить в случае фолса?

ну эт реально впадлу делать

Нажмите, чтобы раскрыть...

ну вот прям первое что в голвоу пришло это - иф лен темплейт == 0 ....