Дополнение про property
Важно отметить, что
Конструктор
Простыми словами, в примере
Кстати, можете посмотреть простейшую реализацию такого свойства в официальной документации.
#классы #property
Важно отметить, что
property
– это класс, реализованный через протокол дескриптора. Его методы setter
, getter
, deleter
и их использование в качестве декораторов – синтаксический сахар.Конструктор
property
принимает на вход аргументы fget
, fset
, fdel
, которые должны быть функциями. Они отвечают за получение, установку нового значения и удаление атрибута соответственно. Простыми словами, в примере
property
прикрепляет функции get_age
и set_age
к атрибуту age
. Также можно было реализовать условный delete_age
, который отвечал бы за удаление атрибута.Кстати, можете посмотреть простейшую реализацию такого свойства в официальной документации.
#классы #property
Не используйте обработку исключений слишком часто
Обработка исключений может защитить вашу программу от внезапных сбоев. Тем не менее все прекрасно знают, что подобные конструкции могут заметно снизить производительность скрипта.
Не стоит злоупотреблять
На картинке мы привели пример двух случаев необоснованного использования обработки исключений, а также показали более правильную альтернативу.
#совет #исключения
Обработка исключений может защитить вашу программу от внезапных сбоев. Тем не менее все прекрасно знают, что подобные конструкции могут заметно снизить производительность скрипта.
Не стоит злоупотреблять
try-except
конструкциями, так как в большинстве случаев можно справиться с задачей, применяя обычные условия. Используйте обработку исключений только в крайних случаях.На картинке мы привели пример двух случаев необоснованного использования обработки исключений, а также показали более правильную альтернативу.
#совет #исключения
Not a Number
В модуле
Эти объекты
Например можно создать подобный объект, просто передав строку
#nan #tips
В модуле
math
есть особый объект, который называется NaN
(Not a Number).Эти объекты
NaN
не уникальны, и даже не равны самим себе, так что вы можете иметь несколько подобных объектов, взятых из нескольких разных источников.Например можно создать подобный объект, просто передав строку
'nan'
во float
. Кстати говоря, это значит что вы можете использовать NaN
в качестве ключа в словаре (хотя мы и не советуем это делать).#nan #tips
Добавляем классу большую функциональность
Декоратор
Методы класса привязаны к самому классу, а не его экземпляру. Они могут менять состояние класса, что отразится на всех объектах этого класса, но не могут менять конкретный объект.
Проще говоря,
#oop #classmethod
Декоратор
@classmethod
— это метод, который получает класс в качестве параметра, который принято обозначать как cls
. Он указывает на класс ToyClass, а не на объект этого класса. Методы класса привязаны к самому классу, а не его экземпляру. Они могут менять состояние класса, что отразится на всех объектах этого класса, но не могут менять конкретный объект.
Проще говоря,
@classmethod
— это обычный метод класса, имеющий доступ ко всем атрибутам класса, через который он был вызван.#oop #classmethod
Создание и использование виртуальной среды
Создание новой виртуальной среды требуется только один раз для каждого проекта, для которого вы хотите изолировать зависимости:
Чтобы активировать виртуальную среду, нужно запустить
#virtualenv
virtualenv
— инструмент для создания изолированных сред Python. Программа создает папку, которая содержит все необходимые исполняемые файлы для использования пакетов, необходимых для проекта.Создание новой виртуальной среды требуется только один раз для каждого проекта, для которого вы хотите изолировать зависимости:
python3 -m venv venv
Это создаст папку venv
, содержащую оснастку сценариев и копию python самого двоичного файла. Название папки не имеет значения. Чтобы активировать виртуальную среду, нужно запустить
activate
файл: source venv/bin/activate
и далее мы можем свободно устанавливать любые зависимости, которые никак не скажутся на работе в будущих проектах.#virtualenv
Многопоточность
В модуле
Параметр
Когда
#потоки #многопоточность
В модуле
threading
новый поток выполнения может начинаться с нового threading.Thread
и присвоения ему функции для выполнения.Параметр
target
ссылается на функцию (или вызываемый объект), который будет работать. Нить не начнет выполнение до start
, также не будет вызываться Thread
объекта.Когда
my_thread
завершается, вызов start
выкинет исключение RuntimeError. Если вы хотите запустить Thread в фоновом режиме, то передавайте daemon=True
или установите my_thread.daemon
в True
перед вызовом start()
.#потоки #многопоточность
Добавляем классу большую функциональность
На прошлой неделе мы объясняли декоратор
Зачем использовать. Статические методы делают код более читабельным и повторно используемым. Его также удобнее использовать для импорта по сравнению с обычными функциями, поскольку функцию не нужно отдельно импортировать.
В чем же разница?
На прошлой неделе мы объясняли декоратор
@classmethod
, а сейчас рассмотрим @staticmethod
. @staticmethod
можно воспринимать как метод, который "не знает, к какому классу относится". Он просто получает переданные аргументы, без неявного первого аргумента, и его определение не изменяется через наследование. Еще раз: статические методы прикреплены к классу лишь для удобства — и не могут менять состояние ни класса, ни его экземпляра.Зачем использовать. Статические методы делают код более читабельным и повторно используемым. Его также удобнее использовать для импорта по сравнению с обычными функциями, поскольку функцию не нужно отдельно импортировать.
В чем же разница?
@classmethod
используется в суперклассе для определения того, как метод должен вести себя, когда он вызывается разными дочерними классами. @staticmethod
используется, когда мы хотим вернуть объект, независимо от вызываемого дочернего класса.Делегирующие генераторы
Давайте создадим простенькую генераторную функцию
А также ещё одну генераторную функцию
Цикл, который можно написать в
Грубо говоря, такая конструкция является неким туннелем передачи данных туда и обратно. В нашей ситуации
#генераторы
Давайте создадим простенькую генераторную функцию
subgen
, которая будет возвращать числа от 0 до переданного аргумента.А также ещё одну генераторную функцию
delegator
, которая будет возвращать числа из итерируемого объекта source
, который передадим в качестве аргумента.Цикл, который можно написать в
delegator
, можно заменить всего лишь одной строчкой. То есть yield from
заменяет цикл for
, в котором только возвращаются значения через yield
.Грубо говоря, такая конструкция является неким туннелем передачи данных туда и обратно. В нашей ситуации
delegator
можно назвать делигирующим генератором, а subgen
подгенератором.#генераторы
Аннотации типов
Всем известно, что Python – язык с динамической типизацией. Аннотации типов нужны для того, чтобы повысить информативность исходного кода, но они никак не влияют на поведение программы.
Типы данных указывается через двоеточие после имени переменной после её создания. Для примера создадим словарь с числами и список, состоящий из значений этого словаря, а также функцию для сложения двух чисел.
Однако помните, что аннотации типов не влияют на ход исполнения программы, поэтому в ранее написаную функцию мы с таким же успехом можем передать и строки, хотя указывали целочисленный тип данных.
#типы_данных #аннотации
Всем известно, что Python – язык с динамической типизацией. Аннотации типов нужны для того, чтобы повысить информативность исходного кода, но они никак не влияют на поведение программы.
Типы данных указывается через двоеточие после имени переменной после её создания. Для примера создадим словарь с числами и список, состоящий из значений этого словаря, а также функцию для сложения двух чисел.
Однако помните, что аннотации типов не влияют на ход исполнения программы, поэтому в ранее написаную функцию мы с таким же успехом можем передать и строки, хотя указывали целочисленный тип данных.
#типы_данных #аннотации
Паттерн проектирования Singleton
Одиночка или же синглтон – это паттерн проектирования, описывающий объект, у которого имеется один единственный экземпляр.
Метод
В примере мы проверяем, есть ли значение у атрибута
То есть при вызове конструктора класса
#классы #паттерны
Одиночка или же синглтон – это паттерн проектирования, описывающий объект, у которого имеется один единственный экземпляр.
Метод
__new__
вызывается для создания экземпляра класса, перед вызовом __init__
. На вход первым аргументом метод принимает сам класс, а возвращать должен уже экземпляр (даже можно экземпляр и другого класса).В примере мы проверяем, есть ли значение у атрибута
instance
. Если нет, то присваиваем атрибуту экземпляр этого же класса. А если уже экземпляр создан, то просто его возвращаем.То есть при вызове конструктора класса
Singleton
, будет возвращаться один и тот же объект из памяти.#классы #паттерны
Превью из длинного текста
Допустим, у нас есть какой-то длинный текст в виде строки и надо сделать превью этого текста, например, для сайта. Первое, что приходит на ум – использовать слайсинг строк.
Но, как видите, текст оборвался на полуслове, поэтому такой вариант отпадает. Такую проблему хорошо решает метод
Первым аргументом передается строка, вторым указываем количество символов, которое должен содержать результат. Также третьим аргументом можно передать заготовку, которая будет вставляться в конце обрезанной строки.
#строки #textwrap
Допустим, у нас есть какой-то длинный текст в виде строки и надо сделать превью этого текста, например, для сайта. Первое, что приходит на ум – использовать слайсинг строк.
Но, как видите, текст оборвался на полуслове, поэтому такой вариант отпадает. Такую проблему хорошо решает метод
shorten
из модуля textwrap
. Первым аргументом передается строка, вторым указываем количество символов, которое должен содержать результат. Также третьим аргументом можно передать заготовку, которая будет вставляться в конце обрезанной строки.
#строки #textwrap
Использование списков в качестве стеков
Стек – абстрактный тип данных, представляющий собой список элементов, организованных по принципу LIFO (last in – first out). В переводе с английского "последним пришёл – первым вышел".
Списки в Python имеют удобные встроенные методы, которых достаточно для реализации такой структуры данных. Для добавления элемента в конец стека используем метод
Программный вид стека применяется для обхода структур по типу графов и деревьев. При реализации рекурсивных функций также будет применяться стек, но в таком случае уже его аппаратный вид.
#списки #стек
Стек – абстрактный тип данных, представляющий собой список элементов, организованных по принципу LIFO (last in – first out). В переводе с английского "последним пришёл – первым вышел".
Списки в Python имеют удобные встроенные методы, которых достаточно для реализации такой структуры данных. Для добавления элемента в конец стека используем метод
append
, для извлечения – pop
.Программный вид стека применяется для обхода структур по типу графов и деревьев. При реализации рекурсивных функций также будет применяться стек, но в таком случае уже его аппаратный вид.
#списки #стек
Легкий веб-фреймворк
Несмотря на свою минималистичность,
После запуска подобного примера можете перейти в браузере по адресу
#фреймворки #bottle
Bottle
– это быстрый, простой и легкий микро-веб-фреймворк WSGI
для Python. Он распространяется как единый файловый модуль и не имеет никаких зависимостей, кроме стандартной библиотеки Python.Несмотря на свою минималистичность,
Bottle
предоставляет довольно широкие возможности, которых на 100% хватает для мелких и средних проектов. Вот список основных возможностей: routing, templates, POST-routing, обработка форм, cookies и сервер.После запуска подобного примера можете перейти в браузере по адресу
localhost:5000/hello/world
и посмотреть на результат, полученный из всего пяти строк кода.#фреймворки #bottle
Создание процессов
Класс
При создании экземпляра
Очень важно ожидать завершения всех созданных дочерних процессов. Для этого можно воспользоваться удобной функцией
#процессы #multiprocessing
Класс
Process
из встроенного модуля multiprocessing
позволяет создавать процессы без прямого вызова функции fork
, про которую писали раньше на канале.При создании экземпляра
Proccess
необходимо передать функцию, которую требуется исполнить в отдельном дочернем процессе и аргументы этой функции. Процесс будет создан после вызова метода start
. Внутри метода start
будет вызван fork
и будет исполнена функция в отдельном процессе.Очень важно ожидать завершения всех созданных дочерних процессов. Для этого можно воспользоваться удобной функцией
join
.#процессы #multiprocessing
Одноразовый метод в классе
В случае, если вдруг понадобится в классе функция, которая будет использоваться всего один раз, после чего будет использоваться другая функция, можно воспользоваться приемом на картинке.
Последней строчкой метода
Подобный прием будет полезен в тех случаях, когда при самом первом вызове метода в классе требуются выполнить одноразовые действия, которые в дальнейшем не нужны.
#классы #функции
В случае, если вдруг понадобится в классе функция, которая будет использоваться всего один раз, после чего будет использоваться другая функция, можно воспользоваться приемом на картинке.
Последней строчкой метода
call
является переопределение самого этого метода на другой, а именно normal_call
. Таким образом, изначальный код call
будет исполнен только один раз.Подобный прием будет полезен в тех случаях, когда при самом первом вызове метода в классе требуются выполнить одноразовые действия, которые в дальнейшем не нужны.
#классы #функции
Красивые таблицы в терминале
PrettyTable – это простая библиотека, предназначенная для быстрого и легкого представления табличных данных в виде ASCII. Модуль можно установить привычным способом через
Для создания таблиц и работы с ними используется класс
Более того, модуль
#таблицы #prettytable
PrettyTable – это простая библиотека, предназначенная для быстрого и легкого представления табличных данных в виде ASCII. Модуль можно установить привычным способом через
pip
.Для создания таблиц и работы с ними используется класс
PrettyTable
из этого модуля. Задать название для столбцов можно с помощью атрибута fields_name
. Строки в таблицу добавляются путем вызова метода add_row
.Более того, модуль
prettytable
позволяет регулировать различные параметры, сортировать данные, работать с html
, а также взаимодействовать с csv
и sql
таблицами. Так что возможностей у этого модуля предостаточно.#таблицы #prettytable
Ипотека 0,1% для IT-специалистов от Самолета
Девелопер запускает ипотечную программу для IT-специалистов. Теперь можно купить квартиру в Москве, Московской области и Санкт-Петербурге на эксклюзивных условиях от «Самолета»:
> Ставка 0,1% на весь срок
> Возраст заёмщика от 22 до 44 лет (включительно)
> Ежемесячный платёж ниже на 45%, чем при обычной ставке
> Сумма кредита до 18 млн. рублей
> Все баги с переплатами исправлены – теперь они минимальны
Подробнее
Девелопер запускает ипотечную программу для IT-специалистов. Теперь можно купить квартиру в Москве, Московской области и Санкт-Петербурге на эксклюзивных условиях от «Самолета»:
> Ставка 0,1% на весь срок
> Возраст заёмщика от 22 до 44 лет (включительно)
> Ежемесячный платёж ниже на 45%, чем при обычной ставке
> Сумма кредита до 18 млн. рублей
> Все баги с переплатами исправлены – теперь они минимальны
Подробнее
Прогресс выполнения программы
Индикаторы прогресса добавляют наглядности в скриптах, которые исполняют какие-то функции, требующие времени для выполнения. Модуль
Привычный
Кстати, интересный факт – название
#модули #tqdm
Индикаторы прогресса добавляют наглядности в скриптах, которые исполняют какие-то функции, требующие времени для выполнения. Модуль
tqdm
является простым и лаконичным вариантом.Привычный
range
можно заменить на trange
для визуализации прогресса. А для итерации по какой-либо последовательности, достаточно просто передать её в функцию tqdm
. Также модуль хорошо себя зарекомендовал и в Jupyter Notebook.Кстати, интересный факт – название
tqdm
произошло от арабского слова "taqaddum" (تقدّم), которое означает "прогресс," а также это ещё и сокращение от "я тебя сильно люблю" на испанском (te quiero demasiado).#модули #tqdm
Делаем скриншоты
Кросс-платформенный модуль
Для создания скриншота используется метод
Подобный модуль может быть полезен, например, для логирования скриптов, использующих Selenium, который может открывать браузер и производить какие-либо операции в нём.
#модули #pyscreenshot
Кросс-платформенный модуль
pyscreenshot
позволяет делать скриншоты как всего экрана, так и его части. Для его работы должна быть корректно установлена библиотека pillow
.Для создания скриншота используется метод
grab
, для его открытия – show
, для сохранения – save
. Также в grab
можно передать аргумент bbox
для захвата только определённой части экрана.Подобный модуль может быть полезен, например, для логирования скриптов, использующих Selenium, который может открывать браузер и производить какие-либо операции в нём.
#модули #pyscreenshot
Делаем HTTP запросы
Пакет
Устанавливается
Модуль идеально подходит как для работы со внешними API веб-сервисов, так и для получения HTML кода веб-страниц.
#requests
Пакет
requests
абстрагирует сложности выполнения запросов за красивым, простым API, чтобы вы могли сосредоточиться на взаимодействии с сервисами и работе с данными в ваших приложениях.Устанавливается
requests
стандартным путем через пакетный менеджер pip
. Запросы GET, POST, PUT и DELETE делаются интуитивно понятно. Атрибуты у объекта Response
позволяют получить всю информацию об ответе от сервера.Модуль идеально подходит как для работы со внешними API веб-сервисов, так и для получения HTML кода веб-страниц.
#requests
Функции только с именованными аргументами
Для того чтобы при использовании некоторой функции сделать так, чтобы ей можно было бы передавать только именованные аргументы, можно использовать аргумент
Таким образом, если просто передать два аргумента в функцию, то возникнет исключение
Такой прием может быть полезен для того, чтобы улучшить понятность кода. Здесь, что вполне очевидно, можно использовать и позиционные аргументы – в том случае, если поместить их до
#функции
Для того чтобы при использовании некоторой функции сделать так, чтобы ей можно было бы передавать только именованные аргументы, можно использовать аргумент
*
перед списком именованных аргументов.Таким образом, если просто передать два аргумента в функцию, то возникнет исключение
TypeError
. Но если передать их как именованные аргументы, то всё будет работать отлично.Такой прием может быть полезен для того, чтобы улучшить понятность кода. Здесь, что вполне очевидно, можно использовать и позиционные аргументы – в том случае, если поместить их до
*
.#функции