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

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

الذهاب إلى القناة على Telegram

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

إظهار المزيد

📈 نظرة تحليلية على قناة تيليجرام Библиотека Python разработчика | Книги по питону

تُعد قناة Библиотека Python разработчика | Книги по питону (@bookpython) في القطاع اللغوي الروسية لاعباً نشطاً. يضم المجتمع حالياً 18 328 مشتركاً، محتلاً المرتبة 7 307 في فئة التكنولوجيات والتطبيقات والمرتبة 36 869 في منطقة روسيا.

📊 مؤشرات الجمهور والحراك

منذ تأسيسه في невідомо، حقق المشروع نمواً سريعاً وجمع 18 328 مشتركاً.

بحسب آخر البيانات بتاريخ 04 يونيو, 2026، تحافظ القناة على نشاط مستقر. خلال آخر 30 يوماً تغيّر عدد الأعضاء بمقدار -86، وفي آخر 24 ساعة بمقدار -1، مع بقاء الوصول العام مرتفعاً.

  • حالة التحقق: غير موثّقة
  • معدل التفاعل (ER): يبلغ متوسط تفاعل الجمهور 6.07‎%. وخلال أول 24 ساعة من النشر يحصد المحتوى عادةً 2.61‎% من ردود الفعل نسبةً إلى إجمالي المشتركين.
  • وصول المنشورات: يحصل كل منشور على متوسط 1 112 مشاهدة. وخلال اليوم الأول يجمع عادةً 479 مشاهدة.
  • التفاعلات والاستجابة: يتفاعل الجمهور بانتظام؛ متوسط التفاعلات لكل منشور يبلغ 2.
  • الاهتمامات الموضوعية: يركز المحتوى على مواضيع رئيسية مثل numbers, yield, модуль, none, декоратор.

📝 الوصف وسياسة المحتوى

يصف المؤلف القناة بأنها مساحة للتعبير عن الآراء الذاتية:
Погружение в CPython и архитектуру. Разбираем неочевидное поведение (GIL, Memory), Best Practices (SOLID, DDD) и тонкости Django/FastAPI. Решаем задачи с подвохом и оптимизируем алгоритмы. 🐍 По всем вопросам @evgenycarter РКН clck.ru/3Ko7Hq

بفضل وتيرة التحديث المرتفعة (أحدث البيانات بتاريخ 05 يونيو, 2026) تحافظ القناة على حداثتها ومستوى وصول مرتفع. وتُظهر التحليلات تفاعلاً نشطاً من الجمهور، ما يجعلها نقطة تأثير مهمة ضمن فئة التكنولوجيات والتطبيقات.

18 328
المشتركون
-124 ساعات
-297 أيام
-8630 أيام
أرشيف المشاركات
Самый большой недостаток объектов с __slots__ заключается в том, что они не могут динамически получать произвольные атрибуты. Однако можно совместить подход с __slots__ и обычным __dict__. Чтобы включить возможность динамического присваивания атрибутов объекту, просто добавьте '__dict__' в __slots__:

class A:
    __slots__ = ('a', 'b', '__dict__')

A().x = 3
Также учтите, что наследуемые классы автоматически получают __dict__, если явно не указаны пустые __slots__:

class A:
    __slots__ = ('a', 'b')

class B(A):
    pass

B().x = 3
👉@BookPython

Реклама для бизнеса любого уровня в Яндекс Директе Создайте эффективную рекламную кампанию с алгоритмами Яндекс Директа 👌 На
Реклама для бизнеса любого уровня в Яндекс Директе Создайте эффективную рекламную кампанию с алгоритмами Яндекс Директа 👌 Начните прямо сейчас ⚡ Зарегистрироваться #реклама direct.yandex.ru О рекламодателе

Reduce — это функция высшего порядка, которая рекурсивно обрабатывает итерируемый объект, применяя некоторое действие к следующему элементу и уже вычисленному значению. Возможно, вы также знаете её под названиями fold, inject, accumulate или другими. Reduce с выражением result = result + element даёт сумму всех элементов, result = min(result, element) — минимум, а result = element позволяет получить последний элемент последовательности. В Python есть функция reduce (в Python 3 она перенесена в functools.reduce):

from functools import reduce

reduce(lambda s, i: s + i, range(10))
# 45

reduce(lambda s, i: min(s, i), range(10))
# 0

reduce(lambda s, i: i, range(10))
# 9
Кроме того, если вам нужны простые лямбда-функции вроде a, b: a + b, Python предлагает модуль operator:

from operator import add
reduce(add, range(10))
# 45
👉@BookPython

Начните зарабатывать на рекламе в блоге Размещайте рекламу на своих площадках: VK, RUTUBE, Telegram или YouTube. От 1 000 под
Начните зарабатывать на рекламе в блоге Размещайте рекламу на своих площадках: VK, RUTUBE, Telegram или YouTube. От 1 000 подписчиков. Без долгих согласований. Быстрая модерация — от нескольких минут. Оплата за целевые действия на сайте рекламодателя. Автоматическая маркировка. Узнать больше #реклама partner.yandex.ru О рекламодателе

Некоторые модули Python компилируются непосредственно в сам интерпретатор. Они называются встроенными модулями (built-in), и их не следует путать со стандартной библиотекой. Чтобы получить полный список таких модулей, можно использовать sys.builtin_module_names. Примеры таких модулей — sys, gc, time и т. д. Обычно вам не важно, является ли модуль встроенным или нет; однако стоит иметь в виду, что import сначала ищет модуль среди встроенных. Поэтому будет загружен встроенный модуль sys, даже если в текущей директории есть файл sys.py. С другой стороны, если, например, в текущей директории есть файл datetime.py, он действительно может быть загружен вместо стандартного модуля datetime. 👉@BookPython

Запустите рекламу в телеграм-каналах с Яндекс Директом Перфоманс-реклама теперь в телеграм-каналах ⚡ Яндекс Директ знает, как
Запустите рекламу в телеграм-каналах с Яндекс Директом Перфоманс-реклама теперь в телеграм-каналах ⚡ Яндекс Директ знает, как привлечь целевую аудиторию 💰👌 Попробовать

collections.defaultdict позволяет создать словарь, который возвращает значение по умолчанию, если запрашиваемого ключа нет (вместо того чтобы выбрасывать исключение KeyError). При создании defaultdict необходимо указывать не само значение по умолчанию, а фабрику для его создания. Это позволяет создавать словари с бесконечным числом вложенных уровней, что дает возможность писать что-то вроде d[a][b][c]...[z].

>>> def infinite_dict():
...     return defaultdict(infinite_dict)
...
>>> d = infinite_dict()
>>> d[1][2][3][4] = 10
>>> dict(d[1][2][3][5])
{}
Такое поведение называется “автовивификация” (от англ. autovivification) — термин пришёл из языка Perl. 👉@BookPython

Скажем, вы хотите получить первые N элементов итерируемого объекта. Прямолинейный способ — использовать islice:

from itertools import islice

def fib():
    a, b = 0, 1
    while True:
        yield b
        a, b = b, (a + b)

list(islice(fib(), 5))
# Результат: [1, 1, 2, 3, 5]
Если вы также хотите получить индексы элементов, можно применить enumerate:

list(enumerate(islice(fib(), 5)))
# Результат: [(0, 1), (1, 1), (2, 2), (3, 3), (4, 5)]
Другой способ сделать это — использовать zip и range, что может показаться более читаемым:

list(zip(range(5), fib()))
# Результат: [(0, 1), (1, 1), (2, 2), (3, 3), (4, 5)]
👉@BookPython

Премиальные апартаменты в Крыму на выгодных условиях! Премиальный комплекс в 30 метрах от собственного пляжа ✅ Комплекс — 4-х
Премиальные апартаменты в Крыму на выгодных условиях! Премиальный комплекс в 30 метрах от собственного пляжа ✅ Комплекс — 4-х кратный победитель премии в сфере недвижимости URBAN AWORDS как самый привлекательный инвестиционный проект ЮФО 🏠 Комплекс можно: - Сдавать посуточно через отельера международного класса и получать пассивный ежемесячный доход (при этом отдыхая в отпуске в собственном номере) - Выгодно перепродать ⚡ О проекте: - Первая береговая линия – всего в 30 метрах расположен собственный пляж - На территории открытый и 2 круглогодичных бассейна - Более 14,5 га впечатляющей территории: 4-этажный SPA-комплекс, амфитеатр, панорамный ресторан, медцентр, игровое пространство для детей, магазины и бутик ⚡Роскошные панорамные виды на потухший вулкан, море и виноградники ✅Получите цены и презентацию первыми: Перейти на сайт Проектная декларация на сайте https://наш.дом.рф/. #реклама mrqz.me О рекламодателе

Когда вы используете fork для создания нового процесса, текущее состояние генератора случайных чисел (включая seed) копируется в дочерний процесс. Это может привести к тому, что разные процессы будут генерировать одинаковые «случайные» значения. Чтобы избежать этого, необходимо вручную вызывать random.seed() в каждом процессе. Однако, если вы используете модуль multiprocessing, он уже автоматически выполняет это за вас. Пример:

import multiprocessing              
import random                       
import os                           
import sys                          

def test(a):                        
    print(random.choice(a), end=' ') 

a = [1, 2, 3, 4, 5]                 

# Вызов в основном процессе
for _ in range(5):                  
    test(a)                         
print()                             

# Вызов с multiprocessing.Process
for _ in range(5):                  
    p = multiprocessing.Process(    
        target=test, args=(a,)      
    )                               
    p.start()                       
    p.join()                        
print()                             

# Вызов с использованием os.fork
for _ in range(5):                  
    pid = os.fork()                 
    if pid == 0:                    
        test(a)                     
        sys.exit()                  
    else:                           
        os.wait()                   
print()
Вывод будет примерно такой:
4 4 4 5 5
1 4 1 3 3
2 2 2 2 2
Причём, начиная с Python 3.7, os.fork также использует механизм at_fork hook, который переинициализирует генератор случайных чисел, как и multiprocessing. Так что в Python 3.7+ вывод кода выше может быть таким:
1 2 2 1 5
4 4 4 5 5
2 4 1 3 1
👉@BookPython

Дарим подписку на Яндекс Музыку Ответьте на 1 вопрос и Яндекс Музыка для вас и 3-х ваших близких 30 дней бесплатно. Кинопоиск
Дарим подписку на Яндекс Музыку Ответьте на 1 вопрос и Яндекс Музыка для вас и 3-х ваших близких 30 дней бесплатно. Кинопоиск и Яндекс Книги тоже в подписке. Попробуйте сейчас❤️ Попробовать #реклама 18+ music.yandex.ru О рекламодателе Реклама на Яндексе

Сортировка списка с элементами None может быть затруднительной:

In [1]: data = [
   ...:     dict(a=1),
   ...:     None,
   ...:     dict(a=-3),
   ...:     dict(a=2),
   ...:     None,
   ...: ]
Попытка сортировки приведёт к ошибке:

In [2]: sorted(data, key=lambda x: x['a'])
---------------------------------------------------------------------------
TypeError: 'NoneType' object is not subscriptable
Можно удалить None перед сортировкой, а затем добавить их обратно (в конец или начало списка — в зависимости от задачи):

In [3]: sorted(
   ...:     (d for d in data if d is not None),
   ...:     key=lambda x: x['a']
   ...: ) + [
   ...:     d for d in data if d is None
   ...: ]
Out[3]: [{'a': -3}, {'a': 1}, {'a': 2}, None, None]
Это громоздко. Лучше использовать более сложную функцию ключа:

In [4]: sorted(data, key=lambda x: float('inf') if x is None else x['a'])
Out[4]: [{'a': -3}, {'a': 1}, {'a': 2}, None, None]
Если тип данных не поддерживает бесконечность (float('inf')), можно сортировать кортежи:

In [5]: sorted(data, key=lambda x: (1, None) if x is None else (0, x['a']))
Out[5]: [{'a': -3}, {'a': 1}, {'a': 2}, None, None]
👉@BookPython

Такси для бизнеса. Яндекс Go Оптимизируйте свои расходы и повысьте эффективность бизнеса с Яндекс Go Узнать больше #реклама b
Такси для бизнеса. Яндекс Go Оптимизируйте свои расходы и повысьте эффективность бизнеса с Яндекс Go Узнать больше #реклама business.go.yandex О рекламодателе Реклама на Яндексе

Python-разработчики раньше инициализировали словари разными способами:

>>> foo = {}
>>> foo = dict()
На первый взгляд результат один и тот же, но давай копнём глубже:

>>> timeit.timeit('{}', number=10**8)
2.65754420599842

>>> timeit.timeit('dict()', number=10**8)
6.245466648993897
Похоже, второй способ инициализации словаря как минимум в два раза медленнее. Давайте посмотрим, почему так, с помощью модуля dis, который позволяет заглянуть в байткод Python:

>>> dis.dis('foo={}')
  1           0 BUILD_MAP                0
              2 STORE_NAME               0 (foo)
              4 LOAD_CONST               0 (None)
              6 RETURN_VALUE

>>> dis.dis('foo=dict()')
  1           0 LOAD_NAME                0 (dict)
              2 CALL_FUNCTION            0
              4 STORE_NAME               1 (foo)
              6 LOAD_CONST               0 (None)
              8 RETURN_VALUE
Ответ лежит на поверхности — когда ты используешь dict() вместо {}, ты теряешь время на лишний вызов функции. Но в большинстве Python-приложений это не имеет значения, так как речь идёт о микросекундах. Тем не менее — стоит иметь это в виду. 👉@BookPython

Командировки Яндекс Go для бизнеса Всё, что нужно для командировок, в одном сервисе: жильё, транспорт и питание. Поиск и брон
Командировки Яндекс Go для бизнеса Всё, что нужно для командировок, в одном сервисе: жильё, транспорт и питание. Поиск и бронирование в одном окне. Закрывающие документы и отчёты создаются автоматически и доступны в личном кабинете. Поддержка в оформлении и в поездках 24/7. Узнать больше #реклама business.go.yandex О рекламодателе Реклама на Яндексе

Функция round округляет число до заданной точности в десятичных знаках.

>>> round(1.2)
1
>>> round(1.8)
2
>>> round(1.228, 1)
1.2
Также можно задать отрицательную точность:

>>> round(413.77, -1)
410.0
>>> round(413.77, -2)
400.0
round возвращает значение того же типа, что и входное число:

>>> type(round(2, 1))
<class 'int'>

>>> type(round(2.0, 1))
<class 'float'>

>>> type(round(Decimal(2), 1))
<class 'decimal.Decimal'>

>>> type(round(Fraction(2), 1))
<class 'fractions.Fraction'>
Для собственных классов можно определить поведение округления с помощью метода __round__:

>>> class Number(int):
...   def __round__(self, p=-1000):
...     return p
...
>>> round(Number(2))
-1000
>>> round(Number(2), -2)
-2
Значения округляются до ближайшего кратного 10 ** (-precision). Например, при precision=1, значение округляется до кратного 0.1: round(0.63, 1) возвращает 0.6. Если два значения одинаково близки, округление происходит в сторону чётного числа:

>>> round(0.5)
0
>>> round(1.5)
2
Иногда округление чисел с плавающей точкой может казаться неожиданным:

>>> round(2.85, 1)
2.9
Это связано с тем, что большинство десятичных дробей не могут быть точно представлены в формате float:

>>> format(2.85, '.64f')
'2.8500000000000000888178419700125232338905334472656250000000000000'
Если нужно округление "в большую сторону при 0.5" (round half up), можно использовать decimal.Decimal:

>>> from decimal import Decimal, ROUND_HALF_UP
>>> Decimal(1.5).quantize(0, ROUND_HALF_UP)
Decimal('2')
>>> Decimal(2.85).quantize(Decimal('1.0'), ROUND_HALF_UP)
Decimal('2.9')
>>> Decimal(2.84).quantize(Decimal('1.0'), ROUND_HALF_UP)
Decimal('2.8')
👉@BookPython

Стандартный модуль json имеет интерфейс командной строки, который может быть полезен для форматирования JSON только с помощью Python. Модуль для этого называется json.tool и предназначен для вызова следующим образом:

$ echo '{"a": [], "b": "c"}' | python -m json.tool
{
    "a": [],
    "b": "c"
}
👉@BookPython

Дарим подписку на Яндекс Музыку Ответьте на 1 вопрос и Яндекс Музыка для вас и 3-х ваших близких 30 дней бесплатно. Кинопоиск
Дарим подписку на Яндекс Музыку Ответьте на 1 вопрос и Яндекс Музыка для вас и 3-х ваших близких 30 дней бесплатно. Кинопоиск и Яндекс Книги тоже в подписке. Попробуйте сейчас❤️ Попробовать #реклама 18+ music.yandex.ru О рекламодателе Реклама на Яндексе

Чтобы немедленно остановить выполнение программы на Python, следует использовать sys.exit(). Альтернативой является функция exit(), однако она предназначена для использования в интерактивном режиме. Благодаря строковому представлению, она может помочь пользователям, которые пытаются завершить сессию, используя exit (что поддерживается многими оболочками):

>>> exit
Use exit() or Ctrl-D (i.e. EOF) to exit
>>> str(exit)
'Use exit() or Ctrl-D (i.e. EOF) to exit'
И exit(), и sys.exit() на самом деле не завершают программу, а просто выбрасывают исключение SystemExit. SystemExit — это прямой подкласс BaseException, а значит, он не может быть перехвачен через except Exception, но может быть перехвачен через except BaseException или через голый except:.

>>> try:
...     exit()
... except:
...     'Nothing'
...
'Nothing'
Поскольку это может быть проблемой, можно использовать функцию os._exit. Она не выбрасывает никаких исключений — просто завершает текущий процесс. Однако это означает, что блоки finally, а также завершающие действия менеджеров контекста не будут выполнены.

$ python3
Python 3.4.3 (default, Apr 28 2015, 13:37:07)
[GCC 4.8.3 20140911 (Red Hat 4.8.3-9)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> try:
...     os._exit(42)
... finally:
...     print('Bye!')
...
$ ...
👉@BookPython

Методичка: как сделать онлайн-встречи эффективнее Надоело ждать коллег, которые постоянно забывают о встречах, а отсутствие п
Методичка: как сделать онлайн-встречи эффективнее Надоело ждать коллег, которые постоянно забывают о встречах, а отсутствие повестки и потерянные договоренности мешают нормально работать? Команда МТС Линк собрала на 37 страницах полезные материалы, чек-листы и кейсы, которые помогают компаниям проводить эффективные совещания в онлайне с помощью сервиса Встречи. Из методички узнаете: - Как создать постоянную ссылку и подключаться на встречи в 2 клика, - Как делать заметки и работать с файлами, не переживая за качество связи и безопасность данных. - Как облегчает жизнь ИИ, который расшифровывает созвоны в текст и автоматически отправляет расшифровку на почту. Еще в методичке описаны 7 способов оценки текущей эффективности ваших онлайн-встреч. Получить гайд можно бесплатно на сайте. Скачать #реклама 16+ mts-link.ru О рекламодателе