ar
Feedback

لا تقع ضحية للمخادعين! تيليمتريو يكتشف ويُميّز هذه القنوات 👉 إذا كنت تريد رؤية العلامة، اشترك

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

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

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

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

إظهار المزيد

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

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

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

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

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

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

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

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

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

17 967
المشتركون
-624 ساعات
-297 أيام
-9830 أيام
أرشيف المشاركات
Существует две встроенные функции, которые позволяют анализировать итерируемые объекты без необходимости писать тривиальные и избыточные циклы for. Это all и any. any возвращает True, если хотя бы одно значение истинно; all возвращает True, только если все значения истинны. Для пустого итерируемого объекта all возвращает True, а any — False. Обе функции особенно полезны в сочетании со списковыми включениями (list comprehensions):

package_broken = any(
    part.is_broken() for part in package.get_parts()
)
package_ok = all(
    part.ok() for part in package.get_parts()
)
Функции any и all зачастую взаимозаменяемы благодаря законам де Моргана. Используй ту, с которой код будет понятнее. 👉@BookPython

Регистрируйтесь на вебинар UserGate WAF 💻Расскажет как новая версия UserGate WAF поможет защитить ваши веб-приложения и какие обновления ждут вас в 2025 году ✅На вебинаре будет: - Преимущества и особенности UserGate WAF - Принципы работы и сценарии использования - Демонстрация возможностей WAF - Планы развития продукта в 2025 году - Ответы на вопросы 👌Расскажем, как защитить вашу компанию. Регистрируйтесь — будет интересно! Зарегистрироваться #реклама 16+ webinar.usergate.com О рекламодателе

Иногда нужно создать функцию на основе более универсальной. Например, у функции int() есть параметр base, который мы хотим зафиксировать, чтобы получить новую функцию base2:

>>> int("10")
10
>>> int("10", 2)
2
>>> def base2(x):
...     return int(x, 2)
...
>>> base2("10")
2
functools.partial позволяет сделать то же самое, но точнее и семантически понятнее:

base2 = partial(int, base=2)
Это полезно, когда нужно передать функцию как аргумент другой, более общей функции, но при этом некоторые аргументы должны быть зафиксированы:

>>> map(partial(int, base=2), ["1", "10", "100"])
[1, 2, 4]
Без partial пришлось бы делать так:

>>> map(lambda x: int(x, base=2), ["1", "10", "100"])
[1, 2, 4]
👉@BookPython

В Python нет поддержки асинхронных операций с файлами. Чтобы сделать их неблокирующими, нужно использовать отдельные потоки. Для асинхронного выполнения кода в потоке следует использовать метод loop.run_in_executor. Сторонний модуль aiofiles делает всё это за тебя, предоставляя простой и удобный интерфейс:

async with aiofiles.open('filename', mode='r') as f:
    contents = await f.read()
👉@BookPython

А кто-то ещё пользуется поисковиками? Привет, я Аня, 5 лет работаю на удалёнке, сейчас маркетолог в банке. Недавно задумалась
А кто-то ещё пользуется поисковиками? Привет, я Аня, 5 лет работаю на удалёнке, сейчас маркетолог в банке. Недавно задумалась, раньше, чтобы найти ответ, я открывала Google. Сейчас — задаю вопрос ChatGPT, или Perplexity. И вокруг меня как-будто все резко стали говорить, что поисковиками больше никто не пользуется. На работе, что трафик из нейросетей растет, в каналах – что меняется паттерн поведения. Понаблюдала и тоже заметила, что формулирую запрос не как «рецепт без перца», а как «подскажи, что приготовить, если не ем болгарский перец, капусту и хочу что-то белковое». Что это меняет? Нейросети формируют выдачу иначе: не по SEO, а по сути, контексту и, надеюсь, пользе. Хотя доверять на 100% всё равно им нельзя. ✨ Какие ещё нас ждут изменения и что вообще значит для людей, брендов и общества, читай в канале! Подписаться #реклама 16+ О рекламодателе

>>> bool(datetime(2018, 1, 1).time())
False
>>> bool(datetime(2018, 1, 1, 13, 12, 11).time())
True
До Python 3.5 объекты datetime.time() считались ложными, если они представляли полночь по UTC. Это могло приводить к трудноуловимым ошибкам. В следующих примерах if not может выполниться не потому, что created_time равен None, а потому, что время — полночь.

def create(created_time=None) -> None:
    if not created_time:
        created_time = datetime.now().time()
Можно исправить это, явно проверяя на None:

def create(created_time=None) -> None:
    if created_time is None:
        created_time = datetime.now().time()
👉@BookPython

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

In:

int('୧৬𝟙༣')
Out:

1613
Цифры 0 1 2 3 4 5 6 7 8 9 — это не единственные символы, которые считаются цифрами. Python следует правилам Unicode и считает «цифрами» сотни различных символов. Вот полный список таких символов. Это влияет на такие функции, как int, unicode.isdecimal и даже re.match:

# Пример 1
int('෯')
# Вывод:
9

# Пример 2
'٢'.isdecimal()
# Вывод:
True

# Пример 3
import re
bool(re.match(r'\d', '౫'))
# Вывод:
True
👉@BookPython

Начиная с Python 3.0, при возникновении нового исключения внутри блока except перехваченное исключение автоматически сохраняется в атрибуте __context__ создаваемого исключения. В результате при выводе будут показаны оба исключения:

try:
    1 / 0
except ZeroDivisionError:
    raise ValueError('Zero!')
(most recent call last):
  File "test.py", line 2, in <module>
    1 / 0
ZeroDivisionError: division by zero

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "test.py", line 4, in <module>
    raise ValueError('Zero!')
ValueError: Zero!
Кроме того, вы можете явно указать причинное исключение, использовав конструкцию raise … from. Тогда в атрибут __cause__ нового исключения будет помещено исходное:

division_error = None

try:
    1 / 0
except ZeroDivisionError as e:
    division_error = e

raise ValueError('Zero!') from division_error
(most recent call last):
  File "test.py", line 4, in <module>
    1 / 0
ZeroDivisionError: division by zero

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "test.py", line 8, in <module>
    raise ValueError('Zero!') from division_error
ValueError: Zero!
👉@BookPython

Подарки от семечек Джинн! Хочешь набор любимых семечек "Джинн" или "Белочка"и крутой зонт? Учавствуй в розыгрыше! Подписаться
Подарки от семечек Джинн! Хочешь набор любимых семечек "Джинн" или "Белочка"и крутой зонт? Учавствуй в розыгрыше! Подписаться #реклама О рекламодателе

Все объекты, которые в настоящий момент существуют в памяти интерпретатора, можно получить с помощью gc.get_objects():

In [1]: class A:
   ...:     def __init__(self, x):
   ...:         self._x = x
   ...:
   ...:     def __repr__(self):
   ...:         class_name = type(self).__name__
   ...:         x = self._x
   ...:         return f'{class_name}({x!r})'
   ...:

In [2]: A(1)
Out[2]: A(1)

In [3]: A(2)
Out[3]: A(2)

In [4]: A(3)
Out[4]: A(3)

In [5]: [x for x in gc.get_objects() if isinstance(x, A)]
Out[5]: [A(1), A(2), A(3)]
👉@BookPython

20 000 баллов на сервисы Яндекс Go для бизнеса Подключайтесь к сервису и оптимизируйте бизнес-процессы без бумажной волокиты.
20 000 баллов на сервисы Яндекс Go для бизнеса Подключайтесь к сервису и оптимизируйте бизнес-процессы без бумажной волокиты. Яндекс Go для бизнеса как личный помощник: - организует командировку; - отвезет до работы; - накормит сотрудников. Пока вы экономите время и силы. Узнать больше #реклама 16+ business.go.yandex О рекламодателе Реклама на Яндексе

Иногда нужно выполнить блок кода с несколькими менеджерами контекста:

with open('f') as f:
    with open('g') as g:
        with open('h') as h:
            pass
Начиная с Python 2.7 и 3.1, это можно записать в одной конструкции with:

o = open
with o('f') as f, o('g') as g, o('h') as h:
    pass
Раньше для этого использовали функцию contextlib.nested:

with nested(o('f'), o('g'), o('h')) as (f, g, h):
    pass
Если же число менеджеров контекста заранее неизвестно, лучше подойдёт более продвинутый инструмент. contextlib.ExitStack позволяет открывать любое число контекстов в произвольный момент, но гарантирует корректный выход из них в конце:

with ExitStack() as stack:
    f = stack.enter_context(o('f'))
    g = stack.enter_context(o('g'))
    other = [
        stack.enter_context(o(filename))
        for filename in filenames
    ]
👉@BookPython

Регистрируйтесь на вебинар UserGate WAF 💻Расскажет как новая версия UserGate WAF поможет защитить ваши веб-приложения и какие обновления ждут вас в 2025 году ✅На вебинаре будет: - Преимущества и особенности UserGate WAF - Принципы работы и сценарии использования - Демонстрация возможностей WAF - Планы развития продукта в 2025 году - Ответы на вопросы 👌Расскажем, как защитить вашу компанию. Регистрируйтесь — будет интересно! Зарегистрироваться #реклама 16+ webinar.usergate.com О рекламодателе

В Python блок else может располагаться не только после if, но и после for и while. Код внутри else выполняется, если цикл не был прерван оператором break. Обычный способ использования этого — найти что-то в цикле и выйти из него через break, когда нужный элемент найден:

>>> first_odd = None
>>> for x in [2, 3, 4, 5]:
...     if x % 2 == 1:
...         first_odd = x
...         break
... else:
...     raise ValueError('В списке нет нечетных элементов')
...
>>> first_odd
3

>>> for x in [2, 4, 6]:
...     if x % 2 == 1:
...         first_odd = x
...         break
... else:
...     raise ValueError('В списке нет нечетных элементов')
...
...
ValueError: В списке нет нечетных элементов
👉@BookPython

Яндекс Музыка ваша за ответ на 1 вопрос Яндекс Музыка, Книги и Кинопоиск в одной подписке для вас и 3-х ваших близких. Попроб
Яндекс Музыка ваша за ответ на 1 вопрос Яндекс Музыка, Книги и Кинопоиск в одной подписке для вас и 3-х ваших близких. Попробуйте бесплатно👍 Попробовать #реклама 18+ mrqz.me О рекламодателе Реклама на Яндексе

В Python операторы += и + являются разными. За их поведение отвечают методы __iadd__ и __add__ соответственно.

class A:
    def __init__(self, x):
        self.x = x

    def __iadd__(self, another):
        self.x += another.x
        return self

    def __add__(self, another):
        return type(self)(self.x + another.x)
Если __iadd__ не определён, выражение a += b сводится к простому a = a + b. Обычно разница между += и + в том, что первый изменяет объект, а второй создаёт новый:

>>> a = [1, 2, 3]
>>> b = a
>>> a += [4]
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3, 4]
>>> a = a + [5]
>>> a
[1, 2, 3, 4, 5]
>>> b
[1, 2, 3, 4]
👉@BookPython

Как за 2 года стать продакт-менеджером с реальными кейсами в портфолио? 🤔 Чтобы создавать классные цифровые продукты не обяз
Как за 2 года стать продакт-менеджером с реальными кейсами в портфолио? 🤔 Чтобы создавать классные цифровые продукты не обязательно иметь  техническое образование. Продакт-менеджер анализирует рынок и аудиторию,  создаёт MVP и проводит тесты, разбирается в юнит-экономике и умеет доносить ценность продукта. Освоить необходимые компетенции, чтобы управлять продуктовой командой,  можно в магистратуре Нетологии и РАНХиГС «Управление ИТ-продуктом». 3 июня пройдёт день открытых дверей,  на котором вы познакомитесь с программой обучения и узнаете:  ◾ где работают менеджеры цифровых продуктов и какие задачи решают; ◾ какие навыки ценят работодатели и какие карьерные треки есть в профессии; ◾ как магистратура помогает в развитии карьеры. А ещё сможете задать вопросы академическому руководителю программы. Встреча будет полезна всем, кто задумывается о получении диплома магистра  и хочет развиваться в одной из самых востребованных профессий в IT. 🔗 Присоединяйтесь:  https://tglink.io/93ce51d95631?erid=2W5zFHgNoX6 

Оператор in можно использовать с генераторами: x in g. Python будет итерировать g, пока x не найдётся или генератор не исчерпается.

>>> def g():
...     print(1)
...     yield 1
...     print(2)
...     yield 2
...     print(3)
...     yield 3
...
>>> 2 in g()
1
2
True
Однако range() делает для вас больше. В нём переопределён магический метод __contains__, который позволяет оператору in работать с сложностью O(1):

In [1]: %timeit 10**20 in range(10**30)
375 ns ± 10.7 ns per loop
Учтите, что это не работает для функции xrange() в Python 2. 👉@BookPython

Класс объекта доступен через атрибут __class__:

>>> [1, 2].__class__
<class 'list'>
Однако более привычный способ получить класс — использовать функцию type. Это также единственный способ, который работает для классов старого стиля.

>>> type([1, 2])
<class 'list'>
Кроме того, если вы хотите проверить, является ли некоторый объект экземпляром данного класса, следует использовать isinstance вместо прямого сравнения:

>>> class A:
...     pass
...
>>> class B(A):
...     pass
...
>>> type(B())
<class '__main__.B'>
>>> isinstance(B(), A)
True
👉@BookPython