Загрузка данных
Решения всех задач по декораторам из документа.
Задача 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())