Числа для продвинутых по Марку Лутцу
Доброго, прекрасного, сказочного времени суток, семья моя :) Пришло время углубляться… И искать крупицы в стоге сена, которые углубят моё представление о языке Python.
Ну что ж, начинаю рефлексировать и перечитывать уже законспектированный материал.
Итак, что такое числа с точки зрения Python?
Это объект класса. Проверить это очень просто. Достаточно лишь написать в программном интерпретаторе следующий код:
Python есть такая встроенная функция type() называется. С помощью неё как раз можно узнать каким типом данных является объект. Поскольку статья посвящена числам, то мы проверяем числа. В итоге результатом проверки числа определился класс int (<class 'int'>)
По Лутцу числа являются не одиночным типом объектов, а категорией похожих объектов.
Давайте другой пример.
Видите различие?
В первом примере, у нас класс целых ЧИСЕЛ, а в другом класс ЧИСЕЛ с плавающей точкой. По факту их объединяет единое понятие «ЧИСЛО», а вот <class 'float'> и <class 'int'> являются их категориями (или характеристиками).
Таким образом выделяются следующие категории чисел:
1) Целые числа и с плавающей точкой
2) Комплексные числа
3) Десятичные числа
4) Дроби
5) Булевы числа (True/ False)
6) Встроенные функции и модули
Как можно увидеть исходя из категорий далеко не все представления чисел входят в базовый модуль Python. Например для работы с десятичными и дробными числами мне пришлось импортировать библиотеки decimal и fractions
При работе с числами очень важно знать операции, которые необходимы для их обработки. Операции применяются по старшенству. Я выделил это понятие, потому что несоблюдение данного правила могут вызвать ошибки в программе. Из правила старшинства следует перечень операций приоритетные к обработке по сравнению с другими. Перечень операторов можно взять из (https://letpy.com/handbook/operator-priorities/) этой таблицы. А в этой статье (https://habr.com/ru/company/vk/blog/337364/) можно встретить экзотические случаи, когда игнорирование правила старшенства может привести к ошибочному результату.
Числа в действии
Для того, чтобы приступить к разбору числовых типов данных необходимо помнить о правилах присвоения переменных.
1. Переменные создаются, когда им присваиваются значения.
2. Переменные заменяются своими значениями, когда используются в выражениях
3. Переменным должны быть присвоены значения до того, как можно применять их в выражениях
4. Переменные ссылаются на объекты и не объявляются заранее
Ниже опишу это с помощью кода
1 правило:
2 правило
3 правило
4 правило
Неочевидные вещи при работе с числами
1) Если я захочу вычислить несколько чисел в одной строке, то формальным результатом получу кортеж.
Вот показательный пример. Тут я запихал в переменную Numbers два выражения, их он оформил в кортеж. Если я проверю тип, то обнаружу, что он НЕ относится к числовому типу данных. Магия Python в действии :)
2) Если я захочу отформатировать строку, то можно воспользоваться следующими примерами.
На форматировании я останавливаюсь очень подробно в виду того, что очень привык к f-строкам (хотя это самый мощный и быстрый инструмент). На мой взгляд, такой расклад вещей не является Best Practice, поэтому приведу форматирование чисел как видит их Лутц.
3) Я мало использовал правила отображения.
Знаете ребят, я редко их применял в функциональном программировании, но это не значит, что они вообще не нужны. Как я понял они очень востребованы в ООП (там, где мы объявляем классы).
Как отличить отображение?
Лучше опишу конкретными примерами
repr () представляет собой представляет собой вывод выражения, таким образом, каким его видит код
str() представляет собой более дружественный вывод объекта
4) Немного о правилах деления.
Тут и без комментариев всё понятно, поэтому сразу к написанию программ:
Правила округления:
5) О существовании представления комплексных чисел в Python я не знал, поэтому для меня это новая информация.
По Лутцу, комплексные числа являются отдельным основным типом объектов в Python. Данное число состоит из действующей и мнимой части. И записываются с добавлением суффикса j и J.
Пример с использованием комплексных чисел я приводил в самом начале статьи, поэтому останавливаться на этом больше не буду
6) Поддержка системы счисления. Данный пункт я прямо хорошо проработал на CodeWars. Здесь я лишь только скажу, что в базовой комплектации Python работает с двоичной, восьмеричной, десятичной, шестнадцатеричной системой счисления.
Преобразование в десятичный тип:
Преобразование в обратную сторону:
Правила форматирования разных типов
7) Существуют другие встроенные типы. К ним Лутц относит random и math. Есть и более продвинутые ( вроде NumPy но о них автор не рассказывает)
Их описание я привёл выше по тексту. Основные методы, которые содержит этот модуль можно взять из официальной документации.
Модуль random: https://docs.python.org/3/library/random.html
Модуль math: https://docs.python.org/3/library/math.html
Ребят, в программировании очень важна тренировка и отработка навыков, поэтому тут моя рекомендация: поэкспериментируйте с этими модулями, не бойтесь ошибаться. Уж лучше ошибиться сейчас, чем на собеседовании :)
Основы десятичных чисел . Для чего нужен модуль Decimal?
Как говорит Лутц математика с плавающей точкой не является точным представлением вычисляемого выражения. Для того, чтобы это исправить существует внутренняя библиотека decimal. В начале статьи я уже упоминал в вкратце об этом модуле.
В этом пункте привожу наиболее интересные случаи:
Здесь в выводе следует особо обращать внимание на точность.
Обратите внимание! Если вы хотите вывести число в более человекочитаемом виде, то рекомендуется отображать числа в строковом представлении
Глобальная установка точности
Чтобы установить точность модуля decimal необходимо его настроить. Для этого существует метод getcontext().prec
Вот пример из книги:
Ребята, знаете, если бы я знал об этом раньше, то работа с точными числами на CodeWars обходилось бы мне куда меньшей болью. Так что примите даннный модуль во внимание. Если вы столкнётесь с анализом больших данных и вычислении собственных показателей, он может вам оказать просто огромную службу
9) Поработаем с дробями. Это тоже полезный метод. С дробями, ребят я на CodeWars не сталкивался, но однако не факт, что подобного типа задач там нет.
Вот парочку примеров:
Использование этого модуля автоматически упрощает дробь. Метод позволяет работать с числами разных типов. Для экспериментов можно обратиться к документации. (https://docs.python.org/3/library/fractions.html)
10) Поработаем со множествами. По Лутцу множества представляют неупорядоченную коллекцию уникальных и неизменяемых объектов, которая поддерживает операции, соответствующие математической теории множеств.
Сразу скажу, определение достаточно сложное. Его хорошо прорабатывать на практических примерах. Опишу его примерами:
Множества описываются встроенным методом set()
Его методами являются такие операции как: разность, пересечение, объединение, симметрическая разность, надмножество, подмножество
Вместе с операциями есть пара методов, среди которых: add() и update()
Для чего могут использоваться множества?
1) Для создания объектов с уникальными номерами
2) Для выделения различий в списках, строках и других объектах
3) Выполнения проверок на равенство, нейтральное к порядку
4) Обработка запросов, связанных с базами данных
Те пункты, которые я выделил, считаю наиболее важными.
Вот и закончилось глубокое описание работы с числами в Python!