🧱 Clojure vs Python & R: новый взгляд на манипуляцию данными
Если вы привыкли к Pandas или dplyr, переход на Clojure с библиотекой tablecloth может показаться прыжком в другую вселенную. Но именно здесь раскрывается истинная мощь функционального программирования.
⚖️ Главное отличие: иммутабельность
В Pandas выполнение
— Каждая операция возвращает новый объект.
— Вам больше не нужно держать в голове текущее состояние переменной — код становится предсказуемым и легким для тестирования.
Clojure использует «потоковый макрос»
Задача: Отфильтровать пингвинов тяжелее 3800г и оставить только длину клюва.
Pandas:
tablecloth:
Clojure — строго типизированный язык в плане операций. В отличие от R, он не будет молча сравнивать
Попытка сравнить
Решение: Нужно явно указывать значение по умолчанию, например
🧬 Функции как «граждане первого класса»
В Clojure функции — это всё. Вы можете передать набор (set) как фильтр для колонок:
📈 Группировка (Group-by)
В tablecloth группировка возвращает не абстрактный объект, а новый датасет, где одна из колонок сама содержит вложенные датасеты. Это позволяет применять к группам любые сложные трансформации как к обычным таблицам.
🔗 Ссылка на блог
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
Если вы привыкли к Pandas или dplyr, переход на Clojure с библиотекой tablecloth может показаться прыжком в другую вселенную. Но именно здесь раскрывается истинная мощь функционального программирования.
⚖️ Главное отличие: иммутабельность
В Pandas выполнение
df.rename() или добавление колонки часто мутирует (изменяет) исходный объект. В Clojure любой датасет неизменяем. — Каждая операция возвращает новый объект.
— Вам больше не нужно держать в голове текущее состояние переменной — код становится предсказуемым и легким для тестирования.
Clojure использует «потоковый макрос»
-> (threading macro), который работает как пайп |> в R или цепочки методов в Python.Задача: Отфильтровать пингвинов тяжелее 3800г и оставить только длину клюва.
Pandas:
ds[ds["mass"] > 3800]["bill_length"]tablecloth:
(-> ds
(tc/select-rows #(> (% "mass" 0) 3800))
(tc/select-columns "bill_length"))
Clojure — строго типизированный язык в плане операций. В отличие от R, он не будет молча сравнивать
nil с числом.Попытка сравнить
(> nil 3800) вызовет ошибку.Решение: Нужно явно указывать значение по умолчанию, например
(% "col" 0). Это заставляет аналитика осознанно обрабатывать пропуски, а не полагаться на «магию» библиотеки.🧬 Функции как «граждане первого класса»
В Clojure функции — это всё. Вы можете передать набор (set) как фильтр для колонок:
#{"year" "sex"} — это функция, которая проверяет наличие элемента.
(tc/select-columns ds (complement #{"year"})) — выберет всё, КРОМЕ колонки year. Чистая математическая логика в коде.
📈 Группировка (Group-by)
В tablecloth группировка возвращает не абстрактный объект, а новый датасет, где одна из колонок сама содержит вложенные датасеты. Это позволяет применять к группам любые сложные трансформации как к обычным таблицам.
🔗 Ссылка на блог
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
👍4🤩1
🛠 Проблема: «грязные» тестовые данные
Когда вы тестируете функции, работающие с многострочным текстом, JSON или сложными объектами, декоратор
Основные боли:
- Нарушение отступов: Многострочные строки (`"""`) ломают структуру кода.
- Дублирование логики: В каждом тесте приходится вызывать
- Нечитаемые ID: По умолчанию pytest генерирует ID теста из самих данных. Если данных много, лог тестов превращается в хаос.
Вместо того чтобы передавать в
1. Умная обработка данных
Ваш хелпер может сам решать, что перед ним: путь к файлу или текст.
2. Использование
Главный секрет — возвращать не просто кортеж, а
Это позволяет:
- Назначать понятные ID (имена тестов).
- Добавлять метки (например, `marks=pytest.mark.xfail`) к конкретным наборам данных.
🔗 Ссылка на статью
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
Когда вы тестируете функции, работающие с многострочным текстом, JSON или сложными объектами, декоратор
@pytest.mark.parametrize быстро превращается в «простыню» текста. Основные боли:
- Нарушение отступов: Многострочные строки (`"""`) ломают структуру кода.
- Дублирование логики: В каждом тесте приходится вызывать
textwrap.dedent или Path().read_text().- Нечитаемые ID: По умолчанию pytest генерирует ID теста из самих данных. Если данных много, лог тестов превращается в хаос.
Вместо того чтобы передавать в
parametrize сырой список кортежей, создайте функцию (например, `nb_case`), которая подготавливает данные.1. Умная обработка данных
Ваш хелпер может сам решать, что перед ним: путь к файлу или текст.
def nb_case(text, short, long, id=None):
if "\n" in text:
# Это текст: убираем лишние отступы
text = textwrap.dedent(text.lstrip("\n"))
else:
# Это путь: читаем файл
id = id or text
text = Path(text).read_text()
# Возвращаем специальный объект pytest.param
return pytest.param(text, short, long, id=id)
2. Использование
pytest.paramГлавный секрет — возвращать не просто кортеж, а
pytest.param. Это позволяет:
- Назначать понятные ID (имена тестов).
- Добавлять метки (например, `marks=pytest.mark.xfail`) к конкретным наборам данных.
🔗 Ссылка на статью
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
👍7❤🔥2❤1
🤝 3 признака дружелюбного класса
Чтобы класс не вызывал раздражения при использовании, он должен обладать тремя качествами:
1️⃣ Понятные аргументы: конструктор (`__init__`) принимает только то, что действительно нужно для создания объекта.
2️⃣ Красивое строковое представление: реализация метода
3️⃣ Логичное сравнение: реализация
⚡️ Dataclasses: дружелюбность «из коробки»
В современных версиях Python (3.7+) лучший способ создать дружелюбный класс — использовать декоратор
Результат: вы написали 5 строк кода, но получили функционал, на который вручную ушло бы 15. Это экономит время и страхует от опечаток.
🛠 Когда можно быть «недружелюбным»?
➡️ Сравнение: Не нужно добавлять
➡️ Строковое представление: Если у объекта нет значимых данных для показа (например, итератор
Если класс должен уметь что-то специфическое, используйте другие магические методы (dunder methods):
➡️
➡️
Главный совет: Используйте
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
Чтобы класс не вызывал раздражения при использовании, он должен обладать тремя качествами:
__repr__. Вместо <Point object at 0x...> вы должны видеть Point(x=1, y=2, z=3). Это критично для логирования и отладки.__eq__. По умолчанию Python сравнивает объекты по адресу в памяти. В дружелюбном классе два объекта с одинаковыми данными должны быть равны (`p1 == p2`).⚡️ Dataclasses: дружелюбность «из коробки»
В современных версиях Python (3.7+) лучший способ создать дружелюбный класс — использовать декоратор
@dataclass. Он автоматически генерирует методы __init__, __repr__ и __eq__ за вас.
from dataclasses import dataclass
@dataclass
class Point:
x: float
y: float
z: float
Результат: вы написали 5 строк кода, но получили функционал, на который вручную ушло бы 15. Это экономит время и страхует от опечаток.
🛠 Когда можно быть «недружелюбным»?
__eq__ для объектов, у которых нет состояния (например, соединение с БД или логгер). Там важна идентичность объекта, а не равенство данных.enumerate`), стандартный `__repr__ вполне уместен.Если класс должен уметь что-то специфическое, используйте другие магические методы (dunder methods):
__iter__: позволит распаковывать объект как кортеж (`x, y, z = point`).__add__ / __sub__: если вы хотите складывать или вычитать объекты (например, векторы).Главный совет: Используйте
dataclasses как мерило. Если ваш обычный класс менее удобен, чем аналогичный @dataclass, значит, его пора «подружить» с пользователем.📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🤩1
⚡️ Срочно: Python Steering Council официально утвердил PEP 804 — «Strict Logic Mode»
В ветку Python 3.15.0a8 (релиз ожидается на следующей неделе) внезапно добавили механизм Boolean Enforcement, который вызвал бурю обсуждений в почтовой рассылке core-разработчиков.
Что меняется:
Интерпретатор теперь будет выдавать
Пример «устаревшего» кода:
Как нужно писать теперь (Strict Style):
Гвидо ван Россум в своем блоге пояснил, что это первый шаг к отказу от философии «Duck Typing» в пользу «Explicit Logic». По его словам, это позволит JIT-компилятору оптимизировать байт-код на 0.04% быстрее, так как ему не нужно проверять магический метод
Разработчики Django уже заявили, что им придется переписать около 400 000 строк кода, а автор библиотекигорящим домом и с 1 апреля!
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
В ветку Python 3.15.0a8 (релиз ожидается на следующей неделе) внезапно добавили механизм Boolean Enforcement, который вызвал бурю обсуждений в почтовой рассылке core-разработчиков.
Что меняется:
Интерпретатор теперь будет выдавать
RuntimeWarning, если вы используете «неявное» приведение к bool в условиях. Пример «устаревшего» кода:
items = []
if not items: # Теперь это вызовет Warning: "Implicit empty list evaluation"
print("Empty")
Как нужно писать теперь (Strict Style):
if len(items) == 0: # Официально одобренный синтаксис
print("Empty")
Гвидо ван Россум в своем блоге пояснил, что это первый шаг к отказу от философии «Duck Typing» в пользу «Explicit Logic». По его словам, это позволит JIT-компилятору оптимизировать байт-код на 0.04% быстрее, так как ему не нужно проверять магический метод
__bool__ у объектов в каждом if.Разработчики Django уже заявили, что им придется переписать около 400 000 строк кода, а автор библиотеки
Pydantic просто скинул в чат эмодзи с 📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
😁30👍4❤3😢3🤩2🥰1
🐍 25 лет «бага» в Python, который никто не исправил
1 апреля 2026 года исполнился ровно 9731 день с момента, как сообщество Python узнало о… странности в работе со строками.
Суть проста:
возвращает
хотя «логичнее» было бы получить что-то вроде:
Ещё в 1999 году разработчик Jim Fulton указывал на эту проблему. Прошли десятилетия, сменились версии Python — но «исправления» так и не появилось.
Автор статьи решили разобраться и «починить» это сами:
— начали с конкатенации строк (`PyUnicode_Concat`)
— затем добрались до .join()
— столкнулись с format, f-строками и даже конкатенацией на этапе компиляции
В итоге стало понятно: дело не в вычислении — а в отображении.
Финальный «фикс» — перехват вывода через print и REPL (`sys_displayhook`).
Теперь независимо от способа объединения строк:
получаем:
(если убрать print — магия исчезает 😄)
Вывод:
иногда проще изменить то, как мы видим результат, чем сам результат. И да — это отличный повод покопаться в исходниках Python.
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
1 апреля 2026 года исполнился ровно 9731 день с момента, как сообщество Python узнало о… странности в работе со строками.
Суть проста:
"42 monkeys" + "1 snake"
возвращает
"42 monkeys1 snake"
хотя «логичнее» было бы получить что-то вроде:
"41 monkeys and 1 fat snake"
Ещё в 1999 году разработчик Jim Fulton указывал на эту проблему. Прошли десятилетия, сменились версии Python — но «исправления» так и не появилось.
Автор статьи решили разобраться и «починить» это сами:
— начали с конкатенации строк (`PyUnicode_Concat`)
— затем добрались до .join()
— столкнулись с format, f-строками и даже конкатенацией на этапе компиляции
В итоге стало понятно: дело не в вычислении — а в отображении.
Финальный «фикс» — перехват вывода через print и REPL (`sys_displayhook`).
Теперь независимо от способа объединения строк:
print("42 monkeys" + "1 snake")
получаем:
"41 monkeys and 1 fat snake"
(если убрать print — магия исчезает 😄)
Вывод:
иногда проще изменить то, как мы видим результат, чем сам результат. И да — это отличный повод покопаться в исходниках Python.
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
😁22❤2🙏1
✌🏻 У нас две новости — хорошая и плохая!
Хорошая: Ваших знаний, скорее всего, хватит, чтобы собрать рабочую демку AI-агента в Colab. 🫡
Плохая: Вы вряд ли выведете его в прод, не обанкротившись на токенах и не слив базу. 🤯
Для защиты от таких сценариев мы полностью пересобрали курс «Разработка AI-агентов». Теперь внутри плотная работа с экономикой ресурсов, дебаг через time-travel в
Программа курса, полный состав спикеров и другие подробности 👈🏻
ВАЖНО! До 5 апреля на курс действует скидка, но свободные места могут закончиться раньше.
Хорошая: Ваших знаний, скорее всего, хватит, чтобы собрать рабочую демку AI-агента в Colab. 🫡
Плохая: Вы вряд ли выведете его в прод, не обанкротившись на токенах и не слив базу. 🤯
Для защиты от таких сценариев мы полностью пересобрали курс «Разработка AI-агентов». Теперь внутри плотная работа с экономикой ресурсов, дебаг через time-travel в
LangGraph, извлечение данных из кривых сканов для RAG и комплаенс по 152-ФЗ.Если всё ещё сомневаетесь, послушайте голосовое от спикера курса Влада Прошинского, где он объясняет, как правильно тестировать агентов перед релизом.
Программа курса, полный состав спикеров и другие подробности 👈🏻
ВАЖНО! До 5 апреля на курс действует скидка, но свободные места могут закончиться раньше.
❤2👾1
🚀 ironkernel: сила NumPy, производительность Rust и свобода от GIL
Если вам знакома ситуация, когда NumPy перестает справляться, а писать расширения на C++ или Rust вручную слишком долго, обратите внимание на ironkernel. Это библиотека, которая позволяет писать выражения на Python (DSL), а исполнять их параллельно на Rust через движок Rayon.
Проект объединяет два мира:
1. Python DSL: Вы пишете привычный код с использованием декораторов или выражений.
2. Rust Engine: Код компилируется в промежуточное представление (IR), после чего Python отпускает GIL, и Rust задействует все ядра процессора для вычислений.
Самый простой способ — использовать декоратор
Авторы пошли дальше и внедрили в Python каналы в стиле Go (`chan` и `select`). Это позволяет строить конвейеры данных, где результат одной задачи передается в другую без лишних блокировок.
🔗 Ссылка на проект
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
Если вам знакома ситуация, когда NumPy перестает справляться, а писать расширения на C++ или Rust вручную слишком долго, обратите внимание на ironkernel. Это библиотека, которая позволяет писать выражения на Python (DSL), а исполнять их параллельно на Rust через движок Rayon.
Проект объединяет два мира:
1. Python DSL: Вы пишете привычный код с использованием декораторов или выражений.
2. Rust Engine: Код компилируется в промежуточное представление (IR), после чего Python отпускает GIL, и Rust задействует все ядра процессора для вычислений.
Самый простой способ — использовать декоратор
@kernel.elementwise. Он превращает обычную функцию в параллельный кернел:
import numpy as np
from ironkernel import kernel, rt
@kernel.elementwise
def saxpy(a, x, y):
return a * x + y
# Подготовка данных
bx = rt.asarray(np.arange(1_000_000, dtype=np.float64))
by = rt.asarray(np.ones(1_000_000, dtype=np.float64))
# Запуск в Rust-рантайме (GIL отпущен!)
task = rt.go(kernel.map(saxpy, a=2.0, x=bx, y=by))
result = task.result().numpy()
Авторы пошли дальше и внедрили в Python каналы в стиле Go (`chan` и `select`). Это позволяет строить конвейеры данных, где результат одной задачи передается в другую без лишних блокировок.
out_ch = chan(4)
# Результат вычисления сразу летит в канал
rt.go(kernel.map(double, x=src), out=out_ch)
buf = out_ch.recv() # Получаем данные асинхронно
🔗 Ссылка на проект
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
❤2👍2
🕰 Почему стоит перейти на Pendulum
Работа со стандартным модулем
Pendulum — это библиотека, которая делает работу со временем интуитивной. Это «Drop-in replacement» для стандартного
1. Забудьте про «наивные» объекты. В Pendulum каждый экземпляр по умолчанию знает свою таймзону (UTC по умолчанию). Смена пояса делается одним методом:
2. Хотите вывести «2 минуты назад» или «через неделю»? Метод
3. Библиотека сама обрабатывает переходы на летнее время и «несуществующие» часы.
4. Вместо создания громоздких объектов
Установка:
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
Работа со стандартным модулем
datetime в Python часто напоминает прогулку по минному полю: наивные объекты, путаница с таймзонами и неудобная арифметика. Pendulum — это библиотека, которая делает работу со временем интуитивной. Это «Drop-in replacement» для стандартного
datetime: она наследуется от него, поэтому в 99% случаев вы просто меняете импорт и всё продолжает работать.1. Забудьте про «наивные» объекты. В Pendulum каждый экземпляр по умолчанию знает свою таймзону (UTC по умолчанию). Смена пояса делается одним методом:
now_in_paris = pendulum.now('Europe/Paris')
in_utc = now_in_paris.in_timezone('UTC')
2. Хотите вывести «2 минуты назад» или «через неделю»? Метод
diff_for_humans() сделает это за вас, причём с поддержкой локализации.
past = pendulum.now().subtract(minutes=2)
print(past.diff_for_humans()) # '2 minutes ago'
3. Библиотека сама обрабатывает переходы на летнее время и «несуществующие» часы.
# 2:30 в Париже 31 марта 2013 года не существовало из-за перехода
pendulum.datetime(2013, 3, 31, 2, 30, tz='Europe/Paris')
# Результат автоматически нормализуется в 03:30
4. Вместо создания громоздких объектов
timedelta, используйте простые методы add() и subtract().
tomorrow = pendulum.now().add(days=1)
last_week = pendulum.now().subtract(weeks=1)
Установка:
pip install pendulum📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
👍17❤2
🧱 Cложность AsyncIO
Мы нашли интересную статью, в которой автор выделяет несколько фундаментальных проблем стандартной библиотеки Python:
– Огромное количество абстракций (Handle, Future, Task, Protocol, Transport). Мало кто может внятно объяснить разницу между ними.
– Дизайн
– Почему для работы с сокетом нужно вызывать методы цикла событий? Дизайн кажется перегруженным.
Вместо нагромождения объектов, TonIO сводит всё к двум сущностям: Event (Событие) и Waiter (Ожидающий).
1. Event: Простая обертка над атомарным флагом.
2. Waiter: Связующее звено между точкой приостановки (корутиной) и событием, которого она ждет.
Когда корутина доходит до
TonIO спроектирован в стиле Rust-библиотеки Tokio:
🔛 С помощью одного декоратора
🔛 Главный поток Python (Main Thread) занимается исключительно низкоуровневым вводом-выводом (I/O). Весь прикладной код пользователя выполняется в отдельном пуле потоков. Вы больше не привязаны к «особому» главному потоку.
Готовы ли вы отказаться от совместимости со старыми библиотеками ради кратного роста производительности на современных многоядерных процессорах? 👇
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
Мы нашли интересную статью, в которой автор выделяет несколько фундаментальных проблем стандартной библиотеки Python:
– Огромное количество абстракций (Handle, Future, Task, Protocol, Transport). Мало кто может внятно объяснить разницу между ними.
– Дизайн
asyncio завязан на идее «одного главного потока», что выглядит анахронизмом в эпоху Python без глобальной блокировки интерпретатора.– Почему для работы с сокетом нужно вызывать методы цикла событий? Дизайн кажется перегруженным.
Вместо нагромождения объектов, TonIO сводит всё к двум сущностям: Event (Событие) и Waiter (Ожидающий).
1. Event: Простая обертка над атомарным флагом.
2. Waiter: Связующее звено между точкой приостановки (корутиной) и событием, которого она ждет.
Когда корутина доходит до
await, она порождает Waiter, который регистрируется в цикле. Как только событие происходит (флаг меняется), Waiter «просыпается» и ставит корутину обратно в очередь на исполнение. Никаких «фьючерсов» в классическом понимании.TonIO спроектирован в стиле Rust-библиотеки Tokio:
@tonio.main ваш код запускается на всех доступных ядрах процессора.Готовы ли вы отказаться от совместимости со старыми библиотеками ради кратного роста производительности на современных многоядерных процессорах? 👇
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍7
📚Напоминаем про наш полный курс «Самоучитель по Python для начинающих»
Мы написали и собрали для вас в одну подборку все 25 глав и 230 практических заданий!
🐍 Часть 1: Особенности, сферы применения, установка, онлайн IDE
🐍 Часть 2: Все, что нужно для изучения Python с нуля – книги, сайты, каналы и курсы
🐍 Часть 3: Типы данных: преобразование и базовые операции
🐍 Часть 4: Методы работы со строками
🐍 Часть 5: Методы работы со списками и списковыми включениями
🐍 Часть 6: Методы работы со словарями и генераторами словарей
🐍 Часть 7: Методы работы с кортежами
🐍 Часть 8: Методы работы со множествами
🐍 Часть 9: Особенности цикла for
🐍 Часть 10: Условный цикл while
🐍 Часть 11: Функции с позиционными и именованными аргументами
🐍 Часть 12: Анонимные функции
🐍 Часть 13: Рекурсивные функции
🐍 Часть 14: Функции высшего порядка, замыкания и декораторы
🐍 Часть 15: Методы работы с файлами и файловой системой
🐍 Часть 16: Регулярные выражения
🐍 Часть 17: Основы скрапинга и парсинга
🐍 Часть 18: Основы ООП – инкапсуляция и наследование
🐍 Часть 19: Основы ООП – абстракция и полиморфизм
🐍 Часть 20: Графический интерфейс на Tkinter
🐍 Часть 21: Основы разработки игр на Pygame
🐍 Часть 22: Основы работы с SQLite
🐍 Часть 23: Основы веб-разработки на Flask
🐍 Часть 24: Основы работы с NumPy
🐍 Часть 25: Основы анализа данных с Pandas
Мы написали и собрали для вас в одну подборку все 25 глав и 230 практических заданий!
🐍 Часть 1: Особенности, сферы применения, установка, онлайн IDE
🐍 Часть 2: Все, что нужно для изучения Python с нуля – книги, сайты, каналы и курсы
🐍 Часть 3: Типы данных: преобразование и базовые операции
🐍 Часть 4: Методы работы со строками
🐍 Часть 5: Методы работы со списками и списковыми включениями
🐍 Часть 6: Методы работы со словарями и генераторами словарей
🐍 Часть 7: Методы работы с кортежами
🐍 Часть 8: Методы работы со множествами
🐍 Часть 9: Особенности цикла for
🐍 Часть 10: Условный цикл while
🐍 Часть 11: Функции с позиционными и именованными аргументами
🐍 Часть 12: Анонимные функции
🐍 Часть 13: Рекурсивные функции
🐍 Часть 14: Функции высшего порядка, замыкания и декораторы
🐍 Часть 15: Методы работы с файлами и файловой системой
🐍 Часть 16: Регулярные выражения
🐍 Часть 17: Основы скрапинга и парсинга
🐍 Часть 18: Основы ООП – инкапсуляция и наследование
🐍 Часть 19: Основы ООП – абстракция и полиморфизм
🐍 Часть 20: Графический интерфейс на Tkinter
🐍 Часть 21: Основы разработки игр на Pygame
🐍 Часть 22: Основы работы с SQLite
🐍 Часть 23: Основы веб-разработки на Flask
🐍 Часть 24: Основы работы с NumPy
🐍 Часть 25: Основы анализа данных с Pandas
🔥1🥱1
🐍 Как сделать свой объект итерируемым в Python через `__getitem__`
В Python итерируемый объект — это любой объект, по которому можно пройтись в цикле for. Обычно это списки, строки, словари… но вы можете создать свой собственный!
👇 Секрет — метод `__getitem__`
Если ваш класс поддерживает доступ по индексам (`obj[0]`, obj[1] и т.д.), Python автоматически сможет итерироваться по нему.
Пример: арифметическая последовательность
Использование:
💡 Почему это работает?
Python просто пытается вызывать __getitem__(0), __getitem__(1), `__getitem__(2)`…
И продолжает, пока не получит IndexError.
⚠️ Важно:
Если вы выбрасываете другую ошибку (например, `KeyError`), итерация сломается.
Пример неправильной реализации:
Здесь Python не понимает, когда остановиться — и падает с ошибкой.
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
В Python итерируемый объект — это любой объект, по которому можно пройтись в цикле for. Обычно это списки, строки, словари… но вы можете создать свой собственный!
👇 Секрет — метод `__getitem__`
Если ваш класс поддерживает доступ по индексам (`obj[0]`, obj[1] и т.д.), Python автоматически сможет итерироваться по нему.
Пример: арифметическая последовательность
class ArithmeticSequence:
def __init__(self, start: int, step: int, total: int) -> None:
self.start = start
self.step = step
self.total = total
def __getitem__(self, index: int) -> int:
if not 0 <= index < self.total:
raise IndexError(f"Invalid index {index}.")
return self.start + index * self.step
Использование:
seq = ArithmeticSequence(5, 3, 6)
print(seq[3]) # 14
for value in seq:
print(value, end=", ")
# 5, 8, 11, 14, 17, 20,
💡 Почему это работает?
Python просто пытается вызывать __getitem__(0), __getitem__(1), `__getitem__(2)`…
И продолжает, пока не получит IndexError.
⚠️ Важно:
Если вы выбрасываете другую ошибку (например, `KeyError`), итерация сломается.
Пример неправильной реализации:
class DictWrapper:
def __init__(self, values):
self.values = values
def __getitem__(self, index):
return self.values[index]
Здесь Python не понимает, когда остановиться — и падает с ошибкой.
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
❤5👍4🔥4
Python Шпаргалка.pdf
4.7 MB
🐍 Простой Python Cheatsheet… но неожиданно мощный
Наткнулись на него и решили — точно стоит поделиться 👇
Он максимально:
• чистый
• структурированный
• без лишней воды
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
Наткнулись на него и решили — точно стоит поделиться 👇
Он максимально:
• чистый
• структурированный
• без лишней воды
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
👍2🔥2❤1
Python 3.3, вышедшая в сентябре 2012 года, часто незаслуженно забывается на фоне громких релизов вроде 3.5 (async/await) или 3.10 (pattern matching). Однако именно эта версия заложила фундамент, на котором стоит современная разработка.
Вот три ключевые инновации, которые навсегда изменили экосистему Python.
1.
До Python 3.3 объединение генераторов требовало написания громоздких циклов
🔛 Вместо ручного перебора значений, вы просто «пробрасываете» управление.
🔛
🔛 Без этой механики появление
2.
До 3.3 разработчики зависели от стороннего инструмента
🔛 Теперь создание изолированного окружения для каждого проекта стало встроенной функцией языка (`python -m venv env`).
🔛 Это убило проблему «на моей машине работает», сделав использование
3. Namespace Packages: пакеты без границ
Раньше каждая папка в Python должна была содержать файл
🔛 Теперь один логический пакет (например, `company.tools`) может быть физически разбит на несколько разных репозиториев или директорий.
🔛 Это упростило жизнь разработчикам плагинов и больших распределенных библиотек, избавив их от конфликтов при совпадении имен корневых папок.
🔗 Ссылка на полную статью
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
Вот три ключевые инновации, которые навсегда изменили экосистему Python.
1.
yield from: фундамент асинхронностиДо Python 3.3 объединение генераторов требовало написания громоздких циклов
for. Инструкция yield from позволила одному генератору полностью делегировать работу другому.yield from автоматически обрабатывает передачу значений через .send() и проброс исключений внутрь цепочки.async/await в будущем было бы невозможно. Ключевое слово await — это, по сути, синтаксический сахар над yield from.2.
venv: стандартизация окруженийДо 3.3 разработчики зависели от стороннего инструмента
virtualenv. Релиз 3.3 ввел модуль venv прямо в стандартную библиотеку.requirements.txt в связке с виртуальным окружением золотым стандартом индустрии.3. Namespace Packages: пакеты без границ
Раньше каждая папка в Python должна была содержать файл
__init__.py, чтобы считаться пакетом. Python 3.3 ввел неявные пространства имен (Implicit Namespace Packages).🔗 Ссылка на полную статью
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥6❤3👍1
📦 pixi: Универсальный менеджер пакетов для Python и C++
Если вы работаете в Data Science или AI, то наверняка сталкивались с «болью» системных зависимостей. Популярный сейчас uv невероятно быстр, но он бессилен, когда нужно установить не просто Python-библиотеку, а скомпилированные C++ пакеты (например, GDAL для геоданных или CUDA для GPU).
В чем проблема uv
Он управляет только пакетами из PyPI. Если вашему проекту нужны системные библиотеки, их приходится ставить вручную через
Почему стоит присмотреться к pixi
Это современная альтернатива conda, написанная на Rust, которая объединяет лучшее из миров uv и conda:
✅ Ставит и Python-пакеты (PyPI), и скомпилированные системные библиотеки (conda-forge) одной командой.
✅ Работает в 10–100 раз быстрее стандартной conda.
✅ В
✅ Забудьте про сложные Makefile. Вы можете прописать команды запуска (train, test, preprocess) прямо в конфиге.
✅ Одна команда
👇 Подробный разбор и примеры настройки — в статье.
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
Если вы работаете в Data Science или AI, то наверняка сталкивались с «болью» системных зависимостей. Популярный сейчас uv невероятно быстр, но он бессилен, когда нужно установить не просто Python-библиотеку, а скомпилированные C++ пакеты (например, GDAL для геоданных или CUDA для GPU).
В чем проблема uv
Он управляет только пакетами из PyPI. Если вашему проекту нужны системные библиотеки, их приходится ставить вручную через
apt-get или brew. Это рушит воспроизводимость: ваш коллега на другой ОС может потратить часы, пытаясь собрать окружение.Почему стоит присмотреться к pixi
Это современная альтернатива conda, написанная на Rust, которая объединяет лучшее из миров uv и conda:
✅ Ставит и Python-пакеты (PyPI), и скомпилированные системные библиотеки (conda-forge) одной командой.
✅ Работает в 10–100 раз быстрее стандартной conda.
✅ В
pixi.lock фиксируются абсолютно все зависимости, включая системные библиотеки, что гарантирует идентичность окружения на любом компьютере.✅ Забудьте про сложные Makefile. Вы можете прописать команды запуска (train, test, preprocess) прямо в конфиге.
✅ Одна команда
pixi install разворачивает проект на Windows, macOS и Linux без «танцев с бубном».👇 Подробный разбор и примеры настройки — в статье.
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
👍7🔥1
Python_Questions.pdf
6.6 MB
👇 Нашли классный материал и точно стоит им поделиться.
Это структурированный PDF с 84 задачами по Python с решениями, который отлично подойдёт для практики и быстрого ревью.
Что внутри:
• разнообразные задачи разного уровня
• понятные решения
• удобная структура для постепенного обучения
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
Это структурированный PDF с 84 задачами по Python с решениями, который отлично подойдёт для практики и быстрого ревью.
Что внутри:
• разнообразные задачи разного уровня
• понятные решения
• удобная структура для постепенного обучения
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
👍8🤩2
Forwarded from Библиотека задач по Data Science | тесты, код, задания
👍2🔥2
🕵️♂️ pywho: команда, которая знает о вашем Python всё
Каждый разработчик проходил через ад отладки, когда
pywho — это «детектор лжи» для вашего окружения. Одна команда заменяет копание в
Что умеет pywho
1. Полная инспекция среды (`pywho`)
Мгновенно показывает: какой интерпретатор запущен, версию Python, архитектуру и — самое главное — тип виртуального окружения (`venv`,
2. Трассировка импорта (`pywho trace <module>`)
Отвечает на вопрос: «Откуда именно загрузился этот пакет?». Инструмент показывает полный путь к файлу и весь порядок поиска в
3. Поиск «теней» (`pywho scan .`)
Обнаруживает классическую ошибку, когда ваш файл (например,
Установка:
(Важно: устанавливайте в то окружение, которое хотите проверить).
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
Каждый разработчик проходил через ад отладки, когда
import requests внезапно выдает ошибку, а which python показывает совсем не то, что вы ожидали. pywho — это «детектор лжи» для вашего окружения. Одна команда заменяет копание в
sys.path и проверку переменных окружения.Что умеет pywho
1. Полная инспекция среды (`pywho`)
Мгновенно показывает: какой интерпретатор запущен, версию Python, архитектуру и — самое главное — тип виртуального окружения (`venv`,
uv, conda, poetry или `pipenv`).2. Трассировка импорта (`pywho trace <module>`)
Отвечает на вопрос: «Откуда именно загрузился этот пакет?». Инструмент показывает полный путь к файлу и весь порядок поиска в
sys.path. 3. Поиск «теней» (`pywho scan .`)
Обнаруживает классическую ошибку, когда ваш файл (например,
json.py или `math.py`) перекрывает стандартную библиотеку Python. Это одна из самых частых причин странных багов у новичков.Установка:
pip install pywho (Важно: устанавливайте в то окружение, которое хотите проверить).
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
👍8❤4