Загрузка данных


Задача 1
Напишите декоратор say_hello_decorator, который перед вызовом любой декорированной функции выводит на экран строку "Привет!", а после выполнения – "Пока!".
Входные данные: Функция greet(), в которой считывается строка от пользователя и возвращается.
Выходные данные: 
Привет!
[Строка пользователя]
Пока!
Задача 2
Создайте декоратор double_result, который вызывает декорированную функцию, принимает ее числовой результат и возвращает его значение, умноженное на 2.
Входные данные: Функция get_number(), которая считывает с клаивиатуры число и возвращает его.
Выходные данные: Удвоенное числовое значение.
Задача 3
Напишите декоратор to_upper, который перехватывает строковый результат выполнения функции и возвращает его полностью в верхнем регистре.
Входные данные: get_message(), считывающая с клавиатуры строку и возвращающая ее.
Выходные данные: Строка в верхнем регистре.
Задача 4
Создайте универсальный декоратор log_args, который принимает любые аргументы (*args, **kwargs), выводит их на экран перед вызовом функции в формате Аргументы: (список), {словарь}, а затем возвращает результат работы функции.
Входные данные: Функция multiply(a, b, c=1), вызванная со значениями, введенными с клавиатуры.
Выходные данные: Лог с аргументами и результат работы функции
Задача 5
Напишите декоратор add_exclamation, который проверяет строковый результат декорированной функции. Если строка не заканчивается на восклицательный знак !, декоратор добавляет его в конец строки.
Входные данные:  Функция say_ok(), принимающая с клавиатуры строк и возвращающая ее.
Выходные данные: Строка по условию задачи.
Задача 6
Напишите декоратор memoize, который сохраняет результаты вызовов функции в словарь. Если функция вызывается повторно с теми же аргументами, декоратор не выполняет функцию заново, а возвращает сохраненное значение из словаря.
Входные данные: Программа запрашивает число N, функция heavy_calc(n) считает факториал или сумму чисел до N. Пользователь вводит числа несколько раз, окончание ввода – «Ок».
Выходные данные: Результат вычислений.
Задача 7
Напишите декоратор positive_only, который проверяет все числовые позиционные аргументы (*args), переданные в функцию. Если среди них есть отрицательные числа, декоратор заменяет их на нули перед передачей в функцию.
Входные данные: Пользователь вводит 3 числа через пробел. Функция sum_three(a, b, c) возвращает их сумму.
Выходные данные: Сумма чисел, где все отрицательные были заменены на 0.
Задача 8
Напишите декоратор validate_int, который проверяет, что все переданные в функцию позиционные аргументы (*args) являются целыми числами (int). Если все аргументы целые – функция выполняется. Если хотя бы один аргумент не является целым числом (например, ввели строку), декоратор возвращает строку «Ошибка типов».
Входные данные: Пользователь вводит два значения через пробел. Функция add_nums(a, b) возвращает их сумму.
Выходные данные: Сумма чисел либо строка «Ошибка типов».
Задача 9
Создайте декоратор call_counter, который считает, сколько раз вызывалась декорированная функция, используя словарь для хранения счета. Функция должна возвращать кортеж: (результат_функции, текущий_номер_вызова).
Входные данные: Пользователь вводит 3 раза разные слова. Функция ping(word) возвращает введенное слово.
Выходные данные: Для каждого ввода выводится кортеж вида ('слово', 1),
Задача 10
Напишите декоратор max_length(limit), который принимает максимальную длину строки. Если результат выполнения функции – строка, и ее длина превышает limit, декоратор обрезает строку до limit символов и добавляет в конце многоточие ...
Входные данные: Пользователь вводит длинную строку. Функция get_text() возвращает ее. Лимит (например, 5) задается в параметре декоратора.
Выходные данные: Обрезанная строка с многоточием (если превышен лимит).
Задача 11*
Напишите декоратор sort_output, который применяется к функциям, возвращающим списки строк. Декоратор должен автоматически сортировать полученный список строк по алфавиту перед возвратом пользователю.
Входные данные: Пользователь вводит слова через пробел. Функция get_words() преобразует их в список.
Выходные данные: Отсортированный по алфавиту список слов.
Задача 12*
Напишите декоратор freq_analysis, который применяется к функциям, возвращающим текст. Декоратор преобразует результат в список слов (в нижнем регистре), строит по ним частотный словарь ({слово: количество}) и возвращает этот словарь.
Входные данные: Пользователь вводит предложение из нескольких слов. Функция get_text() возвращает его.
Выходные данные: Частотный словарь в формате {'слово': частота}.
Задача 13*
Напишите декоратор unique_elements, который принимает функцию, возвращающую список с повторяющимися элементами, и возвращает новый список, в котором удалены все дубликаты, но сохранен исходный порядок появления элементов (используйте множество seen для быстрой проверки за $O(1)$, но формируйте итоговый список последовательно).
Входные данные: Пользователь вводит числа через пробел (включая повторяющиеся). Функция get_list() возвращает этот список.
Выходные данные: Список уникальных элементов с сохраненным порядком.
# Задача 1[span_0](start_span)[span_0](end_span)
def say_hello_decorator(func):
    def wrapper(*args, **kwargs):
        print("Привет!")
        result = func(*args, **kwargs)
        print("Пока!")
        return result
    return wrapper

@say_hello_decorator
def greet():
    return input()


# Задача 2[span_1](start_span)[span_1](end_span)
def double_result(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        return result * 2
    return wrapper

@double_result
def get_number():
    return float(input())


# Задача 3[span_2](start_span)[span_2](end_span)
def to_upper(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        return str(result).upper()
    return wrapper

@to_upper
def get_message():
    return input()


# Задача 4[span_3](start_span)[span_3](end_span)
def log_args(func):
    def wrapper(*args, **kwargs):
        print(f"Аргументы: {args}, {kwargs}")
        return func(*args, **kwargs)
    return wrapper

@log_args
def multiply(a, b, c=1):
    return a * b * c


# Задача 5[span_4](start_span)[span_4](end_span)
def add_exclamation(func):
    def wrapper(*args, **kwargs):
        result = str(func(*args, **kwargs))
        if not result.endswith('!'):
            result += '!'
        return result
    return wrapper

@add_exclamation
def say_ok():
    return input()


# Задача 6[span_5](start_span)[span_5](end_span)
def memoize(func):
    cache = {}
    def wrapper(n):
        if n in cache:
            return cache[n]
        result = func(n)
        cache[n] = result
        return result
    return wrapper

@memoize
def heavy_calc(n):
    res = 1
    for i in range(1, n + 1):
        res *= i
    return res


# Задача 7[span_6](start_span)[span_6](end_span)
def positive_only(func):
    def wrapper(*args, **kwargs):
        new_args = []
        for x in args:
            if x < 0:
                new_args.append(0)
            else:
                new_args.append(x)
        return func(*new_args, **kwargs)
    return wrapper

@positive_only
def sum_three(a, b, c):
    return a + b + c