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


Решения всех задач по декораторам из документа.
Задача 1: say_hello_decorator
from functools import wraps

def say_hello_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        print("Привет!")
        result = func(*args, **kwargs)
        print(result)
        print("Пока!")
        return result
    return wrapper

@say_hello_decorator
def greet():
    return input()

# Пример вызова:
greet()

Задача 2: double_result
from functools import wraps

def double_result(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs) * 2
    return wrapper

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

# Пример вызова:
print(get_number())

Задача 3: to_upper
from functools import wraps

def to_upper(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        return result.upper()
    return wrapper

@to_upper
def get_message():
    return input()

# Пример вызова:
print(get_message())

Задача 4: log_args
from functools import wraps

def log_args(func):
    @wraps(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

# Пример вызова:
num1 = int(input())
num2 = int(input())
result = multiply(num1, num2, c=2)
print("Результат:", result)

Задача 5: add_exclamation
from functools import wraps

def add_exclamation(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        if isinstance(result, str) and not result.endswith("!"):
            return result + "!"
        return result
    return wrapper

@add_exclamation
def say_ok():
    return input()

# Пример вызова:
print(say_ok())

Задача 6: memoize
from functools import wraps

def memoize(func):
    cache = {}

    @wraps(func)
    def wrapper(*args):
        if args not in cache:
            cache[args] = func(*args)
        return cache[args]
    return wrapper

@memoize
def heavy_calc(n: int) -> int:
    # Вычисление суммы чисел от 1 до n
    return sum(range(1, n + 1))

# Пример цикла работы с окончанием ввода по «Ок»:
while True:
    entry = input()
    if entry.strip().lower() in ("ок", "ok"):
        break
    print(heavy_calc(int(entry)))

Задача 7: positive_only
from functools import wraps

def positive_only(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        filtered_args = tuple(0 if isinstance(x, (int, float)) and x < 0 else x for x in args)
        return func(*filtered_args, **kwargs)
    return wrapper

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

# Пример вызова:
nums = list(map(int, input().split()))
print(sum_three(nums[0], nums[1], nums[2]))

Задача 8: validate_int
from functools import wraps

def validate_int(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        # Проверяем, что тип каждого аргумента строго int (исключая bool)
        if not all(type(arg) is int for arg in args):
            return "Ошибка типов"
        return func(*args, **kwargs)
    return wrapper

@validate_int
def add_nums(a, b):
    return a + b

# Пример вызова с проверкой пользовательского ввода:
raw_a, raw_b = input().split()

def parse_val(val: str):
    try:
        return int(val)
    except ValueError:
        return val

a = parse_val(raw_a)
b = parse_val(raw_b)

print(add_nums(a, b))

Задача 9: call_counter
from functools import wraps

def call_counter(func):
    storage = {"count": 0}

    @wraps(func)
    def wrapper(*args, **kwargs):
        storage["count"] += 1
        return func(*args, **kwargs), storage["count"]
    return wrapper

@call_counter
def ping(word: str) -> str:
    return word

# Пример вызова для 3 вводов:
for _ in range(3):
    word = input()
    print(ping(word))

Задача 10: max_length
from functools import wraps

def max_length(limit: int):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            result = func(*args, **kwargs)
            if isinstance(result, str) and len(result) > limit:
                return result[:limit] + "..."
            return result
        return wrapper
    return decorator

@max_length(limit=5)
def get_text():
    return input()

# Пример вызова:
print(get_text())

Задача 11*: sort_output
from functools import wraps

def sort_output(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        return sorted(result)
    return wrapper

@sort_output
def get_words():
    return input().split()

# Пример вызова:
print(get_words())

Задача 12*: freq_analysis
from functools import wraps

def freq_analysis(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        text = func(*args, **kwargs)
        words = text.lower().split()
        freq = {}
        for word in words:
            freq[word] = freq.get(word, 0) + 1
        return freq
    return wrapper

@freq_analysis
def get_text():
    return input()

# Пример вызова:
print(get_text())

Задача 13*: unique_elements
from functools import wraps

def unique_elements(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        items = func(*args, **kwargs)
        seen = set()
        result = []
        for item in items:
            if item not in seen:
                seen.add(item)
                result.append(item)
        return result
    return wrapper

@unique_elements
def get_list():
    return [int(x) for x in input().split()]

# Пример вызова:
print(get_list())