diff --git a/mod_oop/3.2_04_random_password.py b/mod_oop/3.2_04_random_password.py new file mode 100644 index 0000000..a360bb1 --- /dev/null +++ b/mod_oop/3.2_04_random_password.py @@ -0,0 +1,54 @@ +""" + https://stepik.org/lesson/701987/step/4?unit=702088 + + Объявите класс RandomPassword для генерации случайных паролей. Объекты этого класса должны создаваться командой: + +rnd = RandomPassword(psw_chars, min_length, max_length) +где psw_chars - строка из разрешенных в пароле символов; min_length, max_length - минимальная и максимальная длина генерируемых паролей. +>>> rnd = RandomPassword("abcd", 4, 6) + +Непосредственная генерация одного пароля должна выполняться командой: + +psw = rnd() +где psw - ссылка на строку длиной в диапазоне [min_length; max_length] из случайно выбранных символов строки psw_chars. + +>>> psw = rnd() +>>> type(psw), 4 <= len(psw) <= 6, set("abcd").issuperset(psw) +(, True, True) + +С помощью генератора списка (list comprehension) создайте список lst_pass из трех сгенерированных паролей объектом rnd класса RandomPassword, созданного с параметрами: + +min_length = 5 +max_length = 20 +psw_chars = "qwertyuiopasdfghjklzxcvbnm0123456789!@#$%&*" +>>> len(lst_pass) +3 + +P.S. Выводить на экран ничего не нужно, только создать список из паролей. +P.P.S. Дополнительное домашнее задание: попробуйте реализовать этот же функционал с использованием замыканий функций. + +""" + +import random + +class RandomPassword: + def __init__(self, psw_chars: str, min_length: int, max_length: int): + self.psw_chars, self.min_length, self.max_length = psw_chars, min_length, max_length + + def __call__(self): + return ''.join(random.choices(self.psw_chars, k=random.randint(self.min_length, self.max_length))) + +RandomPassword = lambda a, b, c: lambda: ''.join(random.choices(a, k=random.randint(b, c))) + +rnd = RandomPassword("qwertyuiopasdfghjklzxcvbnm0123456789!@#$%&*", 5, 20) +lst_pass = [rnd() for _ in range(3)] + +def tests(): + ... + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + tests()