fa
Feedback

فریب کلاهبرداران را نخورید! تل‌متریو این کانال‌ها را شناسایی و برچسب‌گذاری می‌کند 👉 برای مشاهده برچسب، اشتراک تهیه کنید

Библиотека Python разработчика | Книги по питону

Библиотека Python разработчика | Книги по питону

رفتن به کانال در Telegram

Погружение в CPython и архитектуру. Разбираем неочевидное поведение (GIL, Memory), Best Practices (SOLID, DDD) и тонкости Django/FastAPI. Решаем задачи с подвохом и оптимизируем алгоритмы. 🐍 По всем вопросам @evgenycarter РКН clck.ru/3Ko7Hq

نمایش بیشتر

📈 تحلیل کانال تلگرام Библиотека Python разработчика | Книги по питону

کانال Библиотека Python разработчика | Книги по питону (@bookpython) در بخش زبانی روسی بازیگری فعال است. در حال حاضر جامعه شامل 17 980 مشترک است و جایگاه 7 235 را در دسته فناوری و برنامه‌ها و رتبه 36 590 را در منطقه روسيا دارد.

📊 شاخص‌های مخاطب و پویایی

از زمان ایجاد در невідомо، پروژه رشد سریعی داشته و 17 980 مشترک جذب کرده است.

بر اساس آخرین داده‌ها در تاریخ 25 اکتبر, 2026، کانال فعالیت پایداری دارد. در ۳۰ روز گذشته تغییر اعضا برابر -82 و در ۲۴ ساعت گذشته برابر -5 بوده و همچنان دسترسی گسترده‌ای حفظ شده است.

  • وضعیت تأیید: تأیید نشده
  • نرخ تعامل (ER): میانگین تعامل مخاطب 5.33% است و در ۲۴ ساعت نخست پس از انتشار، محتوا معمولاً 2.48% واکنش نسبت به کل مشترکان کسب می‌کند.
  • دسترسی پست‌ها: هر پست به طور میانگین 959 بازدید دریافت می‌کند. در اولین روز معمولاً 446 بازدید جمع‌آوری می‌شود.
  • واکنش‌ها و تعامل: مخاطبان به‌طور فعال حمایت می‌کنند؛ میانگین واکنش به هر پست 4 است.
  • علایق موضوعی: محتوا بر موضوعات کلیدی مانند numbers, yield, модуль, none, декоратор تمرکز دارد.

📝 توضیح و سیاست محتوایی

نویسنده این فضا را محل بیان دیدگاه‌های شخصی توصیف می‌کند:
“Погружение в CPython и архитектуру. Разбираем неочевидное поведение (GIL, Memory), Best Practices (SOLID, DDD) и тонкости Django/FastAPI. Решаем задачи с подвохом и оптимизируем алгоритмы. 🐍 По всем вопросам @evgenycarter РКН clck.ru/3Ko7Hq”

به لطف به‌روزرسانی‌های پرتکرار (آخرین داده در تاریخ 26 اکتبر, 2026)، کانال همواره به‌روز و دارای دسترسی بالاست. تحلیل‌ها نشان می‌دهد مخاطبان به‌طور فعال با محتوا تعامل دارند و آن را به نقطه اثرگذاری مهم در دسته فناوری و برنامه‌ها تبدیل کرده‌اند.

17 980
مشترکین
-524 ساعت
-257 روز
-8230 روز
جذب مشترکین
اکتبر '26
اکتبر '26
+17
در 0 کانال‌ها
سپتامبر '26
+36
در 0 کانال‌ها
Get PRO
اوت '26
+37
در 0 کانال‌ها
Get PRO
ژوئیه '26
+35
در 0 کانال‌ها
Get PRO
ژوئن '26
+23
در 0 کانال‌ها
Get PRO
مه '26
+40
در 0 کانال‌ها
Get PRO
آوریل '26
+26
در 0 کانال‌ها
Get PRO
مارس '26
+31
در 0 کانال‌ها
Get PRO
فوریه '26
+62
در 0 کانال‌ها
Get PRO
ژانویه '26
+69
در 0 کانال‌ها
Get PRO
دسامبر '25
+67
در 0 کانال‌ها
Get PRO
نوامبر '25
+97
در 31 کانال‌ها
Get PRO
اکتبر '25
+64
در 1 کانال‌ها
Get PRO
سپتامبر '25
+90
در 36 کانال‌ها
Get PRO
اوت '25
+60
در 0 کانال‌ها
Get PRO
ژوئیه '25
+89
در 27 کانال‌ها
Get PRO
ژوئن '25
+116
در 19 کانال‌ها
Get PRO
مه '25
+119
در 44 کانال‌ها
Get PRO
آوریل '25
+164
در 37 کانال‌ها
Get PRO
مارس '25
+147
در 38 کانال‌ها
Get PRO
فوریه '25
+178
در 31 کانال‌ها
Get PRO
ژانویه '25
+176
در 33 کانال‌ها
Get PRO
دسامبر '24
+158
در 34 کانال‌ها
Get PRO
نوامبر '24
+112
در 33 کانال‌ها
Get PRO
اکتبر '24
+139
در 29 کانال‌ها
Get PRO
سپتامبر '24
+190
در 29 کانال‌ها
Get PRO
اوت '24
+68
در 17 کانال‌ها
Get PRO
ژوئیه '24
+56
در 0 کانال‌ها
Get PRO
ژوئن '24
+95
در 23 کانال‌ها
Get PRO
مه '24
+223
در 18 کانال‌ها
Get PRO
آوریل '24
+174
در 0 کانال‌ها
Get PRO
مارس '24
+240
در 20 کانال‌ها
Get PRO
فوریه '24
+224
در 18 کانال‌ها
Get PRO
ژانویه '24
+287
در 23 کانال‌ها
Get PRO
دسامبر '23
+253
در 24 کانال‌ها
Get PRO
نوامبر '23
+282
در 16 کانال‌ها
Get PRO
اکتبر '23
+319
در 18 کانال‌ها
Get PRO
سپتامبر '23
+342
در 0 کانال‌ها
Get PRO
اوت '23
+264
در 0 کانال‌ها
Get PRO
ژوئیه '23
+292
در 0 کانال‌ها
Get PRO
ژوئن '23
+211
در 0 کانال‌ها
Get PRO
مه '23
+284
در 0 کانال‌ها
Get PRO
آوریل '23
+240
در 0 کانال‌ها
Get PRO
مارس '23
+419
در 0 کانال‌ها
Get PRO
فوریه '23
+147
در 0 کانال‌ها
Get PRO
ژانویه '23
+247
در 0 کانال‌ها
Get PRO
دسامبر '22
+191
در 0 کانال‌ها
Get PRO
نوامبر '22
+174
در 0 کانال‌ها
Get PRO
اکتبر '22
+283
در 0 کانال‌ها
Get PRO
سپتامبر '22
+268
در 0 کانال‌ها
Get PRO
اوت '22
+287
در 0 کانال‌ها
Get PRO
ژوئیه '22
+322
در 0 کانال‌ها
Get PRO
ژوئن '22
+233
در 0 کانال‌ها
Get PRO
مه '22
+258
در 0 کانال‌ها
Get PRO
آوریل '22
+252
در 0 کانال‌ها
Get PRO
مارس '22
+380
در 0 کانال‌ها
Get PRO
فوریه '22
+207
در 0 کانال‌ها
Get PRO
ژانویه '22
+315
در 0 کانال‌ها
Get PRO
دسامبر '21
+211
در 0 کانال‌ها
Get PRO
نوامبر '21
+269
در 0 کانال‌ها
Get PRO
اکتبر '21
+326
در 0 کانال‌ها
Get PRO
سپتامبر '21
+286
در 0 کانال‌ها
Get PRO
اوت '21
+486
در 0 کانال‌ها
Get PRO
ژوئیه '21
+420
در 0 کانال‌ها
Get PRO
ژوئن '21
+368
در 0 کانال‌ها
Get PRO
مه '21
+350
در 0 کانال‌ها
Get PRO
آوریل '21
+387
در 0 کانال‌ها
Get PRO
مارس '21
+568
در 0 کانال‌ها
Get PRO
فوریه '21
+572
در 0 کانال‌ها
Get PRO
ژانویه '21
+777
در 0 کانال‌ها
Get PRO
دسامبر '20
+18 545
در 0 کانال‌ها
تاریخ
رشد مشترکین
اشارات
کانال‌ها
26 اکتبر0
25 اکتبر0
24 اکتبر0
23 اکتبر0
22 اکتبر+1
21 اکتبر0
20 اکتبر0
19 اکتبر+1
18 اکتبر0
17 اکتبر0
16 اکتبر+3
15 اکتبر+1
14 اکتبر+1
13 اکتبر+1
12 اکتبر+2
11 اکتبر+1
10 اکتبر+1
09 اکتبر+1
08 اکتبر+1
07 اکتبر+1
06 اکتبر0
05 اکتبر0
04 اکتبر0
03 اکتبر0
02 اکتبر+1
01 اکتبر+1
پست‌های کانال
Скрытые фичи Enum: как выжать максимум Многие используют Enum как простой список констант. Но у enum.Enum в Python есть куда больше возможностей — и они могут сделать код чище и мощнее. Вот несколько приёмов, которые мало кто использует — но зря. 1. Добавление поведения в Enum

from enum import Enum

class Status(Enum):
    DRAFT = 'draft'
    PUBLISHED = 'published'
    ARCHIVED = 'archived'

    def is_visible(self):
        return self in {Status.DRAFT, Status.PUBLISHED}
Теперь Status.DRAFT.is_visible() — это просто и элегантно. 2. Enum с полями

from enum import Enum

class Color(Enum):
    RED = ('#FF0000', 'danger')
    GREEN = ('#00FF00', 'safe')

    def __init__(self, hex_code, label):
        self.hex_code = hex_code
        self.label = label

Color.RED.hex_code  # '#FF0000'
Color.RED.label     # 'danger'
3. Автоматические значения с auto()

from enum import Enum, auto

class Role(Enum):
    ADMIN = auto()
    USER = auto()
    GUEST = auto()
Удобно, если не важны конкретные значения, а нужны уникальные. 4. Строгая сериализация В реальных приложениях (API, базы) лучше контролировать сериализацию enum'ов:

import json

class CustomEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Enum):
            return obj.value
        return super().default(obj)

json.dumps(Status.PUBLISHED, cls=CustomEncoder)  # "published"
5. Сравнение по значению

Status('draft') == Status.DRAFT  # True
Status('draft') is Status.DRAFT  # True (enum гарантирует singleton)
Итого: Enum — это не просто константы. Это лёгкий способ инкапсулировать поведение и данные, улучшить читаемость и сделать код устойчивее к ошибкам. 📲 Мы в MAX 👉@BookPython

2
default_factory в dataclass: мощнее, чем кажется Многие используют dataclass как удобный способ задать структуру с полями. Но редко кто по-настоящему раскрывает силу default_factory. А зря — он спасает от багов и даёт гибкость. Когда нужно задать значение по умолчанию для поля в dataclass, логично тянуться к default=. Но если это изменяемый тип (например, список или словарь) — вас поджидает ловушка. from dataclasses import dataclass, field @dataclass class User: name: str tags: list[str] = [] # ⚠️ опасно! Все экземпляры User будут делить один и тот же список. То есть: a = User("Alice") b = User("Bob") a.tags.append("admin") print(b.tags) # ['admin'] 😱 Вместо этого используйте default_factory: @dataclass class User: name: str tags: list[str] = field(default_factory=list) Теперь у каждого User будет свой список: a = User("Alice") b = User("Bob") a.tags.append("admin") print(b.tags) # [] Но default_factory не только про списки. Это отличный способ задать любое значение "по умолчанию", включая кастомную логику: import uuid @dataclass class Session: id: str = field(default_factory=lambda: str(uuid.uuid4())) Или, например, значения из окружения: import os @dataclass class Config: debug: bool = field(default_factory=lambda: os.getenv("DEBUG") == "1") Кстати, это ещё и отличное место для внедрения DI: @dataclass class Service: client: "Client" = field(default_factory=create_default_client) default_factory — это маленький хак, который позволяет сделать код чище и безопаснее, особенно когда работаешь с изменяемыми структурами или сложной инициализацией. 📲 Мы в MAX 👉@BookPython
704
3
yield from — элегантная передача управления Если вы пишете генераторы, которые вызывают другие генераторы — забудьте про for x in sub(): yield x. Есть способ проще и мощнее. Оператор yield from позволяет передавать элементы из подгенератора напрямую, без лишнего кода. Но фишка не только в лаконичности — он также автоматически пробрасывает исключения и возвращаемые значения из подгенератора. Вот классика: def gen(): for x in range(3): yield x def wrapper(): for x in gen(): yield x Можно короче и лучше: def wrapper(): yield from gen() Но главное — yield from пробрасывает return-значение из подгенератора (начиная с Python 3.3): def sub(): yield 1 yield 2 return 'done' def main(): result = yield from sub() print('Sub returned:', result) for _ in main(): pass # Выведет: Sub returned: done А ещё через yield from можно проксировать значения внутрь генератора — например, в сопрограммах: def delegator(): result = yield from coroutine() print('coroutine done:', result) def coroutine(): x = yield y = yield return x + y g = delegator() next(g) # Старт next(g) # coroutine ждет x g.send(10) # x = 10 print(g.send(20)) # y = 20 → return 30 # Выведет: coroutine done: 30 Итог: если вы пишете генераторы — освоение yield from даст вам лаконичный синтаксис, проброс return-значений, исключений и взаимодействие на новом уровне. 📲 Мы в MAX 👉@BookPython
720
4
Когда вы используете модуль multiprocessing, и в одном из процессов происходит исключение, оно передаётся в основную программу с помощью механизма сериализации (pickling). Исключение сериализуется, передаётся в другой процесс и там десериализуется обратно. Однако сериализация исключений может быть непростой задачей. Исключение создаётся с любым количеством аргументов, которые сохраняются в атрибуте args. Эти же аргументы используются при десериализации для воссоздания объекта исключения. Но это может не сработать так, как вы ожидаете, особенно если используется наследование. Посмотрите на пример: import pickle class TooMuchWeightError(Exception): def __init__(self, weight): super().__init__() self._weight = weight pickled = pickle.dumps(TooMuchWeightError(42)) pickle.loads(pickled) Вызов TooMuchWeightError.__init__ приводит к вызову Exception.__init__, который устанавливает args как пустой кортеж. Этот пустой кортеж затем используется в качестве аргументов при десериализации, что, очевидно, приводит к ошибке: TypeError: __init__() missing 1 required positional argument: 'weight' Обходное решение — либо вообще не вызывать super().__init__() (что обычно считается плохой практикой при наследовании), либо передавать все аргументы явно в конструктор родительского класса: class TooMuchWeightError(Exception): def __init__(self, weight): super().__init__(weight) self._weight = weight 📲 Мы в MAX 👉@BookPython
852
5
Функция map вызывает другую функцию для каждого элемента итерируемого объекта. Это значит, что функция должна принимать одно значение в качестве аргумента: In : list(map(lambda x: x ** 2, [1, 2, 3])) Out: [1, 4, 9] Однако если каждый элемент итерируемого объекта — это кортеж, было бы удобно передавать каждый элемент кортежа как отдельный аргумент. В Python 2 это было возможно благодаря распаковке параметров кортежа (обратите внимание на скобки): >>> map(lambda (a, b): a + b, [(1, 2), (3, 4)]) [3, 7] В Python 3 эта возможность исчезла, но есть другое решение — itertools.starmap. Она распаковывает кортежи за вас, будто функция вызывается со звёздочкой: f(*arg) (отсюда и название функции): from itertools import starmap In [3]: list(starmap(lambda a, b: a + b, [(1, 2), (3, 4)])) Out[3]: [3, 7] 📲 Мы в MAX 👉@BookPython
892
6
Функция super() позволяет обращаться к родительскому (базовому) классу. Это может быть очень полезно в случаях, когда производный класс хочет добавить что-то к реализации метода, а не полностью переопределять его: class BaseTestCase(TestCase): def setUp(self): self._db = create_db() class UserTestCase(BaseTestCase): def setUp(self): super().setUp() self._user = create_user() Имя функции super не означает "отличный" или "очень хороший". В данном контексте слово super означает "выше" (как, например, в слове superintendent — заведующий). Несмотря на это, super() не всегда ссылается на базовый класс — он может вернуть и "соседний" класс. Более точным названием была бы, возможно, функция next(), так как возвращается следующий класс согласно цепочке разрешения методов (MRO — Method Resolution Order). Пример: class Top: def foo(self): return 'top' class Left(Top): def foo(self): return super().foo() class Right(Top): def foo(self): return 'right' class Bottom(Left, Right): pass # выводит 'right' print(Bottom().foo()) Обрати внимание: результат работы super() может отличаться в зависимости от MRO вызвавшего объекта. >>> Bottom().foo() 'right' >>> Left().foo() 'top' 📲 Мы в MAX 👉@BookPython
1 139
7
Стандартный механизм расширения путей в оболочке называется globbing. Шаблоны, которые вы используете для сопоставления путей
Стандартный механизм расширения путей в оболочке называется globbing. Шаблоны, которые вы используете для сопоставления путей, называются globs. $ echo /li* /lib /lib64 Python поддерживает globbing с помощью модуля glob. Однако есть важное замечание: оболочка возвращает сам шаблон, если файлы не найдены, а Python — нет: $ echo /zz** /zz** $ python -c 'from glob import glob; print(glob("/zz**"))' [] 📲 Мы в MAX 👉@BookPython
987
8
Обычно вы взаимодействуете с генератором, запрашивая данные с помощью next(gen). В Python 3 вы также можете отправлять значения обратно в генератор с помощью g.send(x). Но существует техника, которой вы, вероятно, не пользуетесь каждый день, а возможно, и вовсе не знаете: выбрасывание исключений внутри генератора. С помощью gen.throw(e) можно выбросить исключение в той точке, где генератор gen приостановлен — то есть на инструкции yield. Если генератор обрабатывает это исключение, gen.throw(e) возвращает следующее значение, полученное через yield (или выбрасывает StopIteration, если генератор завершён). Если генератор не перехватывает исключение, оно пробрасывается обратно к вызывающему коду. def gen(): try: yield 1 except ValueError: yield 2 g = gen() next(g) # Out: 1 g.throw(ValueError) # Out: 2 g.throw(RuntimeError('TEST')) # RuntimeError: TEST Эта техника позволяет более точно управлять поведением генератора — не только передавать данные внутрь, но и, например, сообщать о проблемах со значениями, полученными через yield. Однако такие случаи бывают редко, и встретить g.throw в дикой природе почти невозможно. Тем не менее, декоратор @contextmanager из модуля contextlib использует именно такую технику, позволяя коду внутри контекста перехватывать исключения. from contextlib import contextmanager @contextmanager def atomic(): print('BEGIN') try: yield except Exception: print('ROLLBACK') else: print('COMMIT') with atomic(): print('ERROR') raise RuntimeError() BEGIN ERROR ROLLBACK 📲 Мы в MAX 👉@BookPython
996
9
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин https://max.ru/channel_win_sysadmin Системный Администратор Windows https://max.ru/channel_linux_admin Linux: Системный администратор https://max.ru/channel_linuxmod Linux https://max.ru/channel_i_linux Системный администратор https://max.ru/channel_devopslib DevOps, SRE, Sysadmin https://max.ru/channel_devops_star DevOps Star (Звезда Девопса) Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхак Английский с нуля 🇬🇧 https://max.ru/UchuEnglish 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С https://max.ru/channel_DevLab1C 1С:Предприятие 8 Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика https://max.ru/channel_cpp_geek C++ geek Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Rust📌 https://max.ru/channel_rust_lib Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика https://max.ru/channel_java_geek Java Geek GitHub Сообщество 📌 https://max.ru/githublib Интересное из GitHub Базы данных (Data Base) 📌 https://max.ru/database_info Все про базы данных Фронтенд разработка 📌 https://max.ru/frontend_1 Подборки для frontend разработчиков Библиотеки 📌 https://max.ru/programmist_of Книги по программированию https://max.ru/proglb Библиотека программиста https://max.ru/bfbook Книги для программистов Программирование 📌 https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 Шутки программистов 📌 https://max.ru/itumor Шутки программистов Защита, взлом, безопасность 📌 https://max.ru/thehaking Канал о кибербезопасности https://max.ru/xakkep_1 Хакер Free Книги, статьи для дизайнеров 📌 https://max.ru/odesigners Статьи, книги для дизайнеров Математика 📌 https://max.ru/Pomatematike Канал по математике https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике Вакансии в IT📌 https://max.ru/progjob https://max.ru/channel_rabotait Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Городские📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы https://max.ru/piterspb Питер Новости: Санкт-Петербург / СПБ / ДТП https://max.ru/channel_krasnodar_novosty Краснодар Новости https://max.ru/channel_novosibirsk_novosti Новосибирск https://max.ru/channel_samara_novosti Новости Самары https://max.ru/channel_ekaterinburg_novosti Новости Екатеринбурга https://max.ru/channel_kazan_novosti Новости Казани https://max.ru/channel_omsk_novosti Новости Омска https://max.ru/channel_moskva_24 Москва 24
796
10
Если вы создаёте новые объекты внутри метода __init__, возможно, будет лучше передавать их как аргументы и использовать фабричный метод. Это позволяет разделить бизнес-логику и технические детали создания объектов. В этом примере __init__ принимает host и port для создания подключения к базе данных: class Query: def __init__(self, host, port): self._connection = Connection(host, port) Возможный рефакторинг: class Query: def __init__(self, connection): self._connection = connection @classmethod def create(cls, host, port): return cls(Connection(host, port)) Такой подход имеет как минимум следующие преимущества: • Упрощает внедрение зависимостей. В тестах можно использовать Query(FakeConnection()). • Класс может иметь столько фабричных методов, сколько нужно; подключение может создаваться не только по host и port, но и путём клонирования другого подключения, чтения конфигурационного файла или объекта, использования значения по умолчанию и т.д. • Такие фабричные методы можно сделать асинхронными; это невозможно для __init__. 📲 Мы в MAX 👉@BookPython
902
11
Чтобы сохранить любую информацию в памяти или на устройстве хранения, её необходимо представить в виде байтов. Python, как правило, предоставляет уровень абстракции, при котором вы оперируете непосредственно данными, а не их байтовым представлением. Тем не менее, когда вы, скажем, записываете строку в файл, вы работаете с физической структурой данных. Чтобы поместить символы в файл, их нужно преобразовать в байты — это называется кодированием. Когда вы получаете байты из файла, скорее всего, вы захотите превратить их в осмысленные символы — это называется декодированием. Существует сотни методов кодирования. Самый популярный — вероятно, Unicode, но он сам по себе не может преобразовывать данные в байты. В смысле байтового представления Unicode вообще не является кодировкой. Unicode определяет соответствие между символами и их числовыми кодами. Например, 🐍 имеет код 128013. Но чтобы записать числа в файл, нужна настоящая кодировка. Unicode обычно используется вместе с utf-8, которая (в большинстве случаев) является стандартной в Python. При чтении из файла Python автоматически декодирует utf-8. Вы можете выбрать любую другую кодировку с помощью параметра encoding= функции open, либо читать «сырые» байты, добавив b к режиму открытия файла. 📲 Мы в MAX 👉@BookPython
978
12
В Python очень короткий список встроенных констант. Одна из них — Ellipsis, которую также можно записать как .... Эта константа не имеет особого значения для интерпретатора, но используется в местах, где такой синтаксис выглядит уместно. Библиотека NumPy поддерживает Ellipsis в качестве аргумента __getitem__, например: x[...] возвращает все элементы массива x. PEP 484 придаёт Ellipsis дополнительное значение: Callable[..., type] — это способ определить тип вызываемых объектов без указания типов аргументов. Наконец, ... можно использовать, чтобы обозначить, что функция ещё не реализована. Это абсолютно валидный код на Python: def x(): ... 📲 Мы в MAX 👉@BookPython
956
13
Обработка исключений в асинхронных программах может быть непростой задачей. В 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()) 📲 Мы в MAX 👉@BookPython
1 000
14
Как отлаживать Python-код, не выходя из редактора - с помощью встроенного модуля pdb. 🔍 Быстрая отладка с 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(). 📲 Мы в MAX 👉@BookPython
952
15
Python поддерживает цепочные присваивания со следующим синтаксисом: 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) 📲 Мы в MAX 👉@BookPython
1 003
16
Чтобы объект можно было использовать в качестве ключа словаря, он должен быть хешируемым. Хешируемые объекты поддерживают метод __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__ по умолчанию удаляется, так как она больше не подходит (по умолчанию все значения считаются неравными). 📲 Мы в MAX 👉@BookPython
1 001
17
Как быстро очистить список в Python? Сегодня я покажу вам несколько способов очистки списка в Python и расскажу, какой вариант лучше в зависимости от ситуации. 1️⃣ Присвоение пустого списка lst = [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 подходит, если список больше не нужен в программе. Какой вариант используете вы? Пишите в комментариях! 📲 Мы в MAX 👉@BookPython
1 048
18
🚀 5 крутых Python-фишек, о которых знают не все Python — мощный и удобный язык, но даже опытные разработчики иногда не знают всех его возможностей. Сегодня я покажу пять полезных трюков, которые могут упростить вашу работу. 1. Используем else в 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) Эти фишки делают код лаконичнее и понятнее. 📲 Мы в MAX 👉@BookPython
839
19
🔥 Как ускорить Python-код в 10 раз? Сегодня покажу вам мощный инструмент для оптимизации кода - Numba. Это библиотека, которая позволяет компилировать Python-функции в машинный код, используя JIT-компилятор. 🚀 Как это работает? Numba использует LLVM для компиляции кода во время выполнения, превращая Python в код, близкий по скорости к C. Пример Допустим, у нас есть функция, вычисляющая сумму квадратов чисел: import numpy as np import time def sum_of_squares(n): result = 0 for i in range(n): result += i ** 2 return result n = 10**7 start = time.time() sum_of_squares(n) print("Обычный Python:", time.time() - start) Теперь ускорим её с помощью Numba: from numba import jit @jit(nopython=True) def sum_of_squares_numba(n): result = 0 for i in range(n): result += i ** 2 return result start = time.time() sum_of_squares_numba(n) print("С Numba:", time.time() - start) 📊 Результат: ✅ Код на чистом Python выполняется ~5-10 раз медленнее, чем с Numba. ✅ Numba особенно полезна для математических вычислений и обработки массивов. ✅ Простая аннотация @jit(nopython=True) уже даёт мощный прирост скорости! Где применять? ✔ Численные расчёты ✔ Обработку данных ✔ Алгоритмы машинного обучения Попробуйте Numba и напишите в комментариях, удалось ли вам ускорить свой код! 📲 Мы в MAX 👉@BookPython
834
20
10 полезных библиотек для Python-разработчика Сегодня я подготовил для вас подборку из 10 полезных библиотек, которые могут сделать вашу разработку проще и эффективнее. Поехали! 🚀 1️⃣ Rich – красивый вывод в консоль. Если хотите раскрасить логи, добавить таблицы или анимации – эта библиотека вам пригодится. 📌 pip install rich 2️⃣ Typer – современный способ писать CLI-приложения. Работает на основе аннотаций типов и делает разработку CLI удобнее. 📌 pip install typer 3️⃣ Pendulum – альтернатива datetime, но с удобным API и встроенной поддержкой часовых поясов. 📌 pip install pendulum 4️⃣ HTTPX – асинхронный клиент для работы с HTTP-запросами. Поддерживает async/await, в отличие от requests. 📌 pip install httpx 5️⃣ Pydantic – мощный инструмент для валидации данных и работы с моделями. Особенно полезен в FastAPI. 📌 pip install pydantic 6️⃣ Poetry – современный менеджер зависимостей. Упрощает работу с виртуальными окружениями и пакетами. 📌 pip install poetry 7️⃣ Loguru – удобная альтернатива стандартному logging. Позволяет логировать без лишнего кода. 📌 pip install loguru 8️⃣ FastAPI – один из самых быстрых Python-фреймворков для создания API. Использует аннотации типов и async/await. 📌 pip install fastapi 9️⃣ Tqdm – библиотека для удобных progress-bar'ов в терминале. Незаменима при обработке больших данных. 📌 pip install tqdm 🔟 Black – автоматический форматтер кода, который придерживается строгого стиля. Просто устанавливаешь – и больше не думаешь о стиле кода. 📌 pip install black 📲 Мы в MAX 👉@BookPython
970