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

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

Открыть в Telegram

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

Больше

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

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

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

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

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

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

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

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

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

18 128
Подписчики
-624 часа
-317 дней
-7130 день
Привлечение подписчиков
август '26
август '26
+28
в 0 каналах
июль '26
+35
в 0 каналах
Get PRO
июнь '26
+23
в 0 каналах
Get PRO
май '26
+40
в 0 каналах
Get PRO
апрель '26
+26
в 0 каналах
Get PRO
март '26
+31
в 0 каналах
Get PRO
февраль '26
+62
в 0 каналах
Get PRO
январь '26
+69
в 0 каналах
Get PRO
декабрь '25
+67
в 0 каналах
Get PRO
ноябрь '25
+97
в 31 каналах
Get PRO
октябрь '25
+64
в 1 каналах
Get PRO
сентябрь '25
+90
в 36 каналах
Get PRO
август '25
+60
в 0 каналах
Get PRO
июль '25
+89
в 27 каналах
Get PRO
июнь '25
+116
в 19 каналах
Get PRO
май '25
+119
в 44 каналах
Get PRO
апрель '25
+164
в 37 каналах
Get PRO
март '25
+147
в 38 каналах
Get PRO
февраль '25
+178
в 31 каналах
Get PRO
январь '25
+176
в 33 каналах
Get PRO
декабрь '24
+158
в 34 каналах
Get PRO
ноябрь '24
+112
в 33 каналах
Get PRO
октябрь '24
+139
в 29 каналах
Get PRO
сентябрь '24
+190
в 29 каналах
Get PRO
август '24
+68
в 17 каналах
Get PRO
июль '24
+56
в 0 каналах
Get PRO
июнь '24
+95
в 23 каналах
Get PRO
май '24
+223
в 18 каналах
Get PRO
апрель '24
+174
в 0 каналах
Get PRO
март '24
+240
в 20 каналах
Get PRO
февраль '24
+224
в 18 каналах
Get PRO
январь '24
+287
в 23 каналах
Get PRO
декабрь '23
+253
в 24 каналах
Get PRO
ноябрь '23
+282
в 16 каналах
Get PRO
октябрь '23
+319
в 18 каналах
Get PRO
сентябрь '23
+342
в 0 каналах
Get PRO
август '23
+264
в 0 каналах
Get PRO
июль '23
+292
в 0 каналах
Get PRO
июнь '23
+211
в 0 каналах
Get PRO
май '23
+284
в 0 каналах
Get PRO
апрель '23
+240
в 0 каналах
Get PRO
март '23
+419
в 0 каналах
Get PRO
февраль '23
+147
в 0 каналах
Get PRO
январь '23
+247
в 0 каналах
Get PRO
декабрь '22
+191
в 0 каналах
Get PRO
ноябрь '22
+174
в 0 каналах
Get PRO
октябрь '22
+283
в 0 каналах
Get PRO
сентябрь '22
+268
в 0 каналах
Get PRO
август '22
+287
в 0 каналах
Get PRO
июль '22
+322
в 0 каналах
Get PRO
июнь '22
+233
в 0 каналах
Get PRO
май '22
+258
в 0 каналах
Get PRO
апрель '22
+252
в 0 каналах
Get PRO
март '22
+380
в 0 каналах
Get PRO
февраль '22
+207
в 0 каналах
Get PRO
январь '22
+315
в 0 каналах
Get PRO
декабрь '21
+211
в 0 каналах
Get PRO
ноябрь '21
+269
в 0 каналах
Get PRO
октябрь '21
+326
в 0 каналах
Get PRO
сентябрь '21
+286
в 0 каналах
Get PRO
август '21
+486
в 0 каналах
Get PRO
июль '21
+420
в 0 каналах
Get PRO
июнь '21
+368
в 0 каналах
Get PRO
май '21
+350
в 0 каналах
Get PRO
апрель '21
+387
в 0 каналах
Get PRO
март '21
+568
в 0 каналах
Get PRO
февраль '21
+572
в 0 каналах
Get PRO
январь '21
+777
в 0 каналах
Get PRO
декабрь '20
+18 545
в 0 каналах
Дата
Привлечение подписчиков
Упоминания
Каналы
26 августа+1
25 августа+2
24 августа0
23 августа+1
22 августа0
21 августа0
20 августа0
19 августа+3
18 августа0
17 августа+1
16 августа+1
15 августа0
14 августа0
13 августа0
12 августа0
11 августа+5
10 августа+1
09 августа+1
08 августа+1
07 августа0
06 августа+4
05 августа+2
04 августа+4
03 августа0
02 августа0
01 августа+1
Посты канала
Модуль io предоставляет два типа файловых объектов в памяти. Такие объекты могут быть полезны для работы с интерфейсами, которые поддерживают только файлы, без необходимости создавать их на диске. Очевидный пример — модульное тестирование. Эти два типа — BytesIO и StringIO, которые работают соответственно с байтами и строками.

from io import StringIO

f = StringIO()
f.write('first\n')  # Вывод: 6
f.write('second\n') # Вывод: 7
f.seek(0)           # Вывод: 0
print(f.readline()) # Вывод: 'first\n'
print(f.readline()) # Вывод: 'second\n'
📲 Мы в MAX 👉@BookPython

2
🔍Тестовое собеседование на Middle Python с разработчиком из Яндекса завтра вечером Уже завтра вечером в 19:00 по мск приходи
🔍Тестовое собеседование на Middle Python с разработчиком из Яндекса завтра вечером Уже завтра вечером в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Python-разработчика. Как это будет: 📂 Хачатур, старший разработчик в Яндексе, будет задавать реальные вопросы и задачи разработчику-добровольцу 📂 Хачатур будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью 📂 В конце можно будет задать любой вопрос Хачатуру Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Python-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы. Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_py_bot Реклама. О рекламодателе.
649
3
Если вам нужно итерироваться по нескольким итерируемым объектам одновременно, функция zip может быть хорошим выбором. Она возвращает генератор, который выдаёт кортежи, содержащие по одному элементу из каждого исходного итерируемого объекта: In : eng = ['one', 'two', 'three'] In : ger = ['eins', 'zwei', 'drei'] In : for e, g in zip(eng, ger): ...: print('{e} = {g}'.format(e=e, g=g)) ...: one = eins two = zwei three = drei Обратите внимание, что zip принимает итерируемые объекты как отдельные аргументы, а не список аргументов. Для распаковки значений можно использовать оператор *: In : list(zip(*zip(eng, ger))) Out: [('one', 'two', 'three'), ('eins', 'zwei', 'drei')] 📲 Мы в MAX 👉@BookPython
588
4
list позволяет хранить массив из любых объектов. Это довольно удобно, но может быть неэффективно. Для компактного представления массивов базовых значений можно использовать модуль array. Поддерживаемые значения включают различные типы C, такие как char, int, long, double и другие. Фактическое представление определяется реализацией C. import array a = array.array('B') # Создаем массив байтов a.append(240) a.append(159) a.append(144) a.append(180) print(a.tobytes().decode('utf8')) # Выводит: '🐴' 📲 Мы в MAX 👉@BookPython
675
5
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин https://max.ru/channel_win_sysadmin Системный Администратор Windows https://max.ru/channel_linux_admin Linux: Системный администратор https://max.ru/channel_linuxmod Linux https://max.ru/channel_i_linux Системный администратор https://max.ru/channel_devopslib DevOps, SRE, Sysadmin https://max.ru/channel_devops_star DevOps Star (Звезда Девопса) Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхак Английский с нуля 🇬🇧 https://max.ru/UchuEnglish 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С https://max.ru/channel_DevLab1C 1С:Предприятие 8 Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика https://max.ru/channel_cpp_geek C++ geek Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Rust📌 https://max.ru/channel_rust_lib Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика https://max.ru/channel_java_geek Java Geek GitHub Сообщество 📌 https://max.ru/githublib Интересное из GitHub Базы данных (Data Base) 📌 https://max.ru/database_info Все про базы данных Фронтенд разработка 📌 https://max.ru/frontend_1 Подборки для frontend разработчиков Библиотеки 📌 https://max.ru/programmist_of Книги по программированию https://max.ru/proglb Библиотека программиста https://max.ru/bfbook Книги для программистов Программирование 📌 https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 Шутки программистов 📌 https://max.ru/itumor Шутки программистов Защита, взлом, безопасность 📌 https://max.ru/thehaking Канал о кибербезопасности https://max.ru/xakkep_1 Хакер Free Книги, статьи для дизайнеров 📌 https://max.ru/odesigners Статьи, книги для дизайнеров Математика 📌 https://max.ru/Pomatematike Канал по математике https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике Вакансии в IT📌 https://max.ru/progjob https://max.ru/channel_rabotait Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Городские📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы https://max.ru/piterspb Питер Новости: Санкт-Петербург / СПБ / ДТП https://max.ru/channel_krasnodar_novosty Краснодар Новости https://max.ru/channel_novosibirsk_novosti Новосибирск https://max.ru/channel_samara_novosti Новости Самары https://max.ru/channel_ekaterinburg_novosti Новости Екатеринбурга https://max.ru/channel_kazan_novosti Новости Казани https://max.ru/channel_omsk_novosti Новости Омска https://max.ru/channel_moskva_24 Москва 24
549
6
Когда в Python используется переменная, сначала она ищется в текущей области видимости. Если такая переменная не найдена, поиск продолжается во вложенной области. Это повторяется до тех пор, пока не будет достигнуто глобальное пространство имен. x = 1 def scope(): x = 2 def inner_scope(): print(x) # выводит 2 inner_scope() scope() Однако присваивание переменной работает иначе. Новая переменная всегда создается в текущей области видимости, если не указано global или nonlocal: x = 1 def scope(): x = 2 def inner_scope(): x = 3 print(x) # выводит 3 inner_scope() print(x) # выводит 2 scope() print(x) # выводит 1 global позволяет использовать переменные из глобального пространства имен, а nonlocal ищет переменную в ближайшей окружающей области видимости. Сравните: x = 1 def scope(): x = 2 def inner_scope(): global x x = 3 print(x) # выводит 3 inner_scope() print(x) # выводит 2 scope() print(x) # выводит 3 x = 1 def scope(): x = 2 def inner_scope(): nonlocal x x = 3 print(x) # выводит 3 inner_scope() print(x) # выводит 3 scope() print(x) # выводит 1 📲 Мы в MAX 👉@BookPython
685
7
Создание новой переменной в Python фактически означает создание нового имени для уже существующего объекта. Именно поэтому этот процесс называется связыванием имени (name binding). Существует множество способов связать имя с объектом. Вот примеры того, как можно связать x: x = y # Присваивание import x # Импорт модуля class x: pass # Определение класса def x(): pass # Определение функции def y(x): pass # Определение аргумента функции for x in y: pass # Перебор элементов в цикле with y as x: pass # Использование в конструкции with except y as x: pass # Обработка исключения Также можно привязать имя к объекту, манипулируя глобальным пространством имен: In : x NameError: name 'x' is not defined # Ошибка: переменная x не определена In : globals()['x'] = 42 # Присваивание через globals() In : x Out: 42 # Теперь x привязан к 42 Однако нельзя сделать то же самое с locals(), так как изменения словаря locals() игнорируются. 📲 Мы в MAX 👉@BookPython
834
8
«Reduce» — это функция высшего порядка, которая рекурсивно обрабатывает итерируемый объект, применяя некоторую операцию к следующему элементу и уже вычисленному значению. Также вы можете знать её под названиями «fold», «inject», «accumulate» или другими. Использование reduce с result = result + element даёт сумму всех элементов, result = min(result, element) возвращает минимум, а result = element позволяет получить последний элемент последовательности. В Python функция reduce доступна (начиная с Python 3, она была перемещена в functools.reduce): from functools import reduce print(reduce(lambda s, i: s + i, range(10))) # 45 print(reduce(lambda s, i: min(s, i), range(10))) # 0 print(reduce(lambda s, i: i, range(10))) # 9 Также, если вам нужны простые лямбда-функции, такие как lambda a, b: a + b, в Python есть модуль operator, который упрощает их использование: from operator import add print(reduce(add, range(10))) # 45 📲 Мы в MAX 👉@BookPython
887
9
CPython поддерживает два уровня оптимизации. Вы можете включить их с помощью флагов -O и -OO. - Флаг -O устанавливает __debug__ в значение False и удаляет все операторы assert из программы. - Флаг -OO делает то же самое, а также удаляет строки документации (docstrings). Обычная версия скрипта кэшируется в файл .pyc, а оптимизированная версия раньше кэшировалась в файл .pyo. Однако, начиная с Python 3.5, файлы .pyo больше не используются. Вместо них, в соответствии с PEP 488, вводятся файлы .opt-1.pyc и .opt-2.pyc. 📲 Мы в MAX 👉@BookPython
917
10
Иногда вам может понадобиться проверить синтаксис Python-файла без его запуска. Такая простая проверка может быть полезна, например, в качестве хука перед коммитом или быстрой проверки в рамках непрерывной интеграции (CI). Прямого способа сделать это нет. Вы можете запустить файл с помощью команды python -m module.py, что предотвратит выполнение блока if __name__ == '__main__'. Однако все импорты всё равно будут выполнены, и это может привести к ошибкам, если вы хотите проверить синтаксис в среде, где модуль не может и не должен быть запущен. Тем не менее, стандартная библиотека Python содержит модуль py_compile, который генерирует байт-код из исходного файла Python без его выполнения. Это именно то, что нам нужно: $ python -m py_compile test.c File "test.c", line 1 int main() { ^ SyntaxError: invalid syntax 📲 Мы в MAX 👉@BookPython
1 121
11
Иногда вам нужно очистить коллекцию в Python. Вы, вероятно, используете что-то вроде d = {} (для словарей), но на самом деле это не очистка, а создание новой коллекции и выбрасывание старой. Это может сработать для вас, но другие владельцы того же объекта всё ещё будут иметь ссылку на оригинальный. Правильный способ очистки словаря, множества, deque и других коллекций — вызвать x.clear(). 📲 Мы в MAX 👉@BookPython
1 184
12
Профайлинг и Оптимизация Производительности Когда ваш код уже не просто работает, а должен летать, на первый план выходит умение профилировать и оптимизировать производительность. Для Python это не просто трюки, а глубокое понимание CPython и его инструментов. Шаг 1: Точное Измерение (Profiling) Прежде чем оптимизировать, мы должны знать, где именно тратятся ресурсы. Слепое улучшение кода — это путь к бессмысленным изменениям и появлению новых багов. - Модуль cProfile: Стандартный и самый надежный инструмент для нахождения горячих точек (hotspots) — функций, где тратится больше всего времени. Он показывает совокупное время (tottime) и общее время (cumtime) выполнения каждой функции, включая вызовы извне. import cProfile import re cProfile.run('re.compile("foo|bar")', filename='profile_data') # Анализируем результаты import pstats p = pstats.Stats('profile_data') p.sort_stats('cumulative').print_stats(10) - Line-by-line Profilers (line_profiler): Если cProfile показывает функцию, которая "тормозит", но вам нужно понять, какая именно строка внутри этой функции виновата, используйте внешние инструменты, такие как line_profiler. # Декоратор @profile над нужной функцией # Запуск: kernprof -l my_script.py # Анализ: python -m line_profiler my_script.py.lprof - Анализ Памяти (memory_profiler): Для задач, связанных с большими данными или длительными процессами, где утечки памяти или излишнее потребление критичны, используйте memory_profiler или pympler. Шаг 2: Реальная Оптимизация (Beyond Simple Fixes) Найдя узкое место, приступаем к устранению, используя знания об устройстве Python. 1. Уменьшение Накладных Расходов Интерпретатора (Interpreter Overhead) - Использование Встроенных Функций и Модулей C: Встроенные функции (например, sum, map, sorted) и функции из стандартной библиотеки, написанные на C (например, itertools, collections), работают значительно быстрее, чем их эквиваленты на чистом Python, поскольку избегают накладных расходов на GIL и байткод. - Пример: Используйте collections.deque вместо list для быстрого добавления/удаления с обоих концов. 2. Манипуляции с Данными NumPy/Pandas - Векторизация: Если вы работаете с числовыми данными, полностью переходите на NumPy и Pandas. Вместо циклов for в Python, обрабатывающих элементы по одному, используйте векторизованные операции. Это позволяет выполнять вычисления на уровне C/Fortran, эффективно используя процессор. 3. Параллелизм vs. Конкурентность - CPU-bound задачи (расчеты): Из-за GIL (Global Interpreter Lock) чистый Python не может эффективно использовать несколько ядер ЦП для одновременного выполнения кода на Python. Используйте модуль multiprocessing для распараллеливания задачи между процессами. - I/O-bound задачи (сеть, диск): Если код проводит много времени в ожидании (ввод-вывод), используйте конкурентность с помощью asyncio (асинхронный ввод-вывод) или threading. В этом случае GIL не мешает, так как Python "освобождает" его во время ожидания. 📲 Мы в MAX 👉@BookPython
1 150
13
Профайлинг и Оптимизация Производительности Когда ваш код уже не просто работает, а должен летать, на первый план выходит умение профилировать и оптимизировать производительность. Для Python это не просто трюки, а глубокое понимание CPython и его инструментов. Шаг 1: Точное Измерение (Profiling) Прежде чем оптимизировать, мы должны знать, где именно тратятся ресурсы. Слепое улучшение кода — это путь к бессмысленным изменениям и появлению новых багов. - Модуль cProfile: Стандартный и самый надежный инструмент для нахождения горячих точек (hotspots) — функций, где тратится больше всего времени. Он показывает совокупное время (tottime) и общее время (cumtime) выполнения каждой функции, включая вызовы извне. import cProfile import re cProfile.run('re.compile("foo|bar")', filename='profile_data') # Анализируем результаты import pstats p = pstats.Stats('profile_data') p.sort_stats('cumulative').print_stats(10) - Line-by-line Profilers (line_profiler): Если cProfile показывает функцию, которая "тормозит", но вам нужно понять, какая именно строка внутри этой функции виновата, используйте внешние инструменты, такие как line_profiler. # Декоратор @profile над нужной функцией # Запуск: kernprof -l my_script.py # Анализ: python -m line_profiler my_script.py.lprof - Анализ Памяти (memory_profiler): Для задач, связанных с большими данными или длительными процессами, где утечки памяти или излишнее потребление критичны, используйте memory_profiler или pympler. Шаг 2: Реальная Оптимизация (Beyond Simple Fixes) Найдя узкое место, приступаем к устранению, используя знания об устройстве Python. 1. Уменьшение Накладных Расходов Интерпретатора (Interpreter Overhead) - Использование Встроенных Функций и Модулей C: Встроенные функции (например, sum, map, sorted) и функции из стандартной библиотеки, написанные на C (например, itertools, collections), работают значительно быстрее, чем их эквиваленты на чистом Python, поскольку избегают накладных расходов на GIL и байткод. - Пример: Используйте collections.deque вместо list для быстрого добавления/удаления с обоих концов. 2. Манипуляции с Данными NumPy/Pandas - Векторизация: Если вы работаете с числовыми данными, полностью переходите на NumPy и Pandas. Вместо циклов for в Python, обрабатывающих элементы по одному, используйте векторизованные операции. Это позволяет выполнять вычисления на уровне C/Fortran, эффективно используя процессор. 3. Параллелизм vs. Конкурентность - CPU-bound задачи (расчеты): Из-за GIL (Global Interpreter Lock) чистый Python не может эффективно использовать несколько ядер ЦП для одновременного выполнения кода на Python. Используйте модуль multiprocessing для распараллеливания задачи между процессами. - I/O-bound задачи (сеть, диск): Если код проводит много времени в ожидании (ввод-вывод), используйте конкурентность с помощью asyncio (асинхронный ввод-вывод) или threading. В этом случае GIL не мешает, так как Python "освобождает" его во время ожидания. 📲 Мы в MAX 👉@BookPython
1
14
One Day Offer для Python-разработчиков!💚 15 августа открываем двери в команду Agent Execution Framework ⚡️ Коллеги создают п
One Day Offer для Python-разработчиков!💚 15 августа открываем двери в команду Agent Execution Framework ⚡️ Коллеги создают платформу для GenAI‑агентов в банке — делают так, чтобы ИИ реально работал в серьёзных финпроцессах: с безопасностью, нагрузкой и пользой. Чем предстоит заниматься: ✔️ развивать backend на Python ✔️ подключать LLM, инструменты, базы знаний и RAG ✔️ строить пайплайны оценки качества агентов ✔️ участвовать в архитектуре и ревью кода Встречаемся 15 августа онлайн. Регистрируйся по ссылке
908
15
С версии Python 3.0 выбрасывание исключения внутри блока except автоматически добавляет перехваченное исключение в атрибут __context__ нового исключения. Это приводит к тому, что оба исключения отображаются в traceback: try: 1 / 0 except ZeroDivisionError: raise ValueError('Zero!') Результат выполнения: Traceback (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! Вы также можете добавить __cause__ к любому исключению с помощью выражения raise ... from: division_error = None try: 1 / 0 except ZeroDivisionError as e: division_error = e raise ValueError('Zero!') from division_error Результат выполнения: Traceback (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! 📲 Мы в MAX 👉@BookPython
974
16
Прямой доступ к атрибутам объекта может быть не самой лучшей идеей. Если клиенты взаимодействуют с объектом через методы, вы всегда можете изменить способ обработки каждого запроса, в то время как при прямом доступе к атрибутам это может быть невозможно. Разные языки решают эту проблему по-разному. В Ruby синтаксически невозможно получить прямой доступ к атрибуту: obj.x — это вызов метода x. В Java рекомендуется делать все атрибуты приватными и писать тривиальные геттеры, например: public int getX() { return this.x; }. Python предлагает решение, которое в некотором роде похоже на то, что есть в Ruby. Вы можете определить свойство (property), чтобы obj.x вызывал метод вместо прямого возврата атрибута x. class Example: def __init__(self, x): self._x = x @property def x(self): return self._x 📲 Мы в MAX 👉@BookPython
916
17
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин https://max.ru/channel_win_sysadmin Системный Администратор Windows https://max.ru/channel_linux_admin Linux: Системный администратор https://max.ru/channel_linuxmod Linux https://max.ru/channel_i_linux Системный администратор https://max.ru/channel_devopslib DevOps, SRE, Sysadmin https://max.ru/channel_devops_star DevOps Star (Звезда Девопса) Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхак Английский с нуля 🇬🇧 https://max.ru/UchuEnglish 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С https://max.ru/channel_DevLab1C 1С:Предприятие 8 Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика https://max.ru/channel_cpp_geek C++ geek Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Rust📌 https://max.ru/channel_rust_lib Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика https://max.ru/channel_java_geek Java Geek GitHub Сообщество 📌 https://max.ru/githublib Интересное из GitHub Базы данных (Data Base) 📌 https://max.ru/database_info Все про базы данных Фронтенд разработка 📌 https://max.ru/frontend_1 Подборки для frontend разработчиков Библиотеки 📌 https://max.ru/programmist_of Книги по программированию https://max.ru/proglb Библиотека программиста https://max.ru/bfbook Книги для программистов Программирование 📌 https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 Шутки программистов 📌 https://max.ru/itumor Шутки программистов Защита, взлом, безопасность 📌 https://max.ru/thehaking Канал о кибербезопасности https://max.ru/xakkep_1 Хакер Free Книги, статьи для дизайнеров 📌 https://max.ru/odesigners Статьи, книги для дизайнеров Математика 📌 https://max.ru/Pomatematike Канал по математике https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике Вакансии в IT📌 https://max.ru/progjob https://max.ru/channel_rabotait Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Городские📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы https://max.ru/piterspb Питер Новости: Санкт-Петербург / СПБ / ДТП https://max.ru/channel_krasnodar_novosty Краснодар Новости https://max.ru/channel_novosibirsk_novosti Новосибирск https://max.ru/channel_samara_novosti Новости Самары https://max.ru/channel_ekaterinburg_novosti Новости Екатеринбурга https://max.ru/channel_kazan_novosti Новости Казани https://max.ru/channel_omsk_novosti Новости Омска https://max.ru/channel_moskva_24 Москва 24
834
18
Рассмотрим следующую иерархию классов: class GrandParent: pass class Parent1(GrandParent): pass class Parent2(GrandParent): pass class Child(Parent1, Parent2): pass В каком порядке будет производиться поиск метода Child.x()? Наивный подход заключается в рекурсивном поиске через все родительские классы, что даст порядок: Child, Parent1, GrandParent, Parent2. Такой метод используется во многих языках программирования, однако он не совсем логичен, так как Parent2 более специфичен, чем GrandParent, и его нужно проверять раньше. Чтобы исправить эту проблему, Python использует линеаризацию C3 (C3 superclass linearization), алгоритм, который всегда ищет метод сначала во всех дочерних классах, а затем уже в родительских. Пример вывода MRO (Method Resolution Order): In : Child.__mro__ Out: (__main__.Child, __main__.Parent1, __main__.Parent2, __main__.GrandParent, object) 📲 Мы в MAX 👉@BookPython
950
19
Иногда вам нужно запустить блок кода с несколькими контекстными менеджерами. Например: 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 Однако в современных версиях Python эта функция устарела и вызывает предупреждение. Вместо неё рекомендуется использовать более продвинутый инструмент — contextlib.ExitStack. Он позволяет войти в любое количество контекстов в произвольное время, но гарантирует их корректное завершение: from contextlib import 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 ] Это особенно полезно, когда количество контекстных менеджеров неизвестно заранее. 📲 Мы в MAX 👉@BookPython
977
20
UTF-8 - это кодировка с переменной длиной. Один символ может быть закодирован с использованием одного, двух, трёх или четырёх байтов. Это означает, что нельзя начать чтение строки в кодировке UTF-8 с произвольного байта, так как это может случайно разрушить символ: In : lion = 'Löwe' In : lion.encode('utf-8')[2:] Out: b'\xb6we' In : lion.encode('utf-8')[2:].decode('utf-8') ... UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb6 in position 0: invalid start byte Также это означает, что для пропуска первых N символов строки их необходимо прочитать и декодировать. Рассчитать смещение заранее невозможно. Однако можно пропустить фиксированное количество байтов, принимая во внимание некоторые особенности. Вот как может быть закодирован символ в UTF-8: 0xxxxxxx 110xxxxx 10xxxxxx 1110xxxx 10xxxxxx 10xxxxxx 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx Как видно, байт является начальным байтом символа, если его вид не совпадает с 10xxxxxx. Такие байты называются продолжением символа (continuation bytes). Давайте пропустим их: def cut_bytes(s, n): result = s.encode('utf-8')[n:] mask = int('11000000', 2) conbyte = int('10000000', 2) while result[0] and result[0] & mask == conbyte: result = result[1:] return result.decode('utf-8') Пример использования: In : cut_bytes(lion, 2) Out: 'we' In : cut_bytes(lion, 1) Out: 'öwe' 📲 Мы в MAX 👉@BookPython
965