py_stepik/mod_oop/3.2_04_random_password.py
2024-04-11 10:19:41 +03:00

55 lines
2.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
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)
(<class 'str'>, 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()