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

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

Відкрити в Telegram

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

Показати більше

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

Канал Библиотека Python разработчика | Книги по питону (@bookpython) у мовному сегменті Російська є активним учасником. На даний момент спільнота об'єднує 18 228 підписників, посідаючи 7 200 місце в категорії Технології та додатки та 36 684 місце у регіоні Росія.

📊 Показники аудиторії та динаміка

З моменту свого створення невідомо, проект продемонстрував стрімке зростання, зібравши аудиторію у 18 228 підписників.

За останніми даними від 13 липня, 2026, канал демонструє стабільну активність. Хоча за останні 30 днів спостерігається зміна кількості учасників на -82, а за останні 24 години на 0, загальне охоплення залишається високим.

  • Статус верифікації: Не верифікований
  • Рівень залученості (ER): Середній показник залученості аудиторії становить 5.66%. Протягом перших 24 годин після публікації контент зазвичай збирає 2.82% реакцій від загальної кількості підписників.
  • Охоплення публікацій: В середньому кожен допис отримує 1 031 переглядів. Протягом першої доби публікація в середньому набирає 514 переглядів.
  • Реакції та взаємодія: Аудиторія активно підтримує контент: середня кількість реакцій на один пост – 5.
  • Тематичні інтереси: Контент зосереджений навколо ключових тем, таких як numbers, yield, модуль, none, декоратор.

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

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

Завдяки високій частоті оновлень (останні дані отримано 14 липня, 2026), канал підтримує актуальність та високий рівень охоплення публікацій. Аналітика показує, що аудиторія активно взаємодіє з контентом, що робить його важливою точкою впливу в категорії Технології та додатки.

18 228
Підписники
Немає даних24 години
-137 днів
-8230 день
Залучення підписників
липень '26
липень '26
+14
в 0 каналах
червень '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 каналах
Дата
Залучення підписників
Згадування
Канали
14 липня+1
13 липня+1
12 липня0
11 липня+1
10 липня+2
09 липня0
08 липня0
07 липня0
06 липня+3
05 липня0
04 липня+4
03 липня0
02 липня+1
01 липня+1
Дописи каналу
Что такое контекстный менеджер в Python? Контекстный менеджер в Python - это специальный тип объекта, который определяет методы enter() и exit() и используется с инструкцией with. Эти объекты часто применяются в операциях, которые требуют установки и освобождения ресурсов.  Частый сценарий - это работа с файлом:

with open('file.txt', 'r') as file:
    data = file.read()
Здесь контекстный менеджер гарантирует, что файл будет корректно закрыт после завершения блока with, даже если при чтении файла возникнет исключение. Вот как можно написать простой контекстный менеджер самостоятельно:

import time
 
class Timer:
    def __enter__(self):
        self.start = time.time()
 
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.end = time.time()
        print(f'Время выполнения: {self.end - self.start:.2f} секунд')
 
with Timer():
    # код, время выполнения которого нужно измерить
    time.sleep(2)
📲 Мы в MAX 👉@BookPython

2
В Python вы можете переопределить оператор квадратных скобок ([]), определив магический метод getitem. Примером может быть объект Cycle, который виртуально содержит бесконечное количество повторяющихся элементов: class Cycle: def __init__(self, lst): self._lst = lst def __getitem__(self, index): return self._lst[index % len(self._lst)] print(Cycle(['a', 'b', 'c'])[100]) # prints 'b' Необычность здесь заключается в том, что оператор [] поддерживает уникальный синтаксис. Он может использоваться не только так — [2], но и так — [2:10], или [2:10:2], или [2::2], или даже [:]. Семантика — [start:stop:step], но вы можете применять её так, как вам нужно, для ваших собственных объектов. Но что же получает getitem в качестве параметра index, если использовать этот синтаксис? Для этого существуют объекты slice. In : class Inspector: ...: def __getitem__(self, index): ...: print(index) ...: In : Inspector()[1] 1 In : Inspector()[1:2] slice(1, 2, None) In : Inspector()[1:2:3] slice(1, 2, 3) In : Inspector()[:] slice(None, None, None) Вы даже можете комбинировать синтаксис кортежей и срезов: In : Inspector()[:, 0, :] (slice(None, None, None), 0, slice(None, None, None)) Slice не делает ничего, кроме как просто хранит атрибуты start, stop и step. In : s = slice(1, 2, 3) In : s.start Out: 1 In : s.stop Out: 2 In : s.step Out: 3 📲 Мы в MAX 👉@BookPython
700
3
Вредные советы python разработчику l=[['a', 'b', 'c'], ['1', '2'], ['#']] sum(l, []) В Python можно выпрямить вложенные списк
Вредные советы python разработчику l=[['a', 'b', 'c'], ['1', '2'], ['#']] sum(l, []) В Python можно выпрямить вложенные списки с помощью... функции sum(). Вот код (выполнять, пока никто не видит): Дело в том, что sum() принимает первым аргументом итерируемый объект, а вторым — значение, с которого начинается операция. По умолчанию это 0, но если указать пустой список [], то sum() начнёт с него. Затем sum() последовательно применяет операцию сложения к элементам первого аргумента, начиная со значения второго аргумента. В случае списков это означает конкатенацию. 📲 Мы в MAX 👉@BookPython
936
4
Функция enumerate Эта встроенная функция снабжает циклы счётчиком. Возвращает генераторный объект, который имеет метод, вызываемый встроенной функцией next: на каждом проходе цикла возвращает кортеж {индекс, значение}. Цикл for проходит по этим кортежам автоматически, что позволяет распаковывать их значения с помощью присваивания кортежей почти так, как в zip. S = "stroka" example = enumerate(S) next(example) # -> (0, 's') Пример использования: shopping_list = ['яблоки', 'бананы', 'апельсины', 'хлеб'] for index, item in enumerate(shopping_list, start=1): print(f"Пункт {index}: {item}") 📲 Мы в MAX 👉@BookPython
949
5
Очередь с приоритетом — это структура данных, которая поддерживает две операции: добавление элемента и извлечение минимального из всех ранее добавленных элементов. Одной из самых распространённых реализаций очереди с приоритетом является бинарная куча. Это полное бинарное дерево со следующим свойством: ключ, хранящийся в каждом узле, меньше или равен (≤) ключам в дочерних узлах. Минимум всех элементов находится в корне такого дерева. 1 3 7 5 4 9 8 15 16 17 18 19 В бинарной куче сложность операций вставки и извлечения составляет O(log n). Обычный способ хранения полного бинарного дерева в памяти — это массив, где дочерние элементы для x[i] находятся в x[2*i+1] и x[2*i+2]. [1, 3, 7, 5, 4, 9, 8, 15, 16, 17, 18, 19] В Python нет бинарной кучи в виде класса, но предоставляется ряд функций, которые позволяют использовать список как бинарную кучу. Эти функции находятся в модуле heapq. In [1]: from heapq import * In [2]: heap = [3,2,1] In [3]: heapify(heap) In [4]: heap Out[4]: [1, 2, 3] In [5]: heappush(heap, 0) In [6]: heap Out[6]: [0, 1, 3, 2] In [7]: heappop(heap) Out[7]: 0 In [8]: heap Out[8]: [1, 2, 3] 📲 Мы в MAX 👉@BookPython
1 013
6
Если вы хотите перехватить как IndexError, так и KeyError, вы можете и должны использовать LookupError, их общего предка. Это оказалось полезным при доступе к сложным вложенным данным. try: db_host = config['databases'][0]['hosts'][0] except LookupError: db_host = 'localhost' 📲 Мы в MAX 👉@BookPython
1 109
7
>>> exit Use exit() or Ctrl-D (i.e. EOF) to exit Вы когда-нибудь задумывались, почему при попытке выйти из интерактивного Python с помощью простого exit или quit появляется это сообщение? Решение довольно неожиданное, но изящное. Это не специальный случай для интерактивной оболочки, она просто показывает представление каждого вычисленного результата, а эта строка - просто представление функции exit. Строго говоря, вы не должны использовать exit в своих повседневных проектах, поскольку она была создана специально для интерактивной оболочки. Вместо этого используйте sys.exit(). 📲 Мы в MAX 👉@BookPython
1 180
8
Что такое «сырые» строки (Raw Strings) в Python? В Python "сырые" строки (или raw strings) — это строки, в которых символы об
Что такое «сырые» строки (Raw Strings) в Python? В Python "сырые" строки (или raw strings) — это строки, в которых символы обратного слэша \ воспринимаются буквально, а не как специальные символы (например, \n для новой строки, \t для табуляции и т. д.). Они обозначаются префиксом r перед строкой, например: r"строка". Сырые строки удобны, когда вам нужно использовать много обратных слэшей, например, в путях к файлам или регулярных выражениях, где \ часто встречается. Сырые строки упрощают код и помогают избежать ошибок, связанных с экранированием символов. Пример использования # Обычная строка print("C:\\new_folder\\file.txt") # Выводит: C:\new_folder\file.txt # Сырая строка print(r"C:\new_folder\file.txt") # Выводит: C:\new_folder\file.txt В первом случае \\ используется для экранирования, чтобы Python не воспринял \n как символ новой строки. В случае сырой строки r"...", экранирование не нужно, так как \ воспринимается буквально. 📲 Мы в MAX 👉@BookPython
1 145
9
Сравнение производительности dict() и {} в Python Какое-то время назад, во время разбора кода, мы обсудили выбор dict() вмест
Сравнение производительности dict() и {} в Python Какое-то время назад, во время разбора кода, мы обсудили выбор dict() вместо {} в новом коде на Python. Коллега утверждал, что dict() более читаем и чётче выражает предназначение кода, поэтому следует предпочесть его. Меня это не убедило, но в тот момент контраргументов не нашлось, поэтому я воздержался. Это заставило меня задуматься: в чём разница между типом dict и литеральным выражением {}? https://habr.com/ru/articles/788440/ original https://madebyme.today/blog/python-dict-vs-curly-brackets/ 📲 Мы в MAX 👉@BookPython
1 052
10
🚀 Подборка полезных 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 Типичный Сисадмин Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхак Английский с нуля 🇬🇧 https://max.ru/UchuEnglish 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика 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 Обучающие видео, книги по Физике и Математике Вакансии 📌 https://max.ru/progjob Вакансии в IT Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Бонус 📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы https://max.ru/piterspb Питер Новости: Санкт-Петербург / СПБ / ДТП
906
11
Когда вы пишете собственный метод __repr__ для какого-то объекта, обычно нужно включать представление его атрибутов. Для этого при форматировании следует вызывать repr() для объектов, так как по умолчанию вызывается str(). Это делается с помощью нотации !r: class Pair: def __init__(self, left, right): self.left = left self.right = right def __repr__(self): class_name = type(self).__name__ return f'{class_name}({self.left!r}, {self.right!r})' 📲 Мы в MAX 👉@BookPython
1 030
12
Модуль functools для манипуляций с функциями Модуль functools в Python предоставляет инструменты для работы с функциями, позволяя выполнять различные манипуляции с ними. Вот некоторые из наиболее важных функций и возможностей, которые предоставляет functools: 1. functools.partial: Позволяет зафиксировать некоторые аргументы функции и создать новую функцию с предопределенными значениями. from functools import partial def multiply(x, y): return x * y double = partial(multiply, 2) print(double(5)) # Вывод: 10 2. functools.reduce: Применяет функцию к паре элементов в последовательности, сокращая ее до одного значения. Обычно используется для аккумуляции значений. from functools import reduce numbers = [1, 2, 3, 4] product = reduce(lambda x, y: x * y, numbers) print(product) # Вывод: 24 3. functools.lru_cache: Кэширует результаты вызовов функции, чтобы ускорить повторные вызовы с теми же аргументами. Полезно для функций с дорогими вычислениями. from functools import lru_cache @lru_cache(maxsize=None) def fibonacci(n): if n < 2: return n return fibonacci(n - 1) + fibonacci(n - 2) print(fibonacci(10)) # Вывод: 55 4. functools.wraps: Декоратор, который сохраняет метаданные оригинальной функции (такие как имя и документация) при создании декоратора. from functools import wraps def my_decorator(func): @wraps(func) def wrapper(*args, **kwargs): print("Что-то делаем перед вызовом функции") return func(*args, **kwargs) return wrapper @my_decorator def say_hello(): """Выводит приветствие.""" print("Привет!") print(say_hello.__name__) # Вывод: say_hello print(say_hello.__doc__) # Вывод: Выводит приветствие. 5. functools.total_ordering: Упрощает реализацию всех методов сравнения для класса, определяя только несколько из них. from functools import total_ordering @total_ordering class Point: def __init__(self, x, y): self.x = x self.y = y def __eq__(self, other): return (self.x, self.y) == (other.x, other.y) def __lt__(self, other): return (self.x, self.y) < (other.x, other.y) p1 = Point(1, 2) p2 = Point(3, 4) print(p1 < p2) # Вывод: True print(p1 <= p2) # Вывод: True Эти функции и декораторы делают functools мощным инструментом для функционального программирования в Python. 📲 Мы в MAX 👉@BookPython
925
13
Генератор можно остановить. Ты можешь явно вызвать g.close(), но обычно это делает сборщик мусора. Когда вызывается close, в точке, где выполнение генератора было приостановлено, выбрасывается исключение GeneratorExit: def gen(): try: yield 1 yield 2 finally: print('END') g = gen() print(next(g)) # выведет '1' g.close() # выведет 'END' Обрати внимание на три момента: 1. Нельзя использовать yield при обработке GeneratorExit Если в блоке finally попытаться сделать yield, возникнет ошибка RuntimeError: def gen(): try: yield 1 finally: yield 3 # ошибка! g = gen() next(g) g.close() # RuntimeError 2. Исключение не выбрасывается, если генератор ещё не запускался В этом случае генератор просто переходит в состояние остановлен, но finally не выполняется: def gen(): try: yield 1 finally: print('END') g = gen() g.close() # ничего не выводит print(list(g)) # выведет '[]' 3. close() ничего не делает, если генератор уже завершён Если генератор полностью отработал, close() не вызывает finally повторно и просто игнорируется: def gen(): try: yield 1 yield 2 finally: print('END') g = gen() print(list(g)) # ['1', '2'] print('Closing now') g.close() # Вывод: # END # [1, 2] # Closing now 📲 Мы в MAX 👉@BookPython
930
14
Стандартный модуль json имеет интерфейс командной строки, который может быть полезен для форматирования JSON с помощью одного только Python. Этот модуль называется json.tool и используется следующим образом: $ echo '{"a": [], "b": "c"}' | python -m json.tool { "a": [], "b": "c" } 📲 Мы в MAX 👉@BookPython
1 007
15
Все объекты в Python создаются с помощью вызова метода __new__. Даже если вы определяете свой собственный __new__ для класса, вы должны вызвать super().__new__(...). Можно подумать, что object.__new__ — это базовая реализация, отвечающая за создание всех объектов. Но это не совсем так. Существует несколько таких реализаций, и они несовместимы. Например, у dict есть собственная низкоуровневая реализация __new__, и объекты типов, унаследованных от dict, нельзя создать с помощью object.__new__: In : class D(dict): ...: pass ...: In : class A: ...: pass ...: In : object.__new__(A) Out: <__main__.A at 0x7f200c8902e8> In : object.__new__(D) ... TypeError: object.__new__(D) is not safe, use D.__new__() 📲 Мы в MAX 👉@BookPython
1 057
16
🚀 Подборка полезных 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 Типичный Сисадмин Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхак Английский с нуля 🇬🇧 https://max.ru/UchuEnglish 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика 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 Обучающие видео, книги по Физике и Математике Вакансии 📌 https://max.ru/progjob Вакансии в IT Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Бонус 📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы https://max.ru/piterspb Питер Новости: Санкт-Петербург / СПБ / ДТП
905
17
Python позволяет перегружать многие разные операторы, и оператор сдвига — один из них. Вот пример того, как можно создать композицию функций с использованием этого оператора. Здесь символы, похожие на стрелки, показывают направление потока данных: from collections import deque from math import sqrt class Compose: def __init__(self): self._functions = deque() def __call__(self, *args, **kwargs): result = None for f in self._functions: result = f(*args, **kwargs) args = [result] kwargs = dict() return result def __rshift__(self, f): self._functions.append(f) return self def __lshift__(self, f): self._functions.appendleft(f) return self compose = Compose sqrt_abs = (compose() << sqrt << abs) sqrt_abs2 = (compose() >> abs >> sqrt) print(sqrt_abs(-4)) # 2.0 print(sqrt_abs2(-4)) # 2.0 Объяснение: << — добавляет функцию в начало цепочки (выполняется первой). >> — добавляет функцию в конец цепочки (выполняется последней). В примере sqrt_abs(-4) сначала берёт abs(-4) → 4, а затем sqrt(4) → 2.0. sqrt_abs2(-4) делает то же самое, но функции добавлены в другом порядке. 📲 Мы в MAX 👉@BookPython
1 033
18
Класс объекта доступен через атрибут __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 📲 Мы в MAX 👉@BookPython
1 041
19
В Python числа с плавающей точкой могут иметь значение NaN. Его можно получить с помощью math.nan. NaN не равен ничему, включая самого себя: >>> math.nan == math.nan False Кроме того, объект NaN не является уникальным — можно получить несколько разных объектов NaN из разных источников: >>> float('nan') nan >>> float('nan') is float('nan') False Это означает, что обычно нельзя использовать NaN в качестве ключа словаря: >>> d = {} >>> d[float('nan')] = 1 >>> d[float('nan')] = 2 >>> d {nan: 1, nan: 2} 📲 Мы в MAX 👉@BookPython
1 046
20
В Python None равен None, поэтому может показаться, что проверку на None можно делать через ==: ES_TAILS = ('s', 'x', 'z', 'ch', 'sh') def make_plural(word, exceptions=None): if exceptions == None: # ← ← ← exceptions = {} if word in exceptions: return exceptions[word] elif any(word.endswith(t) for t in ES_TAILS): return word + 'es' elif word.endswith('y'): return word[0:-1] + 'ies' else: return word + 's' exceptions = dict( mouse='mice', ) print(make_plural('python')) print(make_plural('bash')) print(make_plural('ruby')) print(make_plural('mouse', exceptions=exceptions)) Однако так делать неправильно. Действительно, None равен None, но не только он может быть равен None. Пользовательские объекты тоже могут вернуть True при сравнении с None через ==: class A: def __eq__(self, other): return True print(A() == None) # True print(A() is None) # False Правильный способ проверки на None — использовать is None. 📲 Мы в MAX 👉@BookPython
1 132