Немного про числовые типы в Питоне
Итак, буду понемного записывать то, что узнаю по питону или что-то из того, что я хотел бы закрепить.
На текущий момент начал проходить курс по Питону от Яндекс.Практикума, поэтому какие-то предложения, примеры, могут браться оттуда.
Числа
Python различает разные типы чисел: целые числа (int), десятичные дроби (float) и комплексные числа. От типа чисел зависит какие операции с ними можно проводить и как они хранятся в памяти устройства.
Тип Int
К классу int относятся все положительные и отрицательные числа, без дробной части - в том числе и 0.
Числа данного типа можно записывать в том числе через нижнее подчеркивание, применяется это когда числа у нас большие и их невозможно прочитать без разделения.
Например,
## вот так переменная плохо читается
a = 1000000000
print(a)
# а так уже лучше
a = 1_000_000_000
print(a)
Как мне кажется это применимо скорее для каких-то констант, которые мы записываем в коде и, как правило, не применяется.
Переменные типа int, как и переменные других типов, не требуют отдельного объявления: Python автоматически присвоит переменной нужный тип при операции присваивания:
x = 0 # x - это int
y = 150 # y - это int
z = -100 # z - тоже int
Тип Float
Тип float применяют для представления вещественных числе, а название произошло от английского «float number». В данном типе целую часть от дробной отделяют не запятой, а точкой.
# Знакомьтесь, это float
a = 3.3333
b = 5.
c = 2.0
x = .007
y = 0.007
Значения для b и x указаны в сокращенном синтаксисе. Если при записи числа перед точкой или после неё ничего не указано, то Питон понимает, что целая или дробная часть равны нулю.
С данным типом чисел важно помнить, что на длину чисел с плавающей точкой накладываются ограничения, в отличии от int. Ограничения зависят от компьютера на котором выполняется программа.
Например, так как потенциально дробь 1/3 может занять всю доступную память, то при записи автоматически дробь может быть округлена, что приводит к проблеме с погрешностью в округлении.
excellent = 0.4 + 0.4 + 0.2
print('excellent =', excellent)
badly = 0.3 + 0.3 + 0.3 + 0.1
print('badly =', badly)
### Результат
excellent = 1.0
badly = 0.9999999999999999
Погрешность связана с тем, что на аппаратном уровне компьютер понимает только два числа: 0 и 1. При переводе из двоичной системы в десятеричную возникает ошибка в округлении получившегося значения.
В большинстве случаев подобные ошибки незаментны, но иногда точность очень важна и от нее может зависеть многое.
Чтобы не потерять точность при вычислениях, используют такой приём: перед обработкой число типа float домножают на 10 в степени n (на 10, 100, 1000...). Множитель подбирают так, чтобы дробная часть исходного числа стала равной нулю; затем проводят необходимые операции, а после обработки полученное значение делят на то же число, на которое умножали, приводя разрядность числа в исходное состояние.
Еще есть одна особенность - при деленое одного целого числа на другое мы получим тип float, а не int.
x = 20 / 2
print(x)
# Вывод в терминал: 10.0
x = 11 / 3
print(x)
# Вывод в терминал: 3.6666666666666665
Кроме встроенных данных есть еще сторонние модули, которые помогают работать с числами. Например, модуль Decimal.
Модуль Decimal
Когда важна точность - можем применить встроенный в Python модуль Decimal. Он даёт почти стопроцентную точность при работе с дробями.
Для объявления таких чисел нужно
- импортировать в код класс Decimal;
- при объявлении переменной указать этот класс;
- передать в конструктор класса значение числа в кавычках — в виде строки.
from decimal import Decimal
x = Decimal('3.3')
print(type(x))
# Вывод в терминал: <class 'decimal.Decimal'>
from decimal import Decimal
i = 3.3 + 4.1
print(i)
# Вывод в терминал: 7.3999999999999995
i = Decimal('3.3') + Decimal('4.1')
print(i)
# Вывод в терминал: 7.4
Тип Complex
В python есть еще и комплексные числа, но о них я ничего рассказать не могу. Может когда-нибудь в будущем осилю.