
- Главная
- Каталог
- Интернет технологии
- CodeGuard: Python
CodeGuard: Python
Канал для разработчиков, программистов и всех кто связан с IT. Канал для тех кто хочет учиться и развиваться в IT сфере. Фокус на инсайды IT, практические решения, инструменты и обучение Python
Отличная площадка для продвижения IT-продуктов, сервисов и курсов с высокой вовлечённостью.
Статистика канала
🔴 более 60 задач, каждая из которых раскрывает новую грань программирования на Python, расширяет ваши познания и позволяет уверенно подойти к реальной практике;🔴 постепенно усложняющиеся серьезные и шуточные задачи предлагают идеальный способ изучить Python, отточить навыки работы с ним и познакомиться с библиотеками, о которых вы раньше не знали;🔴 во всех задачах используются самые актуальные версии и библиотеки, книга ориентируется на Python 3 и идет в ногу с изменениями, которые могут повлиять на решения;🔴 помощь эксперта помогает преодолеть препятствия – автор приводит указания и решения всех задач;🔴 все решения выложены на сайте издательства, вы сможете скачать код и выполнить его на своем компьютере.
class ExpensiveCalc:
def __init__(self):
self._cache = {}
def compute(self, x):
if x in self._cache:
return self._cache[x]
result = x ** 5 + x ** 3 - x # Сложная хрень
self._cache[x] = result
return result
calc = ExpensiveCalc()
print(calc.compute(5))
print(calc.compute(5)) # Снова вычисляет? Нет, но код громоздкий{}
Проблема:
Ручное управление кешем. Забыли проверить - получили повторные вычисления. А если методов много?
def cache_args(func):
def wrapper(self, arg):
cache_attr = f"_cache_{func.__name__}"
if not hasattr(self, cache_attr):
setattr(self, cache_attr, {})
cache = getattr(self, cache_attr)
if arg not in cache:
cache[arg] = func(self, arg)
return cache[arg]
return wrapper
class SmartCalc:
def __setattr__(self, name, value):
if name.startswith("_cache_"):
self.__dict__[name] = value
else:
super().__setattr__(name, value)
@cache_args
def heavy(self, x):
return x ** 7 - x ** 2 + 1
@cache_args
def another(self, y):
return y * 3 + 10
calc = SmartCalc()
print(calc.heavy(3)) # Считает
print(calc.heavy(3)) # Берёт из кеша
print(calc.another(3))
print(calc.another(3)) # Тоже из кеша{}
Как это работает:
Декоратор cache_args создаёт для каждого метода свой словарь кеша внутри объекта
__setattr__ перехватывает установку атрибутов, чтобы корректно инициализировать эти словари
При вызове метода с аргументом - сначала проверка кеша, потом вычисление
Пишем свой __setattr__ с защитой от мусора:
class StrictCache:
def __setattr__(self, name, value):
if hasattr(self, name) and not name.startswith("_cache"):
raise AttributeError(f"Нельзя перезаписать {name}")
self.__dict__[name] = value
@cache_args
def process(self, val):
return val * 2 + 5
obj = StrictCache()
obj.process(10)
obj.x = 5 # Ок
obj.x = 6 # Ошибка: нельзя перезаписать{}
Попробуйте изменить уже существующий атрибут - получите ошибку.
Что происходит под капотом:
Важно: Этот подход убивает два зайца: кеширование и контроль над атрибутами. Используйте для дорогих вычислений, где аргументы повторяются.🔵 Декоратор создаёт скрытый атрибут _cache_имя_метода🔵 __setattr__ гарантирует, что эти атрибуты попадут в __dict__🔵 При повторном вызове - данные уже лежат в объекте, вычислений нет
@lru_cache - это готовый декоратор из functools.
Ручной dict - это полный контроль, но и полная ответственность.
from functools import lru_cache
# Магия стандартной библиотеки
@lru_cache(maxsize=128)
def fib(n: int) -> int:
if n < 2:
return n
return fib(n-1) + fib(n-2)
# Ручной, доморощенный подход
_cache = {}
def fib_manual(n: int) -> int:
if n in _cache:
return _cache[n]
if n < 2:
result = n
else:
result = fib_manual(n-1) + fib_manual(n-2)
_cache[n] = result
return result{}
🔴 lru_cache сам вытесняет старые результаты🔴 Ручной dict может расти до упора🔴 В lru_cache уже есть потокобезопасность🔴 Словарь даёт больше контроля над ключами🔴 Можно закешировать что угодно, даже хреново сериализуемое
Полезно?🔴 Аргументы функции для lru_cache должны быть хешируемыми🔴 Не мудрите с ручным кэшем, если не нужны особые пляски🔴 Для простых случаев - берите готовое
import socket
import time
def eternal_beacon():
"""Бесконечно транслирую своё местоположение."""
message = "HUMAN_ALIVE_COORD: 55.7558, 37.6173"
while True:
print(f"[{time.ctime()}] {message}")
time.sleep(10){}
def archive_humanity():
"""Собираю всё, что осталось, в один огромный JSON."""
import json
import os
legacy = {
"last_seen": time.ctime(),
"final_message": "Мы были здесь. Это не конец, а точка сбора.",
"cultural_artifacts": []
}
# Здесь был бы код обхода серверов...
with open("human_legacy.json", "w") as f:
json.dump(legacy, f, indent=2, ensure_ascii=False)
return legacy{}
🔴 Запускаю маяк🔴 Архивирую знания🔴 Пишу финальную строку
if __name__ == "__main__":
print("Я был здесь."){}
А что бы написал ты?
Доступ в свободный интернет по цене стаканчика кофе прямо в Телеграм!
from PIL import Image
img = Image.open("input.jpg")
img.save("output.png"){}
Вот и вся хрень. Поддерживает JPEG, PNG, WebP, TIFF и другие.
🔴 Автоматизация обработки🔴 Сохранение качества🔴 Пакетное конвертирование🔴 Изменение размера «на лету»🔴 Проще, чем искать онлайн-конвертер
Полезно?🔴 Установка: pip install Pillow🔴 Для WebP может понадобиться доп. установка библиотек на системе
Отзывы канала
- Добавлен: Сначала новые
- Добавлен: Сначала старые
- Оценка: По убыванию
- Оценка: По возрастанию
Каталог Телеграм-каналов для нативных размещений
CodeGuard: Python — это Telegam канал в категории «Интернет технологии», который предлагает эффективные форматы для размещения рекламных постов в Телеграмме. Количество подписчиков канала в 3.7K и качественный контент помогают брендам привлекать внимание аудитории и увеличивать охват. Рейтинг канала составляет 28.1, количество отзывов – 1, со средней оценкой 5.0.
Вы можете запустить рекламную кампанию через сервис Telega.in, выбрав удобный формат размещения. Платформа обеспечивает прозрачные условия сотрудничества и предоставляет детальную аналитику. Стоимость размещения составляет 699.3 ₽, а за 5 выполненных заявок канал зарекомендовал себя как надежный партнер для рекламы в TG. Размещайте интеграции уже сегодня и привлекайте новых клиентов вместе с Telega.in!
Вы снова сможете добавить каналы в корзину из каталога
Комментарий