Работа с числами в Python: int, float, complex
Числовые типы в Python
В языке Python существуют три основных числовых типа: int (целые числа), float (вещественные числа с плавающей точкой) и complex (комплексные числа). Эти типы являются встроенными и не требуют импорта дополнительных модулей.
Примеры создания чисел:
a = 42 # int
b = 3.14159 # float
c = 2 + 3j # complex
d = 1_000_000 # int с разделителем разрядов
print(type(a)) # <class 'int'>
print(type(b)) # <class 'float'>
print(type(c)) # <class 'complex'>
Python исходный код программы (исходный код программы на python)
Основные арифметические операции:
x = 15
y = 4
print(x + y) # 19
print(x - y) # 11
print(x * y) # 60
print(x / y) # 3.75 (вещественное)
print(x // y) # 3 (целочисленное деление)
print(x % y) # 3 (остаток)
print(x ** y) # 50625 (возведение в степень)
Python числа (числа в python)
Особенности типа int: не имеет ограничения по длине (может быть сколь угодно большим). float использует стандарт IEEE 754 (64 бита), поэтому точность ограничена (около 15–17 значащих цифр). complex состоит из вещественной и мнимой частей, обе являются числами с плавающей точкой.
Почему 0.1 + 0.2 не равно 0.3?
print(0.1 + 0.2) # 0.30000000000000004
print(0.1 + 0.2 == 0.3) # False
Это известная проблема бинарного представления чисел с плавающей точкой. Для точных финансовых расчетов следует использовать модуль decimal. Также возможна ошибка деления на ноль:
# print(10 / 0) # ZeroDivisionError: division by zero
Как задать число в двоичной, восьмеричной или шестнадцатеричной системе?
Python поддерживает литералы разных систем счисления:
bin_num = 0b1101 # 13 в двоичной
oct_num = 0o17 # 15 в восьмеричной
hex_num = 0x1F # 31 в шестнадцатеричной
print(bin_num, oct_num, hex_num) # 13 15 31
Для преобразования числа в строку с указанием системы используются функции bin(), oct(), hex():
print(bin(13)) # 0b1101
print(oct(13)) # 0o15
print(hex(31)) # 0x1f
Как преобразовать строку в число?
Для безопасного преобразования строки в число используются встроенные функции с проверкой:
int_val = int("42") # 42
float_val = float("3.14") # 3.14
complex_val = complex("2+3j") # (2+3j)
# Можно указать основание системы счисления
int_from_bin = int("1010", 2) # 10
Что делать, если строка не является корректным числом?
Возникает исключение ValueError. Следует обрабатывать его с помощью try/except:
s = "abc"
try:
num = int(s)
except ValueError:
print("Невозможно преобразовать строку в число")
Как выполнить округление чисел?
Для округления используется встроенная функция round(), а также math.floor() и math.ceil():
import math
x = 3.14159
print(round(x, 2)) # 3.14
print(math.floor(x)) # 3
print(math.ceil(x)) # 4
Почему round(2.5) возвращает 2?
Функция round() в Python использует банковское округление (округление до ближайшего чётного). Для привычного математического округления можно использовать Decimal.
from decimal import Decimal, ROUND_HALF_UP
print(Decimal("2.5").quantize(Decimal("0"), rounding=ROUND_HALF_UP)) # 3
Расширенные примеры работы с числами
Ниже приведены более сложные и не столь очевидные сценарии использования числовых типов в Python.
Большие целые числа и их свойства
# Целые числа не ограничены по длине
big_num = 2 ** 1000
print(big_num)
# Результат:
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376
(вывод опущен из-за длины, но он будет целым числом из 303 цифр)
Метод bit_length() показывает количество бит, необходимых для представления числа:
print(big_num.bit_length()) # 1001
1001
Представление float в виде дроби
x = 0.75
print(x.as_integer_ratio()) # (3, 4)
(3, 4)
Сравнение чисел с плавающей точкой с допуском
import math
a = 0.1 + 0.2
b = 0.3
print(math.isclose(a, b, rel_tol=1e-9)) # True
True
Использование Decimal для точных вычислений
from decimal import Decimal
d1 = Decimal("0.1")
d2 = Decimal("0.2")
print(d1 + d2) # 0.3
print((d1 + d2) == Decimal("0.3")) # True
0.3 True
Работа с рациональными дробями (Fraction)
from fractions import Fraction
frac1 = Fraction(1, 3)
frac2 = Fraction(2, 5)
print(frac1 + frac2) # 11/15
print(frac1 * frac2) # 2/15
print(frac2.limit_denominator(10)) # 2/5 (без изменений)
11/15 2/15 2/5
Комплексные числа: свойства и операции
c = 3 + 4j
print(c.real) # 3.0
print(c.imag) # 4.0
print(abs(c)) # 5.0 (модуль)
print(c.conjugate()) # (3-4j)
# Арифметика с комплексными числами
d = 1 + 2j
print(c + d) # (4+6j)
print(c * d) # (-5+10j)
print(c ** 2) # (-7+24j)
3.0 4.0 5.0 (3-4j) (4+6j) (-5+10j) (-7+24j)
Случайные числа
import random
# Случайное целое от 1 до 10
print(random.randint(1, 10))
# Случайное float от 0 до 1
print(random.random())
# Выбор случайного элемента из последовательности
print(random.choice([1, 2, 3, 4, 5]))
(пример вывода) 7 0.832456 3
Побитовые операции над целыми числами
a = 0b1100 # 12
b = 0b1010 # 10
print(bin(a & b)) # 0b1000 (побитовое И)
print(bin(a | b)) # 0b1110 (побитовое ИЛИ)
print(bin(a ^ b)) # 0b0110 (исключающее ИЛИ)
print(bin(~a)) # -0b1101 (побитовое НЕ с учётом знака)
print(bin(a << 2)) # 0b110000 (сдвиг влево)
print(bin(a >> 2)) # 0b11 (сдвиг вправо)
0b1000 0b1110 0b110 -0b1101 0b110000 0b11
Размер числа в памяти
import sys
print(sys.getsizeof(10)) # 28 (на 64-битной системе)
print(sys.getsizeof(10**100)) # больше, зависит от величины
28 72