cycle из модуля itertools позволяет зациклить любую последовательность, повторяя её элементы бесконечно. Полезно для создания повторяющихся шаблонов, циклических счётчиков и генераторов данных.import itertools
colors = ["red", "green", "blue"]
# Бесконечно повторяем список
for i, color in zip(range(10), itertools.cycle(colors)):
print(i, color)
# ➔ 0 red
# ➔ 1 green
# ➔ 2 blue
# ➔ 3 red
# ➔ ...
itertools.cycle(iterable) создаёт итератор, который повторяет элементы без концаzip или islice, чтобы ограничить количество повторенийPlease open Telegram to view this post
VIEW IN TELEGRAM
🔥2❤1
Расскажу, как растянуть трюк с XOR до миллиардов строк: собираю обратимый фильтр Блума, ищу тысячи пропавших ID, считаю память, бьюсь с коллизиями и показываю минимальный код. Без магии
Please open Telegram to view this post
VIEW IN TELEGRAM
Модуль
json из стандартной библиотеки позволяет легко работать с JSON — популярным форматом обмена данными между сервисами и приложениями.import json
# Пример данных
data = {
"name": "Alice",
"age": 30,
"skills": ["Python", "SQL"]
}
# Запись в JSON-строку
json_str = json.dumps(data, ensure_ascii=False, indent=4)
print(json_str)
# Запись в файл
with open("data.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=4)
# Чтение из файла
with open("data.json", "r", encoding="utf-8") as f:
loaded_data = json.load(f)
print(loaded_data)
json.dumps() — преобразует объект Python в JSON-строку.json.dump() — записывает объект прямо в файл.json.loads() — читает JSON-строку и превращает её в объект Python.json.load() — читает JSON из файлаPlease open Telegram to view this post
VIEW IN TELEGRAM
❤6
Что произойдёт, если переопределить метод __bool__ у объекта в Python?
Пример
class Weird:
def __init__(self, value):
self.value = value
def __bool__(self):
return self.value % 2 == 0 # True, только если число чётное
obj1 = Weird(2)
obj2 = Weird(3)
print(bool(obj1)) # ➔ True
print(bool(obj2)) # ➔ False
Ответ
Метод __bool__ управляет тем, как объект ведёт себя в булевом контексте (if, while, bool()).
По умолчанию, если __bool__ не определён, Python пытается вызвать __len__: объект считается True, если его длина > 0.
Если нет ни __bool__, ни __len__, объект всегда будет True.
✅ Когда использовать:
— Для кастомных структур данных, где важно задать собственные правила "пустоты" или "валидности".
— Для удобной проверки состояния объекта (if stack: ..., if db_connection: ...).
❗️Важно: __bool__ должен возвращать именно True или False, иначе Python выбросит TypeError
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Please open Telegram to view this post
VIEW IN TELEGRAM
😁26
Pendulum — это улучшенная альтернатива стандартному модулю datetime в Python. Она делает работу с датами и временем проще, удобнее и безопаснее.
🟢 Простое создание и парсинг дат/времени🟢 Поддержка временных зон "из коробки"🟢 Удобная работа с периодами и интервалами (разница дат)🟢 Форматирование дат в ISO 8601 и человеко-читаемый вид🟢 Совместимость с datetime
import pendulum
# Создание даты
dt = pendulum.datetime(2025, 5, 17, tz="Europe/Moscow")
print(dt) # ➔ 2025-05-17T00:00:00+03:00
# Парсинг строки
parsed = pendulum.parse("2025-08-16T14:30:00Z")
print(parsed.in_timezone("Europe/Moscow"))
# Разница дат
start = pendulum.date(2025, 1, 1)
end = pendulum.date(2025, 8, 16)
print(end.diff(start).in_days()) # ➔ 227
# Человекочитаемый формат
print(end.diff_for_humans(start)) # ➔ "7 months after"
pip install pendulum
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1
Прогнал домофонный архив через dlib/face_recognition на GPU: мерил скорость, собирал капризное окружение, чинил драйверы; делюсь выводами. Код на GitHub.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🤯1
PyMOTW — это серия статей с практическими примерами по модулям стандартной библиотеки: от itertools, collections и functools до asyncio, pathlib и contextlib.
Материал подан в формате «что делает модуль, когда применять и какие есть подводные камни» — с короткими, рабочими примерами.
Please open Telegram to view this post
VIEW IN TELEGRAM
lru_cache кэширует результаты функции по её аргументам, резко ускоряя повторные вызовы. Идеально для рекурсий, дорогостоящих вычислений и запросов, которые часто повторяются с одинаковыми параметрами.from functools import lru_cache
from time import perf_counter
@lru_cache(maxsize=256) # LRU-кэш на 256 последних комбинаций аргументов
def fib(n: int) -> int:
if n < 2:
return n
return fib(n - 1) + fib(n - 2)
t0 = perf_counter(); print(fib(35)); t1 = perf_counter() - t0
t0 = perf_counter(); print(fib(35)); t2 = perf_counter() - t0
print(f"Первый вызов: {t1:.4f} c, повторный: {t2:.6f} c") # второй практически мгновенный
@lru_cache(maxsize=N) запоминает результаты по хэшируемым аргументам и автоматически очищает старые записи (LRU).maxsize=None — безлимитный кэш; func.cache_clear() — сброс; func.cache_info() — статистика хитов/промахов.Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1
В статье рассказывается о создании стратегии для позиционной торговли. Показан опыт разработки инструмента для проверки торговых идей.
Описывается реализация стратегии, основанной на принципе «моментума» (когда растущие акции продолжают расти), и её улучшение с помощью оптимизации параметров.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🤔2❤1
pathlib — современный и удобный способ работать с путями, файлами и директориями кроссплатформенно. Заменяет os.path и делает код короче и понятнее.from pathlib import Path
# Базовая директория проекта
base = Path.cwd()
# Создаём папку data (если нет)
data_dir = base / "data"
data_dir.mkdir(parents=True, exist_ok=True)
# Путь к файлу
file = data_dir / "notes.txt"
# Запись текста в файл (перезапишет если существует)
file.write_text("Привет, pathlib!\n", encoding="utf-8")
# Дозапись строки
with file.open("a", encoding="utf-8") as f:
f.write("Ещё одна строка.\n")
# Чтение всего содержимого
content = file.read_text(encoding="utf-8")
print("Содержимое файла:\n", content)
# Перебор всех .txt в папке
for p in data_dir.glob("*.txt"):
print("Файл:", p.name, "| размер:", p.stat().st_size, "байт")
# Переименование файла
archived = file.with_name("notes-archived.txt")
file.rename(archived)
# Удаление файла (раскомментируйте при необходимости)
# archived.unlink()
Path — объектный путь; оператор / соединяет сегменты путей.mkdir(parents=True, exist_ok=True) создаёт дерево директорий безопасно.write_text() / read_text() — быстрые шорткаты для записи/чтения.open("a") — дозапись без перезаписи.glob("*.txt") и rglob("**/*.txt") — поиск по маске (включая рекурсивно).with_name(), rename(), unlink() — удобные операции с файламиPlease open Telegram to view this post
VIEW IN TELEGRAM
❤2
Почему этот код печатает [2, 2, 2], а не [0, 1, 2]?
Пример
# Неверно: late binding захватывает ИМЯ переменной i
funcs = [lambda: i for i in range(3)]
print([f() for f in funcs]) # ➔ [2, 2, 2]
# Верно: захватить ТЕКУЩЕЕ значение через аргумент по умолчанию
funcs = [lambda i=i: i for i in range(3)]
print([f() for f in funcs]) # ➔ [0, 1, 2]
Ответ
Лямбды/замыкания в Python делают позднее связывание (late binding): они запоминают не значение i, а имя. Когда вызов происходит, цикл уже завершён, и i == 2 для всех функций. Передача i как аргумента по умолчанию фиксирует значение в момент создания функции.
🟢 Запомнить:
В замыканиях значения берите через lambda i=i: ... или functools.partial(...).
Та же ловушка есть в comprehensions и циклах с замыканиями.
Проверяйте такие конструкции тестом — легко промахнуться.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7
Покажу PEP 723+uv: зависимости в комментариях, раннер сам ставит и запускает. Примеры, плюсы и грабли, отдельно — про риски безопасности. Без README-плясок.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Tenacity — гибкая библиотека для ретраев (повторных попыток) с поддержкой экспоненциального бэкоффа, фильтрации по исключениям/результатам и асинхронных функций. Полезна для сетевых запросов, нестабильных API и flaky-тестов.
🟢 Декларативные ретраи через декоратор @retry🟢 Стратегии ожидания: фиксированная, экспоненциальная, джиттер, лимиты🟢 Условия повтора по типам исключений или значениям результата🟢 Хуки before/after и поддержка async def
from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type
import requests
@retry(
stop=stop_after_attempt(5), # максимум 5 попыток
wait=wait_exponential(multiplier=0.5, max=8), # экспоненциальный бэкофф
retry=retry_if_exception_type((
requests.exceptions.Timeout,
requests.exceptions.ConnectionError,
)),
reraise=True # пробросить последнее исключение
)
def fetch_json(url: str) -> dict:
resp = requests.get(url, timeout=2)
resp.raise_for_status()
return resp.json()
data = fetch_json("https://httpbin.org/json")
print(data["slideshow"]["title"])
pip install tenacity
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Ресурс охватывает настройку окружений (venv/pyenv), управление зависимостями, упаковку и публикацию пакетов, тестирование, логирование, стиль кода и структуру проектов. Полезен как чеклист “best practices” для ежедневной разработки.
Материал подан структурировано с примерами и рекомендациями по инструментам, что помогает быстро выбрать правильный подход и стек под задачу.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Опишу, как в воскресенье API-гейтвей устроил бой с памятью, а простой скрипт вытащил прод: что случилось, как сработало, код, графики, постмортем и чек-лист.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2