Python Academy
49.5K subscribers
1.08K photos
2 videos
374 links
Python Academy — один канал вместо тысячи учебников

Чат канала: @python_academy_chat

Сотрудничество: @zubar89

Канал включён в перечень РКН: https://rkn.link/TVu
加入频道
Инкремент с помощью __pos__

В Python нет операции инкремента ++ как в си-подобных языках, поэтому используется x += 1. Однако запись ++x является валидным кодом (но не x++), так как это просто два унарных оператора сложения.

При применении унарного плюса у объекта вызывается магический метод __pos__, то есть запись ++x можно понять как x.__pos__().__pos__(). Зная это, можно реализовать класс, который будет представлять число и поддерживать поведение инкремента.

Код на картинке может показаться сначала немного сложным, но лучше проследить логику и понять работу метода __pos__. Если реализовать все остальные необходимо магические методы, то может получится полноценный класс числа, но в продакшне такие приколы лучше не писать.

#магические_методы #__pos__
Дробные числа

По умолчанию числа с плавающей точкой используют память привычным образом, то есть они хранятся в двоичном виде. Это означает, что вы обычно работаете с приблизительными значениями, а не точными.

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

Поэтому для идеальных вычислений лучше использовать Fraction, который представляет и хранит число в виде рациональной дроби.

#числа #fraction
Python 3.9.0 🎉

На днях выпустили новую версию Python, в которой добавили немного нового синтаксиса и несколько новых возможностей, а также оптимизировали некоторые моменты языка.

Из интересного стоит выделить:

– Оператор объединения словарей (PEP 584
– Встроенные аннотации дженерик типов (PEP 585)
– Смягчение грамматических ограничений декораторов (PEP 614)
– Строковые методы для удаления префикса и суффикса (PEP 616)

А ещё Python 3.9 не совместим с Windows 7, так как это версия ОС официально не поддерживается.

#updates #release
SberCloud запустили довольно забавную небольшую ролевую игру, позволяющую почувствовать себя в шкуре начинающего стартапера и потренироваться в запуске и поддержке первого проекта.

В стол или в релиз? Проверь, какой из тебя стартапер: https://sc.link/x1n
Новый оператор объединения словарей

В Python есть много разных способов объединить несколько словарей. Мне, например, больше всего нравилась распаковка словарей в один новый.

Но в последнем обновлении добавили специальный оператор |, с помощью которого можно это делать ещё проще.

#словари
Смягчение грамматических ограничений декораторов

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

Изменение позволило заметно улучшить читаемость кода на PyQt5 и упростить сопровождение данного модуля.

#декораторы
​​Находим соответствия в строках

В стандартной библиотеке Python существует модуль difflib, в котором есть интересный метод get_close_matches. Он позволяет найти в списке строки, похожие на некую исходную.

Данный метод ищет "наилучшие" возможные совпадения. Первый аргумент задаёт искомую строку, второй аргумент – список, в котором выполняется поиск.

Также в метод можно передать необязательный аргумент n, который задаёт максимальное число возвращаемых совпадений.

#difflib #строки
Функция itertools.cycle

В пайтон есть классный модуль itertools для создания собственных итераторов. Функции данного модуля довольно эффективны в работе, поэтому их часто используют в реальных проектах.

Сегодня мы бы хотели показать вам функцию cycle() из itertools. Данная функция принимает на вход итерируемый объект и создает бесконечный итератор, циклически возвращающий элементы данного объекта. Фишка заключается в том, что когда элементы последовательности заканчиваются, итерация начинается вновь с первого элементы.

К примеру, функция cycle() из последовательности ['red', 'white', 'blue'] генерирует повторяющуюся бесконечную. Но важно при проходе при итерации по такому итератору предусмотреть выход из цикла (а не как у нас в первом случае с colors:). Так как это итератор, то мы можем использовать его для получения значений через функцию next(colors).

Мы также можем воспользоваться islice(), который вернет итератор по подмножеству переданного объекта.

#генераторы #itertools
​​Модуль subprocess

Всем доброго вечера, сегодня мы поговорим немного о модуле subprocess:)

Данный модуль предоставляет унифицированный интерфейс для создания дополнительных процессов с вызовом программ, а также может подключать к стандартным потокам ввода, вывода и вывода об ошибках. Модуль был добавлен в стандартную библиотеку python на замену os.system() и os.popen().

Для создания процессов в subprocess используются функции run(), call(), check_call(), check_output(), а также класс Popen.

Сегодня мы расскажем о функциях call, check_call, check_output и run, а завтра поговорим о Popen. Они используются, когда требуется запустить программу и дождаться ее выполнения.

call - вызывается для создания процесса, ожидает выполнения и возвращает код выполнения (если программа отработала корректно, вернется 0).

check_call - делает тоже самое только еще и проверяет возвращаемое значение, если код выхода указывает, что произошла ошибка, то функция выбросит исключение CalledProcessError.

check_output - использовалась, когда нужно было захватить вывод запущенного процесса. Эта функция была нужна, так как потоки ввода и вывода запущенного процесса через call привязывались именно к вводу и выводу данного процесса, поэтому вывод таким образом захватить не получится.

run - это функция пришла в python версии 3.5 на замену трем предыдущим и умеет все, что и они и немножко больше (данные три функции были оставлены для обратной совместимости). run() возвращает объект CompletedProcess, который привязан к результату.

Для захвата вывода процесса нам нужно передать capture_output=True, после чего в аргументах объекта stdout и stderr будут записаны соответствующие выводы, запущенной программы. Но по умолчанию вывод будет вывод будет в байтах, чтобы получить читабельный текст мы также передаем флаг text=True.

Иногда программа ожидает от нас ввода из стандартного потока stdin, в этом случае мы можем передать ввод через аргумент input.

Для того, чтобы породить исключение в случае получения кода возврата об ошибке мы можем передать флаг check=True.

И как бонус у этой функции есть аргумент timeout позволяющий передать время, через которое процесс должен быть принудительно завершен. В случае принудительного завершения будет выброшено исключение TimeoutExpired.

#процессы #subprocess
Нижнее подчеркивание

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

Во-первых, _ используется, когда вам нужно придумать имена для значений, которые вам не нужны – например, в циклах for.

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

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

#тонкости
Оператор pass

В ходе исполнения данного оператора ничего не происходит, поэтому он может использоваться в качестве некой заглушки в тех местах, где это синтаксически необходимо.

Например, вам надо сделать несколько функций, вы написали def'ы и названия, но сам код еще не успели, однако программу надо запустить и проверить что-то другое. Вот тут и понадобится pass.

Или в конструкции try-except, чтобы просто проигнорировать и никак не обрабатывать ошибку в программе.

#pass
Генераторы

В этом посте освежим знания про генераторы, чтобы далее разобрать такую интересную тему, как корутины.

Функции-генераторы выглядят как и обычные, но содержат выражения с ключевым словом yield для последовательного генерирования значений. В целом, генератор – это особый, более изящный случай итератора.

Вызов подобной функции вернёт не значение, а объект генератора. Далее из этого объекта можно получать значения, например, с помощью функции next или циклом for.

Если генератору больше нечего возвращать, то будет вызвано исключение StopIteration.

#генераторы
Корутины (Coroutines)

В PEP 342 были представлены корутины, которые стали некой противоположностью генераторов. Для примера напишем функцию, которая будет в бесконечном цикле подставлять значение и выводить строку.

Обратите внимание на то, как было использовано ключевое слово yield. При таком написании создаётся корутина, а не генератор, что позволяет не просто генерировать значения, но и принимать их.

Функция работает так: при отправке значения через метод send локальная переменная name принимает его, а далее значение подставляется в строку и выводится на экран.

#генераторы #корутины
Priming

В предыдущем примере была строчка кода, в которой мы отправили значение None в только что созданную корутину перед её использованием.

Такое действие называется priming корутины (на русский сложно адекватно перевести). В случае, если не выполнить эту операцию, возникнет исключение TypeError.

Priming корутины может быть выполнен либо путем передачи None (на что и намекает сообщение ошибки), либо просто вызовом функции next с передачей корутины. И эта операция должна быть выполнена обязательно ровно один раз в самом начале.

#корутины #priming
10k 🎉

На этой неделе канал достиг отметки в 10 000 подписчиков (уже почти 11к), а также вошел в топ 100 IT каналов на площадке Telemetr.

Лично благодарен каждому читателю канала – без всех вас такого не достигли бы.

Также спасибо каждому, кто пишет и даёт обратную связь.

Будем стараться дальше :)
Tornado

На удивление, Tornado – достаточно старый фреймворк. Самый первый релиз был выпущен в далёком 2009 году, и сейчас его основное внимание направлено на обеспечении надежного асинхронного программирования с высоким параллелизмом.

Tornado изначально не являлся веб-фреймворком. На самом деле это просто набор асинхронных модулей, которые используются для построения модулей веб-фреймворка. Если более конкретно, то вот эти модули:

– Корутины и другие примитивы (tornado.gen, tornado.locks, tornado.queues и т. д.)
– Сетевые модули (tornado.ioloop, tornado.iostream и т. д.)
– Асинхронные сервера и клиенты (tornado.httpserver, tornado.httpclient и т. д.)

Они были совмещены для получения финальный модулей фреймворка: tornado.web, tornado.routing, tornado.template и тому подобные.

#фреймворки #web
FastAPI

FastAPI – фреймворк, про который однозначно стоит рассказать. Честно, синтаксис мне кажется намного приятнее, чем у других фреймворков.

Интересно, что автор фреймворка глубоко изучил несколько других фреймворков, от классических, таких как Django, до более современных, таких как Sanic, а также изучил различные технологии в NestJS (веб-фреймворк Node.js, Typescript).

Фреймворк имеет важную особенность – автоматическая генерация документации: как только ваши конечные точки будут реализованы, вы сможете поиграться с API, используя соответствующий стандартам пользовательский интерфейс. Поддерживаются SwaggerUI, ReDoc и другие.

FastAPI построен на удивительной библиотеке Starlette, в результате чего производительность сравнима с Node.js, а в некоторых случаях даже Go! В целом, складывается стойкое предчувствие, что FastAPI будет мчаться вперёд как лучший асинхронный фреймворк для Python.

#фреймворки #web
Анонимные функции

Анонимные функции являются крайне полезным аспектом, которым либо пренебрегают, либо чрезмерно пользуются. Новичкам они могут показаться сложными, но это совсем не так.

В целом, структура очень простая – lambda <arguments>: <expression> . Сначала пишете ключевое слово lambda, далее аргументы, двоеточие и какое-то выражение, результат которого автоматически вернется.

Такие функции чаще всего используются, когда они больше нигде не понадобятся, то есть определять полноценную функцию нет смысла. Типичные примеры использования – map и filter.

#функции #lambda
Композиция классов

Один из способов организации взаимодействия между классами – это композиция, или же ассоциация, классов.

В этом случае один из классов (в примере выше это Salary) является полем другого (Employee). Сложного здесь, как вы видите, ничего нет.

Ассоциированные объекты зачастую могут циклически ссылаться друг на друга, что ломает стандартный механизм сборки мусора. В таком случае необходимо использовать слабые ссылки из модуля weakref, о котором поговорим позже.

#классы #ооп
Assert

Если выполнить инструкцию assert с логическим выражением, результат которого равен True, ничего не произойдет. Но если попробовать выполнить инструкцию assert с логическим выражением, которое равно False, то будет сгенерировано исключение AssertionError.

Исключения AssertionError предназначены скорее для программистов. При написании программ на этапе разработки мы должны видеть, что делаем что-то не так (к примеру, передали в функцию некорректное значение).

Не нужно, например, обрабатывать пользовательский ввод и пытаться обработать исключение AssertionError блоком try except. Если таких мест будет очень много, то это затронет и производительность программы.

#исключения #assert