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

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

前往频道在 Telegram

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

显示更多

📈 Telegram 频道 Библиотека Python разработчика | Книги по питону 的分析概览

频道 Библиотека Python разработчика | Книги по питону (@bookpython) 俄语 语言赛道中的 是活跃参与者。目前社区聚集了 18 326 名订阅者,在 技术与应用 类别中位列第 7 317,并在 俄罗斯 地区排名第 36 872

📊 受众指标与增长动态

невідомо 创建以来,项目保持高速增长,吸引了 18 326 名订阅者。

根据 05 六月, 2026 的最新数据,频道保持稳定运转。过去 30 天订阅人数变化为 -86,过去 24 小时变化为 -1,整体触达仍然可观。

  • 认证状态: 未认证
  • 互动率 (ER): 平均受众互动率为 6.08%。内容发布后 24 小时内通常能获得 2.60% 的反应,占订阅者总量。
  • 帖子覆盖: 每篇帖子平均可获得 1 114 次浏览,首日通常累积 477 次浏览。
  • 互动与反馈: 受众积极参与,单帖平均反应数为 2
  • 主题关注点: 内容集中在 numbers, yield, модуль, none, декоратор 等核心主题上。

📝 描述与内容策略

作者将该频道定位为表达主观观点的平台:
Погружение в CPython и архитектуру. Разбираем неочевидное поведение (GIL, Memory), Best Practices (SOLID, DDD) и тонкости Django/FastAPI. Решаем задачи с подвохом и оптимизируем алгоритмы. 🐍 По всем вопросам @evgenycarter РКН clck.ru/3Ko7Hq

凭借高频更新(最新数据采集于 06 六月, 2026),频道始终保持新鲜度与高覆盖。分析显示受众积极互动,使其成为 技术与应用 类别中的关键影响点。

18 326
订阅者
-124 小时
-277
-8630
帖子存档
Некоторым генераторам нужно возвращать все элементы другого генератора:

>>> def enclose(gen, before='{', after='}'):
...     yield before
...     for x in gen:
...         yield x
...     yield after
...
>>> list(enclose(range(5)))
['{', 0, 1, 2, 3, 4, '}']
Однако предпочтительнее использовать yield from:

>>> def enclose(gen, before='{', after='}'):
...     yield before
...     yield from gen
...     yield after
yield from не только работает быстрее, но и автоматически обрабатывает передачу значений во вложенные генераторы, возврат значений из генераторов и даже выброс исключений внутри вложенного генератора. 👉@BookPython

Старт продаж 10 новых домов в центре Москвы Скачайте каталог новостроек на старте продаж. Квартиры от 20 000 000 рублей. Пере
Старт продаж 10 новых домов в центре Москвы Скачайте каталог новостроек на старте продаж. Квартиры от 20 000 000 рублей. Перейти на сайт Проектная декларация на сайте https://наш.дом.рф/ #реклама 16+ new.whitewill.ru О рекламодателе

🚀 Открой для себя идеальный путь к лидерству с карьерным тестом от ОЭЗ «Алабуга»! 🌟 Мечтаете о карьере в крупной компании,
🚀 Открой для себя идеальный путь к лидерству с карьерным тестом от ОЭЗ «Алабуга»! 🌟 Мечтаете о карьере в крупной компании, где ваш потенциал раскроется на полную? Наш тест поможет вам определить вашу уникальную лидерскую роль. Может быть, именно вы станете тем лидером, который выведет команду на новый уровень? После прохождения теста вы можете заполнить заявку и получить приглашение на эксклюзивную лидерскую программу. Участие в программе открывает реальные перспективы трудоустройства в ОЭЗ «Алабуга», предоставляя шанс начать путь к профессиональному признанию. Сделайте первый шаг к своему будущему сегодня! Пройдите тест, подайте заявку и начните строить свою карьеру вместе с нами. 🎯

Наверное, самая распространённая ошибка новичков в Python — это использование изменяемого объекта в качестве значения по умолчанию для аргумента функции. Такой объект будет общим для всех вызовов функции, что может привести к неожиданным результатам:

def append_length(lst=[]):
    lst.append(len(lst))
    return lst

print(append_length([1, 2])) # [1, 2, 2]
print(append_length())       # [0]
print(append_length())       # [0, 1]
Однако в некоторых случаях, например при реализации кешей, такое поведение может быть полезным:

def fact(x, cache={0: 1}):
    if x not in cache:
        cache[x] = x * fact(x - 1)
    return cache[x]

print(fact(5))
В этом примере мы сохраняем вычисленные значения факториала внутри значения аргумента по умолчанию. Причём к этому значению даже можно обратиться напрямую:

>>> fact.__defaults__
({0: 1, 1: 1, 2: 2, 3: 6, 4: 24, 5: 120},)
👉@BookPython

В Python можно использовать любой объект в качестве ключа словаря, если он реализует метод __hash__. Этот метод может возвращать любое целое число, но есть одно обязательное условие: равные объекты должны иметь одинаковые хэши (обратное не обязательно). Также не стоит использовать изменяемые объекты в качестве ключей, потому что если объект изменится и станет не равным самому себе в прошлом, его больше нельзя будет найти в словаре. Есть и один странный момент, который может удивить во время отладки или написания unit-тестов:

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

    def __hash__(self):
        return self.x

hash(A(2))   # 2
hash(A(1))   # 1
hash(A(0))   # 0
hash(A(-1))  # внимание!
# -2
hash(A(-2))  # -2
В CPython значение -1 зарезервировано для внутренних ошибок, поэтому оно неявно преобразуется в -2. 👉@BookPython

🔍Тестовое собеседование на Middle Python-разработчика в четверг 22 мая(в четверг) в 19:00 по мск приходи онлайн на открытое
🔍Тестовое собеседование на Middle Python-разработчика в четверг 22 мая(в четверг) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Python-разработчика. Собес проведет Вадим Пуштаев, ex. head of backend в 💙, автор канала @pythonetc, архитектор в европейской компании Как это будет: 📂 Вадим будет задавать реальные вопросы и задачи разработчику-добровольцу 📂 Вадим будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью 📂 В конце можно будет задать любой вопрос Вадиму Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Python-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы. Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_py_bot Реклама. ООО "ШОРТКАТ", ИНН: 9731139396, erid: 2VtzqwKtUmr

Модуль collections предоставляет класс ChainMap, который позволяет использовать несколько отображений (словарей) как одно объединённое:

from collections import ChainMap

d = ChainMap(dict(a=1), dict(a=2, b=2))
d['a']  # 1
d['b']  # 2
d['c']  # ...
# KeyError: 'c'
ChainMap последовательно просматривает все вложенные отображения и возвращает первое найденное значение. Однако все операции изменения затрагивают только первое отображение:

d = ChainMap(dict(a=1), dict(a=2, b=2))
d['c'] = 3
d
# ChainMap({'a': 1, 'c': 3}, {'a': 2, 'b': 2})
👉@BookPython

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

В Python сортировка по умолчанию является стабильной, то есть сохраняет порядок равных элементов:

a = [2, -1, 0, 1, -2]
sorted(a, key=lambda x: x**2)
# [0, -1, 1, 2, -2]
Функции max и min тоже стараются быть согласованными с поведением sorted. max работает аналогично sorted(a, reverse=True)[0], а min — как sorted(a)[0]. Это означает, что обе функции возвращают самый левый возможный результат:

max([2, -2], key=lambda x: x**2)
# 2

max([-2, 2], key=lambda x: x**2)
# -2

min([2, -2], key=lambda x: x**2)
# 2

min([-2, 2], key=lambda x: x**2)
# -2
👉@BookPython

Многие Python-классы начинаются с похожего шаблона: простой конструктор, тривиальный __repr__ и прочие подобные вещи:

class Server:
    def __init__(self, ip, version=4):
        self.ip = ip
        self._version = version

    def __repr__(self):
        return '{klass}("{ip!r}", {version!r})'.format(
            klass=type(self).__name__,
            ip=self.ip,
            version=self._version,
        )
Один из способов упростить такую рутину — использовать популярный пакет attrs, который автоматически генерирует множество стандартных методов на основе нескольких деклараций:

class Server:
    ip = attrib()
    _version = attrib(default=4)

server = Server(ip='192.168.0.0.1', version=4)
Этот подход не только создаёт конструктор (__init__) и представление (__repr__), но и полный набор методов сравнения (__eq__, __lt__ и т. д.). Кроме того, в Python 3.7 появилась стандартная альтернатива — data classes (датаклассы), которые решают ту же задачу (и даже больше). Они используют аннотации переменных — ещё одну относительно новую функцию Python. Вот пример:

@dataclass
class InventoryItem:
    name: str
    unit_price: float
    quantity_on_hand: int = 0

    def total_cost(self) -> float:
        return self.unit_price * self.quantity_on_hand
Таким образом, dataclass тоже автоматически создаёт __init__, __repr__, методы сравнения и многое другое, основываясь лишь на аннотациях типов.

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

Есть три ситуации, в которых только что созданную переменную нельзя аннотировать типом: распаковка кортежей, циклы for и инструкции with. Все эти примеры некорректны:

name: str, age: int = student

for x: int in numbers: 
    ...

with connection() as conn: Connection:
    ...
Правильный способ указать тип таких переменных — объявить их заранее, без инициализации:

conn: Connection
with connection() as conn:
    ...
👉@BookPython

Раньше будет лучше! «Извините, у нас всё забронировано» — фраза, которую никто не хочет услышать при планировании отпуска. Ян
Раньше будет лучше! «Извините, у нас всё забронировано» — фраза, которую никто не хочет услышать при планировании отпуска. Яндекс Путешествия решили эту проблему и запустили акцию раннего бронирования на лето. Они собрали отели и квартиры со скидками и от себя добавили промокод ZARANEE20. Получилось максимально выгодно: до 40% экономии в месте, где вы действительно хотите отдохнуть, а не «там, где хоть что-то досталось». Забронировать #реклама 16+ special.travel.yandex.ru О рекламодателе

Каждая хорошо спроектированная консольная утилита должна принимать аргументы в виде опций (например, -h или --help), опций с параметрами (--log-level 2) или позиционных параметров (cp file1 file2). Опции отличаются от позиционных параметров тем, что начинаются с одного или двух дефисов. Проблемы возникают, когда позиционные аргументы тоже начинаются с дефиса — например, если нужно удалить файл с именем -rf: команда rm -rf в таком случае не работает как ожидается. Общепринятый способ решения этой проблемы — поддержка разделителя --. Аргументы, идущие после --, никогда не интерпретируются как опции:

$ echo test > -rf
$ cat -rf
cat: invalid option -- 'r'
Try 'cat --help' for more information.
$ cat -- -rf
test
$ rm -- -rf
$ cat -- -rf
cat: -rf: No such file or directory
Модуль argparse автоматически обрабатывает -- за тебя. 👉@BookPython

Яндекс Путешествия подготовили 17 поводов для поездок на все выходные вплоть до 31 августа. А с промокодом WEEKEND20 на скидк
Яндекс Путешествия подготовили 17 поводов для поездок на все выходные вплоть до 31 августа. А с промокодом WEEKEND20 на скидку до 20% путешествия станут ещё приятнее! Сохраняйте и делитесь с друзьями Получить скидку #реклама 16+ yatravel.go.link О рекламодателе

Некоторые модули могут содержать такие запутанные конструкции:

try:
    cache
except NameError:
    cache = {}
На первый взгляд, в этом нет смысла: cache однозначно вызовет NameError в начале модуля, так как переменной ранее не присваивалось значение. Однако это не так, если модуль перезагружается. В этом случае словарь, содержащий все атрибуты модуля, повторно используется, что даёт модулю возможность повторно использовать атрибуты своего предыдущего экземпляра. Если модуль спроектирован с учётом возможности перезагрузки, он может опираться на эту особенность. Например, приведённый выше код сохранить кэш при перезагрузке модуля. 👉@BookPython

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

Если вы импортируете модуль, который уже был импортирован, ничего не произойдёт, так как Python отслеживает, какие модули уже были загружены. Все такие модули помещаются в словарь sys.modules:

In : import sys
In : 'sys' in sys.modules.keys()
Out: True
Если вам действительно нужно перезагрузить модуль, следует использовать функцию importlib.reload(m). Здесь m — это объект модуля, который был успешно импортирован ранее, а не строка с его именем:

In : import importlib
In : importlib.reload(importlib)
Out[5]: <module 'importlib' from '/home/bookpython/.ve/pythonetc/lib/python3.6/importlib/__init__.py'>
👉@BookPython

В Python имя переменной может состоять из одного символа подчёркивания: _. Хотя такие имена обычно недостаточно описательны и их не стоит использовать, существует по крайней мере три случая, когда _ имеет общепринятое значение. Во-первых, в интерактивных интерпретаторах Python _ используется для хранения результата последнего выполненного выражения:

>>> 2 + 2  
4  
>>> _  
4
Во-вторых, в документации модуля gettext рекомендуется создавать псевдоним для функции gettext() в виде _(), чтобы не загромождать код. В-третьих, _ используется, когда необходимо придумать имя для значения, которое не представляет интереса:

>>> log_entry = '10:50:24 14234 GET /api/v1/test'  
>>> time, _, method, location = log_entry.split()
👉@BookPython

Как ИИ-ассистенты помогают каждый день ИИ-ассистенты - кто они и как помогают с рабочими задачами? 💻Что может сделать цифров
Как ИИ-ассистенты помогают каждый день ИИ-ассистенты - кто они и как помогают с рабочими задачами? 💻Что может сделать цифровой помошник: ✅Сбор новостных данных и их публикация ✅Написание постов, которые звучат как я ✅Продажа продуктов на автопилоте ✅Консультирование команды Много полезного из мира ИИ в телеграм-канале. Подписывайся! Узнать больше #реклама О рекламодателе