что такое abc в питоне
Модуль числа в Python
Очень часто возникает необходимость вычисления модуля числа в Python. Рассмотрим, что такое модуль числа, какие есть способы его вычисления. Так же отдельно коснемся комплексных чисел.
Модуль числа
Часто в программировании требуется вычислить абсолютное значение числа. Иначе говоря, отбросить знак.
При вычислении модуля возможны 3 ситуации:
Но это все справедливо только для действительных чисел. Чему же тогда будет равен модуль комплексных?
Комплексное число состоит из действительной составляющей и мнимой. Геометрически это можно представить как 2 ортогональные оси: действительную и мнимую. Отмечаем на координатных осях требуемую точку. Модулем будет длина отрезка, проведенного из начала координат в эту точку.
Вычисление
Вычислять модуль можно следующими способами:
Все эти функции работают как в Python 2, так и в Python 3.
Для вычисления в Python модуля числа используется функция abs. Результат функции того же типа, которого был аргумент.
Свое решение
Если по каким то причинам нет возможности или желания использовать стандартные функции, то можно написать свое решение.
Например, можно вычислить воспользоваться тернарным оператором.
На основе такого условия сделаем свою функцию.
Модуль комплексного числа
Мы разобрались как происходит вычисление с действительными числами. Теперь посмотрим, как в языке программирования Python можно получить модуль комплексного.
Функцией fabs мы не сможем воспользоваться. Если попытаемся это сделать, то получим ошибку приведения комплексного числа к действительному (TypeError).
А вот с помощью abs преобразование удается.
Или же напишем свою функцию:
Результаты получились одинаковыми. Но нам все равно пришлось подключить библиотеку math для вычисления квадратного корня.
Модуль числа в Python — функции abs() и math.fabs()
З апускаю китайскую реплику «ТАРДИС», и вот мы в пятом классе. На доске нарисована числовая ось, а на ней выделен отрезок. Его начало в точке 4, а конец — в 8. Учительница говорит, что длину отрезка можно найти путём вычитания координаты начала отрезка из координаты его конца. Вычитаем, получаем 4, и радуемся — мы нашли длину. Ура! 🎉
Перемещаемся на год вперёд, и там происходит странное: учительница выделяет мелом другой отрезок, но делает это в каком-то неправильном месте — левее точки с цифрой «0». Теперь перед нами старая задача, но с новыми числами и даже буквами: A, B, минус 4 и минус 8. Мы начинаем искать длину отрезка AB = [-4;-8]:
Переводим непонимающий взгляд с получившейся отрицательной длины на довольную улыбающуюся учительницу, а затем на доску. Там наверху, рядом с сегодняшней датой, написана тема урока: «Модуль числа».
Что такое модуль числа
Модуль числа называют абсолютной величиной.
Для вещественных чисел модуль определяется так:
Т.е. в любом случае, модуль — число большее или равное 0. Поэтому отрицательная длина в примере хитрой учительницы должна была быть взята по модулю:
Тогда дети бы увидели, что геометрический смысл модуля — есть расстояние. Это справедливо и для комплексных чисел, однако формальное определение для них отличается от вещественного:
, где z — комплексное число: z = x + i y.
В то время как math.fabs() может оперировать только вещественными аргументами, abs() отлично справляется и с комплексными. Для начала покажем, что abs в python работает строго в соответствии с математическим определением.
# для вещественных чисел print(abs(-1)) print(abs(0)) print(abs(1)) > 1 > 0 > 1
Как видно, с вещественными числами всё в порядке. Перейдём к комплексным.
# для комплексных чисел print(complex(-3, 4)) print(abs(complex(-3, 4))) > (-3+4j) > 5.0
Если вспомнить, что комплексное число выглядит так: z = x + i y, а его модуль вычисляется по формуле:
Можно заметить, что abs() возвращает значения разных типов. Это зависит от типа аргумента:
print(type(abs(1))) > print(type(abs(1.0))) > print(type(abs(complex(1.0, 1.0))))
print(type(math.fabs(complex(2,3)))) > TypeError: can’t convert complex to float
Для начала работы с fabs() необходимо импортировать модуль math с помощью следующей инструкции:
Мы уже выяснили, что fabs() не работает с комплексными числами, поэтому проверим работу функции на вещественных:
print(math.fabs(-10)) print(math.fabs(0)) print(math.fabs(10)) > 10.0 > 0.0 > 10.0
Абстракция в Python – простое объяснение
Абстракция используется, чтобы скрыть внутренние характеристики функции от пользователей. Пользователи взаимодействуют только с базовой реализацией функции, но внутренняя работа скрыта. Пользователь знаком с тем, «что делает функция», но не знает, «как она работает».
Проще говоря, мы все пользуемся смартфоном и хорошо знакомы с его функциями, такими как камера, диктофон, набор номера и т. д., но мы не знаем, как эти операции выполняются в фоновом режиме. Возьмем другой пример – когда мы используем пульт от телевизора для увеличения громкости. Мы не знаем, как нажатие клавиши увеличивает громкость телевизора. Известно только, что нужно нажимать кнопку «+», чтобы увеличить громкость.
Это именно та абстракция, которая работает в объектно-ориентированной концепции.
Почему важна абстракция?
В Python абстракция используется, чтобы скрыть незначимые данные или класс, чтобы уменьшить сложность. Это также повышает эффективность приложения. Далее мы узнаем, как добиться абстракции в Python.
Классы абстракции в Python
Абстракция в Python может быть достигнута с помощью абстрактных классов и интерфейсов.
Класс, состоящий из одного или нескольких абстрактных методов, называется абстрактным классом. Абстрактные методы не содержат своей реализации. Абстрактный класс может быть унаследован подклассом, а абстрактный метод получает свое определение в подклассе. Классы абстракции должны быть прототипом другого класса. Абстрактный класс может быть полезен при разработке больших функций, а также для предоставления стандартного интерфейса для различных реализаций компонентов. Python предоставляет модуль abc для использования абстракции в программе Python. Рассмотрим следующий синтаксис.
Мы импортируем класс ABC из модуля abc.
Абстрактные базовые классы
Абстрактный базовый класс – это общая прикладная программа интерфейса для набора подклассов. Его может использовать сторонний поставщик, который предоставит такие реализации, как плагины. Это также полезно, когда мы работаем с большой базой кода, трудно запомнить все классы.
Работа абстрактных классов
В отличие от других языков высокого уровня, Python не предоставляет самого абстрактного класса. Нам нужно импортировать модуль abc, который обеспечивает основу для определения абстрактных базовых классов (ABC). ABC работает, декорируя методы базового класса как абстрактные. Он регистрирует конкретные классы как реализацию абстрактной базы. Мы используем @abstractmethod декоратор для определения абстрактного метода или, если мы не предоставляем определение методу, он автоматически становится абстрактным методом. Давайте разберемся в следующем примере.
В приведенном выше коде мы импортировали модуль abc для создания абстрактного базового класса. Мы создали класс Car, который унаследовал класс ABC, и определили абстрактный метод с именем mileage(). Затем мы унаследовали базовый класс от трех разных подклассов и по-разному реализовали абстрактный метод. Мы создали объекты для вызова абстрактного метода.
Разберемся еще на одном примере.
В приведенном выше коде мы определили абстрактный базовый класс с именем Polygon, а также определили абстрактный метод. Этот базовый класс наследуется различными подклассами. Мы реализовали абстрактный метод в каждом подклассе. Мы создали объект подклассов и вызываем метод side(). В игру вступают скрытые реализации метода side() внутри каждого подкласса. Абстрактный метод side(), определенный в абстрактном классе, никогда не вызывается.
Что следует помнить
Ниже приведены моменты, которые мы должны помнить об абстрактном базовом классе в Python:
Абстракция необходима для сокрытия подробных функций от пользователей. Мы рассмотрели все основные концепции абстракции в Python.
Python: функция abs ()
функция abs ()
Функция abs () используется для получения абсолютного (положительного) значения заданного числа.
Аргумент может быть целым числом или числом с плавающей запятой. Если аргумент является комплексным числом, его величина возвращается.
Синтаксис:
Версия:
Параметр:
название | Описание | Требуется / Необязательно |
---|---|---|
число | Числовое значение. | необходимые |
Возвращаемое значение:
Вернуть абсолютное значение числа.
Иллюстрированная презентация:
Пример: функция Python abs ()
В Python abs () работает с целыми и комплексными числами. Тип возвращаемого значения зависит от типа его аргумента.
Получить абсолютное значение чисел списка:
Преобразовать отрицательное число в положительное число:
Редактор кода Python:
Предыдущая: Встроенные функции Python
Далее: все ()
Абстрактные классы и интерфейсы в Питоне
Абстрактные базовые классы и интерфейсы — близкие по назначению и смыслу сущности. Как первые, так и вторые представляют собой своеобразный способ документирования кода и помогают ограничить (decouple) взаимодействие отдельных абстракций в программе (классов).
Питон — очень гибкий язык. Одна из граней этой гибкости — возможности, предоставляемые метапрограммированием. И хотя в ядре языка абстрактные классы и интерфейсы не представлены, первые были реализованы в стандартном модуле abc, вторые — в проекте Zope (модуль zope.interfaces).
Нет смысла одновременно использовать и то и другое, и поэтому каждый программист должен определить для себя, какой инструмент использовать при проектировании приложений.
2 Абстрактные базовые классы (abс)
Начиная с версии языка 2.6 в стандартную библиотеку включается модуль abc, добавляющий в язык абстрактные базовые классы (далее АБК).
АБК позволяют определить класс, указав при этом, какие методы или свойства обязательно переопределить в классах-наследниках:
Таким образом, если мы хотим использовать в коде объект, обладающий возможностью перемещения и определенной скоростью, то следует использовать класс Movable в качестве одного из базовых классов.
Наличие необходимых методов и атрибутов объекта теперь гарантируется наличием АБК среди предков класса:
Видно, что понятие АБК хорошо вписывается в иерархию наследования классов, использовать их легко, а реализация, если заглянуть в исходный код модуля abc, очень проста. Абстрактные классы используются в стандартных модулях collections и number, задавая необходимые для определения методы пользовательских
классов-наследников.
Подробности и соображения по поводу использования АБК можно найти в PEP 3119
(http://www.python.org/dev/peps/pep-3119/).
3 Интерфейсы (zope.interfaces)
Реализация проекта Zope в работе над Zope3 решила сделать акцент на компонентной архитектуре; фреймворк превратился в набор практически независимых компонент. Клей, соединяющий компоненты — интерфейсы и основывающиеся на них адаптеры.
Модуль zope.interfaces — результат этой работы.
В простейшем случае использвание интерфейсов напоминает примерение АБК:
В интерфейсе декларативно показывается, какие атрибуты и методы должны быть у объекта. Причем класс реализует (implements) интерфейс, а объект класса — предоставляет (provides). Следует обратить внимание на разницу между этими понятиями!
«Реализация» чем-либо интерфейса означает, что только «производимая» сущность будет обладать необходимыми свойствами; а «предоставление» интерфейса говорит о конкретных возможностях оцениваемой сущности. Соответственно, в Питоне классы, кстати, могут как реализовывать, так и предоставлять интерфейс.
На самом деле декларация implement(IVehicle) — условность; просто обещание, что данный класс и его объекты ведут себя именно таким образом. Никаких реальных проверок проводиться не будет
Видно, что в простейших случаях интерфейсы только усложняют код, как, впрочем, и АБК
Компонентная архитектура Zope включает еще одно важное понятие — адаптеры. Вообще говоря, это простой шаблон проектирования, корректирующий один класс для использования где-то, где требуется иной комплект методов и атрибутов. Итак,
4 Адаптеры
Предположим, что имеется пара классов, Guest и Desk. Определим интерфейсы к ним, плюс класс, реализующий интерфейс Guest:
Адаптер должен учесть анонимного гостя, зарегистрировав в списке имен:
Существует реестр, который ведет учет адаптеров по интерфейсам. Благодаря ему можно получить адаптер, передав в вызов класса-интерфейса адаптируемый объект. Если адаптер не зарегистрирован, то вернется второй аргумент интерфейса:
Такую инфраструктуру удобно использовать для разделения кода на компоненты и их связывания.
Один из ярчайших примеров использования такого подхода помимо самого Zope — сетевой фреймворк Twisted, где изрядная часть архитектуры опирается на интерфейсы из zope.interfaces.
5 Вывод
При ближайшем рассмотрении оказывается, что интерфейсы и абстрактные базовые классы — разные вещи.
Абстрактные классы в основном жестко задают обязательную интерфейсную часть. Проверка объекта на соответствие интерфейсу абстрактного класса проверяется при помощи встроенной функции isinstance; класса — issubclass. Абстрактный базовый класс должен включаться в иерархию в виде базового класса либо mixin`а.
Минусом можно считать семантику проверок issubclass, isinstance, которые пересекаются с обычными классами (их иерархией наследования). На АБК не выстраивается никаких допонительных абстракций.
Интерфейсы — сущность декларативная, они не ставят никаких рамок; просто утверждается, что класс реализует, а его объект предоставляет интерфейс. Семантически утверждения implementedBy, providedBy являются более корректными. На такой простой базе удобно выстраивать компонентную архитектуру при помощи адапетров и других производных сущностей, что и делают крупные фреймворки Zope и Twisted.
Надо понимать, что использование обоих инструментов имеет смысл только при построении и использовании сравнительно крупных ООП-систем — фреймворков и библиотек, в малых программах они могут только запутать и усложнить код код лишними абстракциями.