Библиотека Python разработчика | Книги по питону
Погружение в CPython и архитектуру. Разбираем неочевидное поведение (GIL, Memory), Best Practices (SOLID, DDD) и тонкости Django/FastAPI. Решаем задачи с подвохом и оптимизируем алгоритмы. 🐍 По всем вопросам @evgenycarter РКН clck.ru/3Ko7Hq
Ko'proq ko'rsatish📈 Telegram kanali Библиотека Python разработчика | Книги по питону analitikasi
Библиотека Python разработчика | Книги по питону (@bookpython) Rus til segmentidagi kanali faol ishtirokchi. Hozirda hamjamiyat 18 326 obunachidan iborat bo'lib, Texnologiyalar & Aralashmalar toifasida 7 317-o'rinni va Rossiya mintaqasida 36 872-o'rinni egallagan.
📊 Auditoriya ko‘rsatkichlari va dinamika
невідомо sanasidan buyon loyiha tez o‘sib, 18 326 obunachiga ega bo‘ldi.
05 Iyun, 2026 dagi oxirgi ma’lumotlarga ko‘ra kanal barqaror faollikka ega. Oxirgi 30 kunda obunachilar soni -86 ga, so‘nggi 24 soatda esa -1 ga o‘zgardi va umumiy qamrov yuqori darajada qolmoqda.
- Tasdiqlash holati: Tasdiqlanmagan
- Jalb etish (ER): Auditoriya o‘rtacha 6.08% darajada jalb etiladi. Nashrdan keyingi dastlabki 24 soatda kontent odatda umumiy obunachilar sonining 2.60% ini tashkil etuvchi reaksiyalarni to‘playdi.
- Post qamrovi: Har bir post o‘rtacha 1 114 marta ko‘riladi; birinchi sutkada odatda 477 ta ko‘rish yig‘iladi.
- Reaksiyalar va o‘zaro ta’sir: Auditoriya faol: har bir postga o‘rtacha 2 ta reaksiya keladi.
- Tematik yo‘nalishlar: Kontent numbers, yield, модуль, none, декоратор kabi asosiy mavzularga jamlangan.
📝 Tavsif va kontent siyosati
Muallif resursni shaxsiy fikrni ifoda etish maydoni sifatida ta’riflaydi:
“Погружение в CPython и архитектуру. Разбираем неочевидное поведение (GIL, Memory), Best Practices (SOLID, DDD) и тонкости Django/FastAPI. Решаем задачи с подвохом и оптимизируем алгоритмы. 🐍
По всем вопросам @evgenycarter
РКН clck.ru/3Ko7Hq”
Yuqori yangilanish chastotasi (oxirgi ma’lumot 06 Iyun, 2026 da olingan) sababli kanal doimo dolzarb va katta qamrovli bo‘lib qoladi. Analitika auditoriya kontent bilan faol hamkorlik qilishini, uni Texnologiyalar & Aralashmalar toifasidagi muhim ta’sir nuqtasiga aylantirishini ko‘rsatadi.
asyncio, если корутина выбрасывает исключение, оно передаётся в тот код, который ожидает соответствующий future. Если await вызывается в нескольких местах, то каждое из них получит это исключение (так как оно сохраняется внутри объекта исключения). Следующий код напечатает сообщение об ошибке пять раз:
import asyncio
async def error():
await asyncio.sleep(1)
raise ValueError()
async def waiter(task):
try:
await task
except ValueError:
print('error')
else:
print('OK')
async def main():
task = asyncio.get_event_loop().create_task(error())
for _ in range(5):
asyncio.get_event_loop().create_task(waiter(task))
await asyncio.sleep(2)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
Если исключение выброшено, но задача (task) ни разу не была ожидаема (awaited), исключение будет потеряно. В таком случае при уничтожении задачи вы получите предупреждение: “Task exception was never retrieved”.
Когда вы используете await asyncio.gather(tasks) и одна из задач выбрасывает исключение, оно передаётся наружу. Однако если несколько задач выбросят исключения, вы получите только первое, остальные будут проигнорированы:
import asyncio
async def error(i):
await asyncio.sleep(1)
raise ValueError(i)
async def main():
try:
await asyncio.gather(
error(1),
error(2),
error(3),
)
except ValueError as e:
print(e)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
Вы можете использовать gather с параметром return_exceptions=True, чтобы получать исключения как обычные значения. Следующий код напечатает: [42, ValueError(2,), ValueError(3,)]
import asyncio
async def error(i):
await asyncio.sleep(1)
if i > 1:
raise ValueError(i)
return 42
async def main():
results = await asyncio.gather(
error(1),
error(2),
error(3),
return_exceptions=True,
)
print(results)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
👉@BookPython
>>> print = 42
>>> print(42)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
Это может быть полезно, если ваш модуль определяет какие-то функции с теми же именами, что и встроенные. Такое также случается при метапрограммировании, когда вы принимаете произвольную строку в качестве идентификатора.
Тем не менее, даже если вы затеняете (shadow) некоторые встроенные имена, вам всё ещё может понадобиться доступ к оригинальным объектам, на которые они изначально ссылались. Для этого существует модуль builtins:
>>> import builtins
>>> print = 42
>>> builtins.print(1)
1
Также переменная __builtins__ доступна в большинстве модулей. Однако здесь есть нюанс. Во-первых, это деталь реализации CPython, и обычно её вообще не стоит использовать. Во-вторых, __builtins__ может ссылаться либо на builtins, либо на builtins.__dict__, в зависимости от того, как именно был загружен текущий модуль.
👉@BookPythonpy-spy.
🔍 Что такое py-spy?
py-spy — это sampling-профайлер для Python, который не требует модификации кода и может подключаться к уже работающим процессам. Он написан на Rust, работает очень быстро и почти не влияет на производительность.
🛠 Установка:
pip install py-spy
Или, если хочется поставить бинарник напрямую:
curl -sSL https://install.python-poetry.org | python3 -
🚀 Примеры использования:
1. Снять снимок с работающего процесса:
py-spy top --pid 12345
Альтернатива htop, но показывает, какие функции Python жрут CPU.
2. Записать flamegraph:
py-spy record -o profile.svg --pid 12345
Откроется красивая SVG-шечка, где видно, куда утекает время выполнения.
3. Запустить скрипт с профилированием:
py-spy top -- python my_script.py
🧠 Зачем это нужно?
- Падает производительность? Посмотри, какие функции грузят процессор.
- Программа зависла? Снимок покажет, где именно.
- Хотите оптимизировать горячие участки? Flamegraph быстро выведет подозреваемых.
🔥 Совет от меня: py-spy умеет работать с контейнерами и виртуальными окружениями, просто указывайте --pid правильного процесса. Идеален для DevOps'а и продакшн-серверов.
👉@BookPythonsys.builtin_module_names. Среди них можно отметить sys, gc, time и другие.
Обычно не имеет значения, является ли модуль встроенным, однако стоит учитывать, что import всегда сначала ищет модуль среди встроенных. То есть встроенный модуль sys будет загружен, даже если у вас в каталоге есть файл sys.py. С другой стороны, если у вас, например, есть datetime.py в текущей директории, он действительно может быть загружен вместо стандартного модуля datetime.
👉@BookPythonpdb.
🔍 Быстрая отладка с pdb
Часто, когда код не работает как надо, мы начинаем закидывать print()-ами. Но это неудобно, медленно и мусорит код. Вместо этого вставь в нужное место строчку:
import pdb; pdb.set_trace()
Когда выполнение дойдет до этой строки, ты попадешь в интерактивную консоль отладчика прямо в терминале. Дальше можно:
- n (next) — перейти к следующей строке;
- s (step) — зайти внутрь функции;
- c (continue) — продолжить выполнение;
- l (list) — показать текущий контекст;
- p var — вывести значение переменной var.
💡 Пример
def calc(a, b):
import pdb; pdb.set_trace()
result = a + b
return result
calc(2, 3)
На строке с pdb.set_trace() ты остановишься и сможешь изучить, что происходит внутри.
Зачем это нужно?
- Понять, почему что-то идет не так.
- Посмотреть, какие значения у переменных прямо в момент ошибки.
- Быстро отладить без запуска IDE — удобно в Docker, SSH или при работе с cron.
Попробуй — один раз освоишь, и уже не захочешь возвращаться к print().
👉@BookPython
a = b = c = 42
Выглядит как цепочка присваиваний в C, но работает совершенно иначе. В C результат одного присваивания используется в следующем:
a = (b = (c = 42))
В Python всё не так. Операция присваивания не возвращает результат — это оператор, а не выражение. Вместо этого происходит несколько присваиваний слева направо:
2 0 LOAD_CONST 1 (42)
2 DUP_TOP
4 STORE_FAST 0 (a)
6 DUP_TOP
8 STORE_FAST 1 (b)
10 STORE_FAST 2 (c)
👉@BookPython__hash__, который возвращает целое число. Для получения хеша значения используется встроенная функция hash.
Встроенные типы, которые являются неизменяемыми, по умолчанию хешируемы. Все пользовательские объекты тоже хешируемы, но есть нюанс. Если вы определяете метод __eq__ для своего типа, то вы также должны определить __hash__ таким образом, чтобы hash(a) == hash(b) для всех a и b, которые считаются равными. Нарушение этого правила может привести к некорректной работе словаря:
class A:
def __init__(self, x):
self.x = x
def __hash__(self):
return random.randrange(10000)
def __eq__(self, other):
return self.x == other.x
d = {}
d[A(2)] = 2
d.get(A(2), 0)
# Вывод: 0
Обратите внимание: как только вы определяете __eq__ в классе, реализация __hash__ по умолчанию удаляется, так как она больше не подходит (по умолчанию все значения считаются неравными).
👉@BookPythonlst = [1, 2, 3, 4, 5]
lst = []
Этот способ создаёт новый пустой список, но старая ссылка остаётся в памяти, если на неё есть другие ссылки.
2️⃣ Использование .clear()
lst = [1, 2, 3, 4, 5]
lst.clear()
Метод .clear() очищает список на месте, не создавая новый объект. Это предпочтительный способ, если список используется в нескольких местах.
3️⃣ Использование del
lst = [1, 2, 3, 4, 5]
del lst[:]
Работает аналогично .clear(), но выглядит чуть менее очевидно.
4️⃣ Удаление списка полностью
lst = [1, 2, 3, 4, 5]
del lst
Этот вариант полностью удаляет переменную lst. Если потом попробовать к ней обратиться, будет ошибка NameError.
🔹 Какой способ лучше?
• Если нужно просто очистить список, используйте .clear().
• Если хотите заменить его новым объектом — lst = [].
• del lst[:] – редкий вариант, но возможен.
• del lst подходит, если список больше не нужен в программе.
Какой вариант используете вы? Пишите в комментариях!
👉@BookPythonelse в for и while
Многие не знают, что в Python циклы for и while могут иметь блок else. Он выполняется, если цикл не был прерван через break.
✅ Пример:
numbers = [1, 3, 5, 7]
for num in numbers:
if num % 2 == 0:
print("Есть чётное число!")
break
else:
print("Чётных чисел нет.")
🔹 Если в списке нет чётных чисел, сработает else.
2. "Распаковка" переменных
В Python можно присваивать сразу несколько значений одной строкой.
✅ Пример:
a, b, c = 1, 2, 3
print(a, b, c) # 1 2 3
Можно менять местами значения без временной переменной:
x, y = 5, 10
x, y = y, x
print(x, y) # 10 5
3. Используем _ в больших числах
Чтобы числа легче читались, можно разделять разряды _.
✅ Пример:
big_number = 1_000_000_000
print(big_number) # 1000000000
Это просто синтаксический сахар, Python игнорирует _ при вычислениях.
4. Получаем значение из словаря с запасным вариантом
Вместо if key in dict можно использовать .get(), чтобы избежать KeyError.
✅ Пример:
user_data = {"name": "Alice"}
age = user_data.get("age", 18) # Если ключа "age" нет, вернётся 18
print(age) # 18
5. "Распаковка" списка в аргументы функции
Оператор * позволяет передавать элементы списка в функцию как отдельные аргументы.
✅ Пример:
def greet(name, age):
print(f"Привет, {name}! Тебе {age} лет.")
user_info = ["Иван", 25]
greet(*user_info) # Привет, Иван! Тебе 25 лет.
То же работает со словарями через **:
user_dict = {"name": "Ольга", "age": 30}
greet(**user_dict)
🧐 Итог
Эти фишки делают код лаконичнее и понятнее. Какую из них вы уже использовали? Может, знаете ещё что-то крутое? Делитесь в комментариях! 👇
👉@BookPythonpip:
pip install pycodestyle
Чтобы проверить весь проект в текущей директории, выполните:
pycodestyle . -qq --statistics
Флаги:
- . — проверка всей текущей директории.
- -qq — подавляет ненужные сообщения, оставляя только ошибки.
- --statistics — выводит краткую сводку по ошибкам.
🧐 Примеры ошибок и их исправление
1️⃣ E302 – Ожидалось 2 пустых строки перед объявлением функции/класса:
def my_function():
print("Hello, world!")
✅ Исправление:
def my_function():
print("Hello, world!")
2️⃣ E501 – Строка слишком длинная (> 79 символов):
print("Это очень длинная строка, которая превышает 79 символов и вызывает ошибку E501")
✅ Исправление:
print(
"Это очень длинная строка, которая превышает 79 символов "
"и вызывает ошибку E501"
)
⚡ Альтернативные инструменты
- flake8 – более мощный анализатор кода, объединяет pycodestyle, pyflakes и mccabe.
- black – автоформаттер кода, следит за PEP 8 и правит стиль автоматически.
- isort – сортирует импортированные модули.
🚀 Вывод: Использование pycodestyle и других инструментов помогает поддерживать чистоту и читаемость кода, а также облегчает командную работу.
👉@BookPython
Endi mavjud! Telegram Tadqiqoti 2025 — yilning asosiy insaytlari 
