ru
Feedback

Не попадитесь на канал ботавода! Telemetrio находит и помечает такие каналы 👉 Хотите видеть метку — оформите подписку

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

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

Открыть в Telegram

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

Больше

📈 Аналитический обзор Telegram-канала Библиотека Python разработчика | Книги по питону

Канал Библиотека Python разработчика | Книги по питону (@bookpython) языкового сегмента Русский является активным участником. Сейчас сообщество объединяет 17 969 подписчиков, занимая 7 264 место в категории Технологии и приложения и 36 611 место в регионе Россия.

📊 Показатели аудитории и динамика

С момента создания невідомо проект демонстрирует стремительный рост, собрав аудиторию из 17 969 подписчиков.

Согласно последним данным от 30 октября, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило -95, а за последние 24 часа — -1, при этом общий охват остаётся высоким.

  • Статус верификации: Не верифицирован
  • Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 5.36%. В первые 24 часа после публикации контент обычно набирает 2.75% реакций от общего числа подписчиков.
  • Охват публикаций: В среднем каждый пост получает 963 просмотров. В течение первых суток публикация набирает 494 просмотров.
  • Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 4.
  • Тематические интересы: Контент сосредоточен на ключевых темах, таких как numbers, yield, модуль, none, декоратор.

📝 Описание и контентная политика

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

Благодаря высокой частоте обновлений (последние данные получены 31 октября, 2026) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.

17 969
Подписчики
-124 часа
-287 дней
-9530 дней
Архив постов
Сочи, 25м² с ремонтом, вид на море, цена снижена на 21% На территории круглогодичный бассейн, рестораны, детские и спорт площадки. 7 минут пешком до пляжа. Надежный застройщик. ⚡ Квартиры в ЖК доступны в : ✅ субсидированную ипотеку под 0,1% (возможна программа без первоначального взноса) ✅ беспроцентную рассрочку. Оставь телефон чтобы узнать цену! Смотреть Финансовые услуги оказывает: АО "Альфа Банк", АО "Россельхозбанк" и др.. #реклама mrqz.me О рекламодателе

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

# Пример 1: Список содержит нечётное число
first_odd = None
for x in [2, 3, 4, 5]:
    if x % 2 == 1:  # Проверяем, является ли число нечётным
        first_odd = x
        break       # Прерываем цикл, так как элемент найден
else:
    raise ValueError('No odd elements in list')  # Выполнится, если цикл завершился без break

print(first_odd)  # Результат: 3
Если в списке нет подходящего элемента, цикл завершается естественным образом, и выполняется блок else:

# Пример 2: Список не содержит нечётных чисел
for x in [2, 4, 6]:
    if x % 2 == 1:
        first_odd = x
        break
else:
    raise ValueError('No odd elements in list')  # Исключение будет поднято

# ValueError: No odd elements in list
👉@BookPython

Квартиры в Краснодаре от 3,3 млн. руб. Новый жилой район "Первое место" в Краснодаре. Здесь всё для счастливой жизни на перво
Квартиры в Краснодаре от 3,3 млн. руб. Новый жилой район "Первое место" в Краснодаре. Здесь всё для счастливой жизни на первом месте: - Две школы - Шесть детских садов - Поликлиники - Собственный фитнес-центр - Многоуровневый паркинг Жилой комплекс располагается в новом районе города «Новознаменский», в Карасунском округе Краснодара и имеет удобный выезд на трассу М4 ДОН, Джубгскую трассу в направлении Черного моря и горнолыжных курортов. Только в декабре скидка 8% при покупке квартиры за собственные средства. Успейте забрать билет в жизнь, где вы всегда будете на «Первом месте»! Получить предложение Проектная декларация на сайте https://наш.дом.рф/. Застройщик: ООО " СЗ Живые квартиры" #реклама promo.tochno-pervoe.ru О рекламодателе

Функция itertools.chain позволяет объединить несколько итерируемых объектов, чтобы работать с ними, как с единым целым:

from itertools import chain

print(list(chain(['a', 'b'], range(3), set('xyz'))))
# Вывод: ['a', 'b', 0, 1, 2, 'x', 'z', 'y']
Иногда нужно проверить, пуст ли генератор (точнее, исчерпан ли он). Для этого можно попытаться получить следующий элемент с помощью next(). Если элемент есть, его нужно вернуть обратно в генератор, но сделать это напрямую невозможно. Однако можно «приклеить» его обратно с помощью chain:

from itertools import chain

def sum_of_odd(gen):
    try:
        first = next(gen)  # Пытаемся получить первый элемент
    except StopIteration:
        raise ValueError('Empty generator')  # Если генератор пуст, выбрасываем исключение

    # Используем chain для возврата первого элемента и объединения с остальными
    return sum(
        x for x in chain([first], gen)
        if x % 2 == 1  # Суммируем только нечетные числа
    )
Пример использования:

print(sum_of_odd(x for x in range(1, 6)))  # Вывод: 9 (1 + 3 + 5)
print(sum_of_odd(x for x in range(2, 3)))  # Вывод: 0 (нет нечетных чисел)
print(sum_of_odd(x for x in range(2, 2)))  # ValueError: Empty generator
👉@BookPython

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

Метод format в Python для строк — мощный инструмент, поддерживающий множество возможностей, о которых вы, возможно, даже не знали. Каждый заменяемый плейсхолдер ({...}) может содержать три части: имя поля, преобразование и спецификацию формата. Имя поля используется для указания, какой именно аргумент должен быть подставлен:

>>> '{}'.format(42)
'42'
>>> '{1}'.format(1, 2)
'2'
>>> '{y}'.format(x=1, y=2)
'2'
Преобразование позволяет указать, что вместо str() следует использовать repr() (или ascii()) при преобразовании объектов в строки:

>>> '{!r}'.format(datetime.now())
'datetime.datetime(2018, 5, 3, 23, 48, 49, 157037)'
>>> '{}'.format(datetime.now())
'2018-05-03 23:49:01.060852'
Спецификация формата задаёт, как значения будут представлены:

>>> '{:+,}'.format(1234567)
'+1,234,567'
>>> '{:>19}'.format(1234567)
'            1234567'
Эта спецификация может быть применена и к отдельному объекту с помощью функции format (не метода str):

>>> format(5000000, '+,')
'+5,000,000'
Функция format вызывает метод __format__ объекта, поэтому вы можете изменить его поведение для своих типов. 👉@BookPython

Визуализация данных — это ключевой этап анализа, который помогает выявить скрытые закономерности, а также улучшить понимание
Визуализация данных — это ключевой этап анализа, который помогает выявить скрытые закономерности, а также улучшить понимание структуры данных для дальнейшего применения машинного обучения Приглашаем на открытый урок «Визуализация данных на Python», посвященный курсу «Machine Learning» от Otus. ✅ Практика: визуализация данных Python на основных библиотеках: Matplotlib; Seaborn; Plotly 👉 Регистрация и подробности: https://vk.cc/cH48zk Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru

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

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

from functools import partial

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

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

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

🔑 Использование объектов в качестве ключей словаря в Python В Python вы можете использовать любой объект в качестве ключа словаря, если он реализует метод __hash__. Этот метод возвращает целое число, но при этом важно соблюдать одно ключевое требование: равные объекты должны иметь одинаковый хэш (обратное утверждение необязательно). 👉 Не используйте изменяемые объекты в качестве ключей! Если объект изменяется после добавления в словарь, он становится "невидимым" для поиска, так как его хэш может измениться. 🌀 Странность с отрицательными хэшами Есть интересная особенность, которая может вас удивить при отладке или написании юнит-тестов. Рассмотрим следующий пример:

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 зарезервировано для внутренних ошибок. Если хэш-значение равно -1, интерпретатор автоматически преобразует его в -2. Это может вызывать неожиданные проблемы при сравнении или использовании объектов в качестве ключей. 👉 @BookPython

Hermes: мужские зимние кроссовки с мехом ⚡ Онлайн-магазин брендовой одежды, обуви и аксессуаров по самым выгодным ценам! ✅ Ты
+4
Hermes: мужские зимние кроссовки с мехом ⚡ Онлайн-магазин брендовой одежды, обуви и аксессуаров по самым выгодным ценам! ✅ Тысячи моделей от топовых брендов, премиум качество, новинки каждый день! Tommy Hilfiger Burberry Emporio Armani 7 Moncler Dolce & Gabbana Hugo Boss Polo Ralph Lauren Hermes Brunello Cucinelli и др. 🚗 Доставка с примеркой по Москве, быстрая доставка по всей России и СНГ. 💰 Скидки до -80% в нашем дисконт Telegram-канале. ❤️ Твой новый стиль всего в одном клике. Переходи! Подписаться #реклама О рекламодателе

📌 О представлении данных в байтах в Python Когда мы храним данные в памяти или на устройстве хранения, их необходимо представить в виде байтов. Python позволяет работать с абстракцией данных, не задумываясь об их байтовом представлении. Однако при записи строки в файл мы фактически работаем с физической структурой данных. Чтобы записать символы в файл, их нужно преобразовать в байты — это называется кодированием (encoding). Когда вы читаете байты из файла и хотите преобразовать их в понятные символы, этот процесс называется декодированием (decoding). 🔤 Кодировки и их применение Существует множество методов кодирования. Один из самых популярных — Unicode, но сам по себе Unicode не является кодировкой в традиционном смысле. Unicode определяет соответствие между символами и их числовыми кодами. Например, 🐍 имеет код 128 013. Однако, чтобы записать числа в файл, нужна настоящая кодировка. Unicode обычно используется с utf-8, которая (в большинстве случаев) является кодировкой по умолчанию в Python. При чтении из файла Python автоматически декодирует данные, используя utf-8. Если вы хотите использовать другую кодировку, просто укажите её с помощью параметра encoding= в функции open. А чтобы работать с "чистыми" байтами, добавьте символ b к режиму открытия файла. Пример:

# Кодирование строки в файл
with open('example.txt', 'w', encoding='utf-8') as f:
    f.write('Привет, мир!')

# Чтение в байтовом режиме
with open('example.txt', 'rb') as f:
    data = f.read()
    print(data)  # Вывод: b'\xd0\x9f\xd1\x80\xd0\xb8...'
👉 @BookPython

Студия в Краснодаре за 16 780 р/мес. МКР Родные просторы Жилой комплекс "Родные Просторы" в Краснодаре - это масштабный проек
Студия в Краснодаре за 16 780 р/мес. МКР Родные просторы Жилой комплекс "Родные Просторы" в Краснодаре - это масштабный проект группы компаний ТОЧНО, который предлагает уникальные условия для комфортной жизни. "Родные просторы" - это не просто квартиры, это целый микрорайон, созданный с учетом потребностей современных семей. Здесь предусмотрены разнообразные планировки и высококачественная отделка, что позволяет каждому выбрать идеальное жильё. ✨Уникальное предложение этого месяца - студия за 16 780 рублей в месяц. Узнать больше Проектная декларация на сайте https://наш.дом.рф/. Застройщик: ООО СЗ ЮГСТРОЙИМПЕРИАЛ. Финансовые услуги оказывает: ПАО "Сбербанк", АО "АЛЬФА-БАНК" и др.. #реклама promo.tochno-rp.ru О рекламодателе

Если вам нужно выполнить поиск в отсортированной коллекции, то бинарный поиск — это именно то, что вам нужно. Этот простой алгоритм сравнивает искомое значение с элементом в середине массива; результат определяет, какую половину нужно искать дальше. Стандартная библиотека Python предоставляет возможность использовать бинарный поиск без его непосредственной реализации. Функция bisect_left возвращает самую левую позицию элемента в отсортированном списке, а bisect_right — самую правую.

from random import randrange
from bisect import bisect_left

n = 1000000
look_for = 555555
lst = sorted(randrange(0, n) for _ in range(n))

%timeit look_for in lst
# 69.7 ms ± 449 µs на цикл

%timeit look_for == lst[bisect_left(lst, look_for)]
# 927 ns ± 2.28 ns на цикл
Результаты демонстрируют, что использование бинарного поиска через bisect_left быстрее, чем стандартный поиск в списке с помощью оператора in. 👉 @BookPython

Модуль multiprocessing в Python: потоки против процессов Модуль multiprocessing позволяет создавать не только процессы, но и потоки. Однако стоит помнить о главной особенности CPython — GIL (Global Interpreter Lock). Этот механизм блокирует выполнение байт-кода Python несколькими потоками одновременно. Это означает, что потоки полезны в основном в случаях, когда программа выполняет операции, не связанные с Python-интерпретатором, например, ожидание ввода-вывода (IO). К примеру, загрузка трёх различных статей из Википедии будет одинаково эффективной как с потоками, так и с процессами. Причём результат в три раза быстрее по сравнению с выполнением задачи в одном процессе:

from multiprocessing import Pool
from multiprocessing.pool import ThreadPool
import requests

def download_wiki_article(article):
    url = 'http://de.wikipedia.org/wiki/'
    return requests.get(url + article)

process_pool = Pool(3)
thread_pool = ThreadPool(3)

thread_pool.map(download_wiki_article, ['a', 'b', 'c'])
# ~376 ms

process_pool.map(download_wiki_article, ['a', 'b', 'c'])
# ~373 ms

[download_wiki_article(a) for a in ['a', 'b', 'c']]
# ~1.09 s
Однако использование потоков для задач, нагружающих CPU, практически бессмысленно:

import math
from multiprocessing import Pool
from multiprocessing.pool import ThreadPool

def f(x):
    return len(str(math.factorial(x)))

process_pool = Pool(4)
thread_pool = ThreadPool(4)
inputs = [i ** 2 for i in range(100, 130)]

[f(x) for x in inputs]
# ~1.48 s

thread_pool.map(f, inputs)
# ~1.48 s

process_pool.map(f, inputs)
# ~478 ms
При задачах, требующих интенсивных вычислений, использование процессов вместо потоков даст значительный прирост производительности благодаря распределению нагрузки между несколькими ядрами процессора. 👉 @BookPython

Рассрочка 10 000 ₽/мес. — Мкр. «Самолёт» в Краснодаре Жилой микрорайон расположен на северо-западе Краснодара, в районе Запад
Рассрочка 10 000 ₽/мес. — Мкр. «Самолёт» в Краснодаре Жилой микрорайон расположен на северо-западе Краснодара, в районе Западного Обхода. Он находится далеко от промышленных предприятий. Здесь будет всё для комфортной жизни: современные дома с разными планировками, школы и детские сады, поликлиника, торговые центры, парки и аллеи. Центр притяжения микрорайона — бульвар длиной 1,6 км с зонами для отдыха и развлечений. На территории проекта расположено: 3 школы, 5 детских садов, спортивные площадки. - Квартиры от 3,7 млн рублей - Скидка 10% на Новогодние квартиры - Скидка до 15% на готовые квартиры Выбирайте квартиру по лучшей цене на сайте! Получить предложение Проектная декларация на сайте https://наш.дом.рф/. Финансовые услуги оказывает: ПАО "ВТБ", ПАО "Сбербанк". #реклама mrqz.me О рекламодателе

Как ускорить вычисления в Python с помощью multiprocessing.Pool Когда речь заходит о ресурсоемких задачах, которые нагружают ваш CPU, стоит обратить внимание на библиотеку multiprocessing, а именно на класс Pool. Он позволяет задействовать все доступные ядра процессора, автоматически распределяя задачи между ними. Вот простой пример:

import math
from multiprocessing import Pool

# Генерируем список входных данных
inputs = [i ** 2 for i in range(100, 130)]

# Функция для вычислений
def f(x):
    return len(str(math.factorial(x)))

# Последовательное выполнение
%timeit [f(x) for x in inputs]
# Результат: ~1.44 сек

# Параллельное выполнение
p = Pool(4)  # Создаем пул из 4 процессов
%timeit p.map(f, inputs)
# Результат: ~451 мс
👉 @BookPython

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

Пагинация — это стандартная задача, с которой ежедневно сталкиваются тысячи разработчиков. Если вы используете реляционную базу данных, то можно задать смещение через LIMIT, например:

SELECT *
FROM table
LIMIT 1001, 100;
Этот запрос действительно вернет 100 записей, с 1001-й по 1100-ю. Но проблема в том, что для базы данных это так же сложно, как и выборка всех первых 1001 записей. Чем дальше запрашиваемая страница, тем медленнее будет выполняться запрос. Более оптимальным решением является использование фильтрации через WHERE, где клиент передает идентификатор последней записи текущей страницы ($last_seen_id в примере):

SELECT *
FROM table
WHERE id > $last_seen_id
ORDER BY id ASC
LIMIT 100;
Этот подход позволяет избежать сканирования всех предыдущих строк, что значительно ускоряет работу с большими объемами данных. Если хотите разобраться подробнее, рекомендую почитать отличную статью на эту тему! 👉 @BookPython

Тьфу-ты! Опять негодяи надули дедушку и украли деньги. Помогите пенсионеру поймать мошенника и вернуть украденное в игре по м
Тьфу-ты! Опять негодяи надули дедушку и украли деньги. Помогите пенсионеру поймать мошенника и вернуть украденное в игре по мотивам сериала «Мамонты». Если справитесь, получите шанс выиграть ценные призы! Играть #реклама 16+ О рекламодателе

Если вы пишете много Python-кода, наверняка сталкивались с типичной задачей: определение класса с простым конструктором и базовыми методами вроде __repr__. Например:

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

    def __repr__(self):
        return '{klass}("{ip}", {version})'.format(
            klass=type(self).__name__,
            ip=self.ip,
            version=self._version,
        )
Это выглядит однообразно, но легко автоматизируется. Популярный пакет attrs позволяет избавиться от такого шаблонного кода:

from attrs import define, field

@define
class Server:
    ip = field()
    _version = field(default=4)

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

from dataclasses import dataclass

@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
Почему стоит обратить внимание на data classes: 1. Чистый код: Конструкция читается просто и выглядит лаконично. 2. Поддержка стандартной библиотеки: Не нужно добавлять зависимости. 3. Типы и валидация: С аннотациями типов ваш код становится более понятным и безопасным. attrs остаётся полезным инструментом, особенно если вам нужны более продвинутые возможности (например, валидация значений полей), но для большинства задач data classes — отличное решение прямо "из коробки". 👉@BookPython