Типы данных чисел в языке Python
Числовые типы данных в Python
В Python для представления чисел используются три основных встроенных типа: int (целые числа), float (числа с плавающей точкой) и complex (комплексные числа). Каждый из них поддерживает стандартные арифметические операции и имеет свои особенности, связанные с точностью и диапазоном значений. Ниже рассмотрены различные варианты создания и работы с этими типами, а также типичные ошибки.
Как создать целое число (int) в Python?
Самый простой способ - присвоить переменной целое число без десятичной точки:
a = 42
b = -7
c = 0Python типы переменных числа (типы переменных для чисел в python)
Переменные a, b и c автоматически получат тип int. В Python 3 целые числа имеют неограниченный диапазон (ограничен только памятью).
Другой вариант - использовать функцию int() для преобразования из строки или числа другого типа:
x = int('123') # из строки
print(x) # 123
print(type(x)) # <class 'int'>
y = int(3.14) # отбрасывает дробную часть
print(y) # 3
Если строка не является корректным представлением целого числа, возникает ошибка ValueError. Например, int('abc') вызовет исключение. Для безопасного преобразования рекомендуется использовать блок try-except.
Как создать число с плавающей запятой (float)?
Числа с плавающей точкой записываются с десятичной точкой или в экспоненциальной записи:
f1 = 3.14
f2 = 0.001
f3 = 1.5e-10 # 1.5 * 10^(-10)
Функция float() позволяет преобразовать строку или целое число в float:
g = float('2.718')
print(g) # 2.718
h = float(5)
print(h) # 5.0
Из-за двоичного представления некоторые десятичные дроби не могут быть точно сохранены. Например, 0.1 + 0.2 даёт 0.30000000000000004. Это не ошибка, а особенность типа float. Для критичных к точности вычислений используйте модуль decimal.
Как работать с комплексными числами (complex)?
Комплексное число записывается как X+Yj, где j - мнимая единица:
z1 = 2 + 3j
z2 = -1j
Можно использовать конструктор complex(real, imag) или преобразовать строку:
z3 = complex(4, -5) # 4-5j
z4 = complex('1+2j')
print(z4) # (1+2j)
В Python мнимая единица обозначается буквой j, а не i как в математике. Строка для complex() не должна содержать пробелов вокруг знака +/-, иначе возникнет ValueError.
Как преобразовать строку в число и определить её тип?
Для преобразования используются функции int(), float(), complex(). Проверить тип можно с помощью type() или isinstance():
value = '42'
# прямое преобразование
num = int(value)
print(type(num)) # <class 'int'>
# проверка isinstance
print(isinstance(num, int)) # True
Для безопасного преобразования, особенно при вводе от пользователя, используют конструкцию try-except:
s = '123.45'
try:
n = float(s)
print('Успешно:', n)
except ValueError:
print('Неверный формат числа')
Если передать пустую строку или строку с лишними символами, возникнет ValueError. Также int() не принимает строки с десятичной точкой - для этого сначала нужно преобразовать в float.
Как избежать ошибок точности при вычислениях с дробями?
Модуль decimal предоставляет тип Decimal для точных десятичных вычислений. Необходимо задать точность через контекст или передать число строкой:
from decimal import Decimal, getcontext
getcontext().prec = 28 # точность 28 знаков
d1 = Decimal('0.1')
d2 = Decimal('0.2')
print(d1 + d2) # 0.3 (точно)
Модуль fractions позволяет работать с рациональными числами в виде дробей:
from fractions import Fraction
f = Fraction(1, 3)
print(f) # 1/3
print(float(f)) # 0.3333333333333333
Использование Decimal медленнее, чем встроенный float, и требует импорта. Fraction подходит только для рациональных чисел.
Как задать число в двоичной, восьмеричной или шестнадцатеричной системе?
Python поддерживает целочисленные литералы с префиксами: 0b (binary), 0o (octal), 0x (hex):
binary = 0b1010 # 10 в десятичной
octal = 0o12 # 10
hexa = 0x1A # 26
Функция int() с указанием основания (от 2 до 36) позволяет преобразовать строку в число:
num = int('1010', 2) # 10
num = int('0x1A', 16) # 26 (префикс можно опустить)
Недопустимые символы (например, '2' в двоичной системе) вызывают ValueError. При использовании строки с префиксом основание должно соответствовать префиксу, иначе результат может быть неверным.
Расширенные примеры работы с числовыми типами
В этом разделе приведены более сложные и неочевидные примеры, демонстрирующие возможности числовых типов Python.
1. Целые числа произвольной длины
Python 3 поддерживает целые числа неограниченного размера. Это позволяет выполнять операции с числами, значительно превышающими стандартные 64 бита.
big_int = 123456789012345678901234567890
print(big_int * 2) # умножение без переполнения
246913578024691357802469135780
2. Арифметика комплексных чисел
Комплексные числа поддерживают все стандартные операции и имеют атрибуты .real и .imag для получения действительной и мнимой частей.
a = 3 + 4j
b = 1 - 2j
print('Сумма:', a + b)
print('Произведение:', a * b)
print('Модуль:', abs(a))
print('Сопряжённое:', a.conjugate())
Сумма: (4+2j) Произведение: (11-2j) Модуль: 5.0 Сопряжённое: (3-4j)
3. Проверка равенства float с помощью math.isclose
Из-за погрешностей напрямую сравнивать float через == не рекомендуется. Вместо этого используют math.isclose:
import math
a = 0.1 + 0.2
b = 0.3
print(a == b) # False
print(math.isclose(a, b, rel_tol=1e-9)) # True
False True
4. Точные вычисления с Decimal
Модуль decimal позволяет контролировать точность и округление. Например, вычисление ежемесячного платежа по кредиту:
from decimal import Decimal, getcontext
getcontext().prec = 50
principal = Decimal('100000.00')
rate = Decimal('0.05') / Decimal('12')
payment = principal * rate / (Decimal('1') - (Decimal('1') + rate) ** (-12))
print('Ежемесячный платёж:', payment)
Ежемесячный платёж: 8560.7475...
5. Преобразование чисел в разные системы счисления
Для обратного преобразования числа в строку в заданной системе используются встроенные функции bin(), oct(), hex().
num = 255
print('Двоичная:', bin(num))
print('Восьмеричная:', oct(num))
print('Шестнадцатеричная:', hex(num))
Двоичная: 0b11111111 Восьмеричная: 0o377 Шестнадцатеричная: 0xff
6. Точные рациональные дроби с fractions.Fraction
Использование Fraction для точного представления дробей без округлений:
from fractions import Fraction
f1 = Fraction(2, 3)
f2 = Fraction(5, 7)
print('Сумма:', f1 + f2)
print('Произведение:', f1 * f2)
print('Деление:', f1 / f2)
Сумма: 29/21 Произведение: 10/21 Деление: 14/15