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

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

Ir al canal en Telegram

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

Mostrar más

📈 Análisis del canal de Telegram Библиотека Python разработчика | Книги по питону

El canal Библиотека Python разработчика | Книги по питону (@bookpython) en el segmento lingüístico de Ruso es un actor destacado. Actualmente la comunidad reúne a 18 329 suscriptores, ocupando la posición 7 307 en la categoría Tecnologías y Aplicaciones y el puesto 36 869 en la región Rusia.

📊 Métricas de audiencia y dinámica

Desde su creación el невідомо, el proyecto ha mostrado un crecimiento acelerado, reuniendo a 18 329 suscriptores.

Según los últimos datos del 04 junio, 2026, el canal mantiene una actividad estable. En los últimos 30 días la variación de miembros fue de -86, y en las últimas 24 horas de -1, conservando un alto alcance.

  • Estado de verificación: No verificado
  • Tasa de interacción (ER): El promedio de interacción de la audiencia es 6.07%. Durante las primeras 24 horas tras publicar, el contenido suele obtener 2.61% de reacciones respecto al total de suscriptores.
  • Alcance de las publicaciones: Cada publicación recibe en promedio 1 112 visualizaciones. En el primer día suele acumular 479 visualizaciones.
  • Reacciones e interacción: La audiencia responde de forma activa: el promedio de reacciones por publicación es 2.
  • Intereses temáticos: El contenido se centra en temas clave como numbers, yield, модуль, none, декоратор.

📝 Descripción y política de contenido

El autor describe el recurso como un espacio para expresar opiniones subjetivas:
Погружение в CPython и архитектуру. Разбираем неочевидное поведение (GIL, Memory), Best Practices (SOLID, DDD) и тонкости Django/FastAPI. Решаем задачи с подвохом и оптимизируем алгоритмы. 🐍 По всем вопросам @evgenycarter РКН clck.ru/3Ko7Hq

Gracias a la alta frecuencia de actualizaciones (últimos datos recibidos el 05 junio, 2026), el canal mantiene la vigencia y un amplio alcance. La analítica demuestra que la audiencia interactúa activamente con el contenido, lo que lo convierte en un punto de referencia dentro de la categoría Tecnologías y Aplicaciones.

18 329
Suscriptores
-124 horas
-297 días
-8630 días
Archivo de publicaciones
🔑 Использование объектов в качестве ключей словаря в 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. Это может вызывать неожиданные проблемы при сравнении или использовании объектов в качестве ключей. 📲 Мы в MAX 👉@BookPython

📌 О представлении данных в байтах в 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...'
📲 Мы в MAX 👉@BookPython

Путешествуйте по миру с AZAL Летите в Баку с AZAL. Регулярные прямые рейсы. Путешествуйте с комфортом! Перейти на сайт #реклама azal.az О рекламодателе

Если вам нужно выполнить поиск в отсортированной коллекции, то бинарный поиск — это именно то, что вам нужно. Этот простой алгоритм сравнивает искомое значение с элементом в середине массива; результат определяет, какую половину нужно искать дальше. Стандартная библиотека 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. 📲 Мы в MAX 👉@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
При задачах, требующих интенсивных вычислений, использование процессов вместо потоков даст значительный прирост производительности благодаря распределению нагрузки между несколькими ядрами процессора. 📲 Мы в MAX 👉@BookPython

Три дня, которые изменят ваш взгляд на кибербезопасность Миссия посетителей SOC Forum: влиять на будущее индустрии безопаснос
+5
Три дня, которые изменят ваш взгляд на кибербезопасность Миссия посетителей SOC Forum: влиять на будущее индустрии безопасности. Стиль: разный. Собрали несколько характерных портретов участников! А каким участником планируете быть вы? - целеустремленным - основательным - многозадачным - тусовщиком - расслабленным И все это не выходя из дома. Зарегистрируйтесь, и мы напомним о старте трансляции и пришлем ссылку, чтобы вы ничего не пропустили. Записаться онлайн #реклама 16+ registration.forumsoc.ru О рекламодателе

Как ускорить вычисления в 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 мс
📲 Мы в MAX 👉@BookPython

Логика молока Молочные продукты, которые мы производим с любовью и заботой о вас! Подписаться и узнать о них больше. Подписат
Логика молока Молочные продукты, которые мы производим с любовью и заботой о вас! Подписаться и узнать о них больше. Подписаться #реклама О рекламодателе

🚀 Подборка Telegram каналов для программистов Системное администрирование, DevOps 📌 https://t.me/bash_srv Bash Советы https://t.me/win_sysadmin Системный Администратор Windows https://t.me/sysadmin_girl Девочка Сисадмин https://t.me/srv_admin_linux Админские угодья https://t.me/linux_srv Типичный Сисадмин https://t.me/devopslib Библиотека девопса | DevOps, SRE, Sysadmin https://t.me/linux_odmin Linux: Системный администратор https://t.me/devops_star DevOps Star (Звезда Девопса) https://t.me/i_linux Системный администратор https://t.me/linuxchmod Linux https://t.me/sys_adminos Системный Администратор https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало) https://t.me/sysadminof Книги для админов, полезные материалы https://t.me/i_odmin Все для системного администратора https://t.me/i_odmin_book Библиотека Системного Администратора https://t.me/i_odmin_chat Чат системных администраторов https://t.me/i_DevOps DevOps: Пишем о Docker, Kubernetes и др. https://t.me/sysadminoff Новости Линукс Linux 1C разработка 📌 https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С https://t.me/DevLab1C 1С:Предприятие 8 https://t.me/razrab_1C 1C Разработчик https://t.me/buh1C_prog 1C Программист | Бухгалтерия и Учёт https://t.me/rabota1C_rus Вакансии для программистов 1С Программирование C++📌 https://t.me/cpp_lib Библиотека C/C++ разработчика https://t.me/cpp_knigi Книги для программистов C/C++ https://t.me/cpp_geek Учим C/C++ на примерах Программирование Python 📌 https://t.me/pythonofff Python академия. https://t.me/BookPython Библиотека Python разработчика https://t.me/python_real Python подборки на русском и английском https://t.me/python_360 Книги по Python Java разработка 📌 https://t.me/BookJava Библиотека Java разработчика https://t.me/java_360 Книги по Java Rus https://t.me/java_geek Учим Java на примерах GitHub Сообщество 📌 https://t.me/Githublib Интересное из GitHub Базы данных (Data Base) 📌 https://t.me/database_info Все про базы данных Мобильная разработка: iOS, Android 📌 https://t.me/developer_mobila Мобильная разработка https://t.me/kotlin_lib Подборки полезного материала по Kotlin https://t.me/androidspb Разработка под Android: Kotlin, Java. Фронтенд разработка 📌 https://t.me/frontend_1 Подборки для frontend разработчиков https://t.me/frontend_sovet Frontend советы, примеры и практика! https://t.me/React_lib Подборки по React js и все что с ним связано Разработка игр 📌 https://t.me/game_devv Все о разработке игр Библиотеки 📌 https://t.me/book_for_dev Книги для программистов Rus https://t.me/programmist_of Книги по программированию https://t.me/proglb Библиотека программиста https://t.me/bfbook Книги для программистов БигДата, машинное обучение 📌 https://t.me/bigdata_1 Big Data, Machine Learning Программирование 📌 https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций https://t.me/rust_lib Полезный контент по программированию на Rust https://t.me/golang_lib Библиотека Go (Golang) разработчика https://t.me/itmozg Программисты, дизайнеры, новости из мира IT https://t.me/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 https://t.me/nodejs_lib Подборки по Node js и все что с ним связано https://t.me/ruby_lib Библиотека Ruby программиста https://t.me/lifeproger Жизнь программиста. Авторский канал. QA, тестирование 📌 https://t.me/testlab_qa Библиотека тестировщика Шутки программистов 📌 https://t.me/itumor Шутки программистов Защита, взлом, безопасность 📌 https://t.me/thehaking Канал о кибербезопасности https://t.me/xakep_2 Хакер Free Книги, статьи для дизайнеров 📌 https://t.me/ux_web Статьи, книги для дизайнеров Математика 📌 https://t.me/Pomatematike Канал по математике https://t.me/phis_mat Обучающие видео, книги по Физике и Математике https://t.me/matgeoru Математика | Геометрия | Логика Excel лайфхак📌 https://t.me/Excel_lifehack https://t.me/mir_teh Мир технологий (Technology World) Вакансии 📌 https://t.me/sysadmin_rabota Системный Администратор https://t.me/progjob Вакансии в IT

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

Логика молока Молочные продукты, которые мы производим с любовью и заботой о вас! Подписаться и узнать о них больше. Подписат
Логика молока Молочные продукты, которые мы производим с любовью и заботой о вас! Подписаться и узнать о них больше. Подписаться #реклама О рекламодателе

Когда вам нужно очистить список в Python, вы, скорее всего, используете lst = []. Однако на самом деле вы просто создаёте новый пустой список и присваиваете его переменной lst, а все другие переменные, которые ссылаются на исходный список, продолжают хранить его содержимое. Пример:

lst = [1, 2, 3]
lst2 = lst
lst = []
print(lst2)  # [1, 2, 3]
Хотя это кажется очевидным, правильное решение стало доступно только с введением метода lst.clear() в Python 3.3. До этого для очистки списка приходилось использовать: - del lst[:], или - lst[:] = []. Оба варианта работают, поскольку срезы позволяют модифицировать часть списка. Если вы берёте срез [:], он охватывает весь список. Теперь же lst.clear() является более читаемым и современным решением. 📲 Мы в MAX 👉@BookPython

Прежде чем читать длиннющий релиз новой версии Python 3.14, посмотрите это видео Евгения Афонасьева, тимлида разработки Antifraud в Авито 🚀 За 12 минут он рассказал, какие фичи стоят внимания внедрения в работу, про небольшие, но приятные обновления тоже не забыл. 📺 Смотрим и обсуждаем по ссылке!

Как узнать размер генератора в Python? В Python часто возникает задача определить размер генератора без необходимости извлечения всех его значений. Это полезно, если вы работаете с большими потоками данных и хотите избежать избыточного расхода памяти. Пример с len() Некоторые итераторы, такие как range, поддерживают вызов len():

len(range(10000))  # 10000
Однако генераторы не имеют длины, и попытка вызвать len() вызовет ошибку:

gen = (x ** 2 for x in range(10000))
len(gen)  # TypeError: object of type 'generator' has no len()
Стандартное решение: преобразование в список Один из способов получить размер генератора — это преобразовать его в список:

gen = (x ** 2 for x in range(10000))
print(len(list(gen)))  # 10000
Этот подход работает, но имеет серьёзный недостаток: он требует загрузить все значения генератора в память. Если генератор очень большой, это может привести к нехватке памяти. Более эффективный подход: подсчёт с помощью sum Чтобы избежать лишнего расхода памяти, можно подсчитать количество элементов в генераторе с использованием sum():

gen = (x ** 2 for x in range(10000))
print(sum(1 for _ in gen))  # 10000
Этот метод обходит генератор "лениво", не создавая дополнительных списков, что делает его идеальным для работы с большими потоками данных. Резюме - Используйте len() только для итераторов, поддерживающих его (например, range). - Для генераторов избегайте преобразования в список, если важна экономия памяти. - Используйте sum(1 for _ in gen) для эффективного подсчёта элементов генератора. 📲 Мы в MAX 👉@BookPython

Почему range() в Python использует полуоткрытые интервалы? Функция range() в Python работает с полуоткрытыми интервалами. Например, range(2, 10) задаёт числа в диапазоне [2, 10), то есть [2, 3, 4, 5, 6, 7, 8, 9]. На первый взгляд это может показаться неочевидным или асимметричным, но у такого подхода есть свои преимущества. Почему полуоткрытые интервалы? Полуоткрытые интервалы позволяют легко "склеивать" смежные диапазоны без риска ошибок на единицу: - Если a = 2, b = 5, и c = 10, то [a, c) можно выразить как:
  [a, c) = [a, b) + [b, c)
  
Это работает идеально, потому что конец одного интервала (`b`) автоматически становится началом следующего. В случае закрытых интервалов, такая "склейка" требует дополнительной обработки:
[a, c] = [a, b] + [b+1, c]
Связь с индексацией с нуля Индексация с нуля в Python также связана с этим принципом. Рассмотрим диапазон range(0, N): - Этот диапазон включает ровно N элементов, что делает код более предсказуемым:

  for i in range(0, N):
      print(i)
  
Здесь i проходит значения от 0 до N-1, что логично и удобно. Преимущества для работы с массивами Полуоткрытые интервалы идеально подходят для работы с индексами массивов:

arr = [10, 20, 30, 40, 50]
print(arr[1:3])  # [20, 30]
Интервал [1:3) охватывает элементы с индексами 1 и 2, но не 3, что упрощает вычисления границ. Исторический контекст Этот подход имеет глубокие корни в компьютерной науке. Эдсгер Дейкстра, один из пионеров программирования, в 1982 году написал блестящую статью, в которой обосновал преимущества полуоткрытых интервалов. Это не просто удобство — это вопрос корректности и простоты работы с данными. 👉 @BookPython

Блог практикующего врача-психотерапевта Хочешь прокачать свою продуктивность и быть на волне актуального? Добро пожаловать на Психоtips - канал, где врач-психотерапевт высшей категории делится инсайтами, которые перевернут твоё мышление! Разбираем реальные кейсы: как работает психика в сложных ситуациях и что помогает найти баланс. Получай рабочие инструменты для борьбы с тревогой, выгоранием и эмоциональными бурями - всё, что можно сразу применить в жизни. Будь в курсе трендов: свежие открытия в психологии, исследования мозга и новая философия 21 века. Плюс - разборы фильмов и сериалов с точки зрения психиатрии, мемы и обсуждения, которые зажигают новые идеи. Подписывайся на канал для тех, кто хочет глубже понимать себя и других. Подробнее #реклама 16+ О рекламодателе

Распаковка параметров функций в Python 2 и 3 В Python 2 существовала интересная возможность распаковывать параметры функций прямо в их определении. Пример:

def between(x, (start, stop)):
    return start < x < stop

interval = (5, 10)
print(between(2, interval))  # False
print(between(7, interval))  # True
Более того, это работало даже рекурсивно:

def determinant_2_x_2(((a, b), (c, d))):
    return a * d - c * b

matrix = [
    (1, 2),
    (3, 4),
]
print(determinant_2_x_2(matrix))  # -2
Но начиная с Python 3, эта возможность была удалена из языка. Чтобы добиться того же результата, теперь нужно распаковывать параметры вручную:

def determinant_2_x_2(matrix):
    row1, row2 = matrix
    a, b = row1
    c, d = row2
    return a * d - c * b

matrix = [
    (1, 2),
    (3, 4),
]
print(determinant_2_x_2(matrix))  # -2
Удаление этой функциональности сделало код более явным и читаемым, но для любителей компактности Python 2 по-прежнему вызывает лёгкую ностальгию. 📲 Мы в MAX 👉@BookPython

Как использовать *args и **kwargs в python? В видео про декораторы мы использовали *args и **kwargs для того, чтобы передать в функцию любое количество позиционных и именованных аргументов. Для того, чтобы понять как это работает, сначала познакомимся с тем, что такое распаковка. 📲 Мы в MAX 👉@BookPython

Если вы хотите игнорировать какое-то исключение, вы, вероятно, сделаете что-то вроде этого:

try:
    lst = [1, 2, 3, 4, 5]
    print(lst[10])
except IndexError:
    pass
Это будет работать (ничего не выводя), но contextlib позволяет сделать то же самое более выразительно и семантически правильно:

from contextlib import suppress
with suppress(IndexError):
    lst = [1, 2, 3, 4, 5]
    lst[10]
📲 Мы в MAX 👉@BookPython