Python Morsels — это платформа, на которой каждую неделю присылаются небольшие, но глубокие задачи по Python.
Основной акцент — не просто на синтаксис, а на идиоматичный код, использование стандартной библиотеки и продвинутые концепции.
Please open Telegram to view this post
VIEW IN TELEGRAM
deque (двусторонняя очередь) из модуля collections — это более эффективная альтернатива спискам, когда часто требуется вставка или удаление с начала и конца.from collections import deque
# Создаём deque
queue = deque(["Алиса", "Боб", "Чарли"])
# Добавляем в конец и в начало
queue.append("Дэвид")
queue.appendleft("Эва")
print(queue) # ➔ deque(['Эва', 'Алиса', 'Боб', 'Чарли', 'Дэвид'])
# Удаляем с конца и начала
queue.pop() # ➔ 'Дэвид'
queue.popleft() # ➔ 'Эва'
print(queue) # ➔ deque(['Алиса', 'Боб', 'Чарли'])
deque оптимизирован для операций .append(), .appendleft(), .pop() и .popleft() — все выполняются за O(1), в отличие от обычного списка.maxlen=N) — полезно для реализации кольцевых буферов.Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Рассказываю, как кеширование в Django Ninja помогает выдерживать рост нагрузки без боли и апгрейда железа. Один и тот же ответ — не значит один и тот же расчёт.
Please open Telegram to view this post
VIEW IN TELEGRAM
Контекстные менеджеры — мощный механизм Python для безопасного и автоматического управления ресурсами: файлами, сетевыми соединениями, блокировками и т.д.
# Классический with для работы с файлами
with open("example.txt", "w") as f:
f.write("Hello, world!")
# Свой контекстный менеджер через декоратор
from contextlib import contextmanager
@contextmanager
def custom_context():
print("Вход в контекст")
yield
print("Выход из контекста")
with custom_context():
print("Работаем внутри")
# Класс-контекст для измерения времени
class Timer:
def __enter__(self):
from time import perf_counter
self.start = perf_counter()
return self
def __exit__(self, exc_type, exc_val, exc_tb):
from time import perf_counter
print(f"Заняло времени: {perf_counter() - self.start:.4f} секунд")
with Timer():
sum(i * i for i in range(10_000_000))
with гарантирует вызов __enter__ при входе и __exit__ при выходеcontextlib.contextmanager — простой способ обернуть логику до и после yieldPlease open Telegram to view this post
VIEW IN TELEGRAM
👍9
Что происходит, если переопределить __eq__ без __hash__ в Python?
Пример
class Person:
def __init__(self, name):
self.name = name
def __eq__(self, other):
return isinstance(other, Person) and self.name == other.name
p1 = Person("Alice")
p2 = Person("Alice")
print(p1 == p2) # ➔ True
print(set([p1, p2])) # ➔ TypeError: unhashable type: 'Person'
Ответ
Если в классе вы переопределяете метод __eq__, но не определяете __hash__, то объект становится нехэшируемым, и его нельзя использовать, например, в set или в качестве ключа dict.
🔧 Почему так:
Python требует, чтобы если a == b, то hash(a) == hash(b). Поэтому, когда вы задаёте своё поведение __eq__, Python автоматически сбрасывает __hash__ в None.
Это делается во избежание несогласованного поведения в хэш-таблицах.
✅ Как исправить:
class Person:
def __init__(self, name):
self.name = name
def __eq__(self, other):
return isinstance(other, Person) andself.name == other.name
def __hash__(self):
return hash(self.name )
🟢 Когда использовать:
— Когда объекты должны быть сравнимы по значению, но также использоваться как ключи в словарях, множествах и других структурах, зависящих от хэширования.
❗️Нарушение этого правила может привести к неожиданным ошибкам и багам, особенно в больших кодовых базах.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1👏1
Рассказываю, как наш AI-бот внезапно стал утечкой и зачем всё-таки стоит ставить защиту до запуска. Быстро, по делу и с примерами, как не повторить нашу 2-часа-ночи-паника-в-Telegram ситуацию.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
SymPy — это мощная библиотека для символьных вычислений на Python.
🟢 Упрощение алгебраических выражений и работа с формулами🟢 Дифференцирование, интегрирование и пределы🟢 Решение уравнений и систем уравнений🟢 Поддержка матриц, полиномов, рядов, уравнений с модулями и др.🟢 Преобразование выражений в LaTeX и код других языков (C, Fortran)
from sympy import symbols, simplify, diff, solve, Eq
x = symbols('x')
expr = (x**2 + 2*x + 1) / (x + 1)
# Упрощение выражения
print(simplify(expr)) # ➔ x + 1
# Дифференцирование
print(diff(expr, x)) # ➔ производная по x
# Решение уравнения
eq = Eq(x**2 - 4, 0)
print(solve(eq)) # ➔ [-2, 2]
pip install sympy
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍1
Python Tips — это онлайн-книга, собравшая десятки полезных приёмов и рекомендаций по Python: от простых до продвинутых. Автор делает упор на idiomatic Python — читаемый, лаконичный и эффективный код.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
Покажу, как One Pixel атака рушит работу CV-моделей и разберу, какие архитектурные решения делают сети уязвимыми или устойчивыми к таким трюкам. Это не магия, а инженерные детали.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2
Counter из модуля collections — это удобный инструмент для подсчёта количества элементов в последовательностях. Работает как словарь, где ключи — элементы, а значения — их количество.from collections import Counter
# Подсчёт частоты символов
text = "abracadabra"
counter = Counter(text)
print(counter) # ➔ Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
# Наиболее частые элементы
print(counter.most_common(2)) # ➔ [('a', 5), ('b', 2)]
# Подсчёт слов в списке
words = ["python", "java", "python", "c++", "python", "java"]
word_counter = Counter(words)
print(word_counter) # ➔ Counter({'python': 3, 'java': 2, 'c++': 1})
Counter создаёт словарь с элементами и их количеством.most_common(n) возвращает n самых популярных элементов.Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🔥2
Модуль
logging — стандартный инструмент Python для записи логов. Он позволяет выводить сообщения разных уровней (debug, info, warning, error, critical) в консоль, файлы или другие хранилища.import logging
# Базовая конфигурация логирования
logging.basicConfig(
level=logging.DEBUG, # Минимальный уровень логов
format="%(asctime)s - %(levelname)s - %(message)s", # Формат сообщений
filename="app.log", # Логируем в файл
filemode="w" # Перезаписываем файл при каждом запуске
)
# Примеры логов разных уровней
logging.debug("Отладочное сообщение")
logging.info("Информационное сообщение")
logging.warning("Предупреждение")
logging.error("Ошибка")
logging.critical("Критическая ошибка")
basicConfig() задаёт уровень, формат и место сохранения логов.handlers. Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Перепилил рекомендации с PHP‑монолита на микросервисы с Python. Рассказываю, как разрулили хаос зависимостей, разделили зоны ответственности и получили масштабируемую систему.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Что произойдёт, если изменить mutable-объект, который используется как значение по умолчанию в аргументе функции?
Пример
def add_item(item, items=[]):
items.append(item)
return items
print(add_item(1)) # ➔ [1]
print(add_item(2)) # ➔ [1, 2]
print(add_item(3)) # ➔ [1, 2, 3]
Ответ
В Python значения по умолчанию вычисляются один раз при определении функции, а не при каждом её вызове.
Если это изменяемый объект (например, список или словарь), изменения будут сохраняться между вызовами функции.
✅ Как исправить: использовать None и инициализировать объект внутри функции.
python
Копировать
Редактировать
def add_item(item, items=None):
if items is None:
items = []
items.append(item)
return items
print(add_item(1)) # ➔ [1]
print(add_item(2)) # ➔ [2]
🟢 Когда важно помнить:
— При использовании списков, словарей, множеств как аргументов по умолчанию.
— Чтобы избежать неожиданных накоплений данных между вызовами.
Please open Telegram to view this post
VIEW IN TELEGRAM
😁5
Rich — это современная библиотека для красивого и функционального вывода в терминал на Python.
🟢 Цветной и стилизованный текст (поддержка ANSI-цветов)🟢 Таблицы, прогресс-бары, markdown, дерево файлов🟢 Подсветка синтаксиса кода прямо в терминале🟢 Логирование с цветами и форматированием🟢 Поддержка эмодзи и адаптация под размеры терминала
from rich.console import Console
from rich.table import Table
console = Console()
# Цветной текст
console.print("[bold green]Успех![/bold green] [yellow]Предупреждение[/yellow]")
# Таблица
table = Table(title="Рейтинг")
table.add_column("Имя", style="cyan")
table.add_column("Очки", style="magenta")
table.add_row("Алиса", "1500")
table.add_row("Боб", "1200")
console.print(table)
pip install rich
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤2
В этой статье узнаем как написать CI/CD для сборки Docker-образа и деплоя проекта, а также, как получить бесплатно Portainer BE.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2🔥1