Все типы, описанные в разделе, являются неизменяемыми.

print(7/2)    # 3.5 - обычное математическое деление
print(7//2)   # 3 - целочисленное деление
print(7%2)    # 1 - остаток от деления

Целочисленные типы

  • Логические выражения:
    • False и 0 - это False
    • True и любые числа кроме 0 - это True
  • Численные выражения:
    • True - это 1
    • False - это 0
i += True     # синтаксически верно и увеличивает на 1, но НЕ ПИШИТЕ ТАК
i += 1        # то же самое, лучше писать так

x = bool(7)   # x == True
x = bool(-7)  # x == True
x = bool(0)   # x == False

int

int - целые положительные и отрицательные числа. Размер не ограничен.

x = 2**217  # 2 в степени 217
print(x)    # 210624583337114373395836055367340864637790190801098222508621955072

Как создаются целочисленные объекты?

Для других типов объектов похожие правила. Вызывается функция int

  • без аргументов int() - создаст целое число 0. Аналогично любые другие встроенные типы данных без аргумента создают какой-то объект со значением по умолчанию;
  • с одним аргументом
    • int(12) - поверхностная копия
    • int('123'), int(4.56) - если тип аргумента подходящий, то происходит преобразование. Если оно неудачное, например, int('Hello'), то возбуждается исключение ValueError, если тип неподходящий, например, int([1, 2, 3]), то исключение TypeError
  • с двумя аргументами int(x, base) - аналогично, ибо в одном аргументе по умолчанию base=10 (подробнее далее)

Функции преобразования целых чисел

Синтаксис Описание
bin(i) Возвращает двоичное представление целого числа i в виде строки, например, bin(1980) == '0b11110111100'
hex(i) Возвращает шестнадцатеричное представление целого числа i в виде строки, например, hex(1980) == '0x7bc'
int(x) Преобразует объект x в целое число; в случае ошибки во время преобразования возбуждает исключение ValueError, а если тип объекта x не поддерживает преобразование в целое число, возбуждает исключение TypeError. Если x является числом с плавающей точкой, оно преобразуется в целое число путем усечения дробной части.
int(s, base) Преобразует строку s в целое число, в случае ошибки возбуждает исключение ValueError. Если задан необязательный аргумент base, он должен быть целым числом в диапазоне от 2 до 36 включительно.
oct(i) Возвращает восьмеричное представление целого числа i в виде строки, например, oct(1980) == '0o3674'
>>> s1 = bin(10)   # получаем из числа 10 строки для представления числа в бинарной, восьмеричной и шестнадцатеричной системах счисления
>>> s1
'0b1010'
>>> s2 = oct(10)
>>> s2
'0o12'                  # Заметьте, что префикс **0o**, а не просто 0, как в языке С.
>>> s3 = hex(10)
>>> s3
'0xa'
>>> x1 = int('10')      # из строки - десятичного представления числа - получаем целое число типа int
>>> x1; type(x1)
10
<class 'int'>
>>> x1 = int('  10  ')  # **допускает пробельные символы до и после числа**
>>> x1
10
>>> x2 = int(s1, 2)     # обратно из бинарной строки в целое число
>>> x2; type(x2)
10
<class 'int'>
>>> x2 = int('111', 2)  # обратно из бинарной строки в целое число
>>> x2
7
>>> x3 = int('z', 36)   # параметр base может быть от 2 до 36, цифры тогда 0-9a-zA-Z
>>> x3
35
>>> x3 = int('Az', 36)  
>>> x3
395

Для преобразования стандартных типов данных используются функци

  • int(x, base=10)
  • float(x)
  • str(x)
  • bool(x)
  • complex(re, im)

Действия над числами

Синтаксис Описание
x + y Складывает число x и число y
x - y Вычитает число y из числа x
x * y Умножает x на y
x / y Делит x на y – результатом всегда является значение типа float (или complex, если x или y является комплексным числом)
x // y Делит x на y, результат округляется вниз -7//2 == -4
x % y Возвращает модуль (остаток) от деления x на y. Для комплексных чисел преобразуется с помощью abs() к float
x ** y Возводит x в степень y, смотрите также функцию pow()
-x Изменяет знак числа. 0 остается нулем.
+x Ничего не делает, иногда используется для повышения удобочитаемости программного кода
abs(x) Возвращает абсолютное значение x
divmod(x, y) Возвращает частное и остаток деления x на y в виде кортежа двух значений типа int
pow(x, y) Возводит x в степень y; то же самое, что и оператор **
pow(x, y, z) Более быстрая альтернатива выражению (x ** y) % z
round(x, n) Возвращает значение типа int, соответствующее значению x типа float, округленному до ближайшего целого числа (или значение типа float, округленное до n-го знака после запятой, если задан аргумент n)

Комбинированные операторы присвоения

+= -= *= /= //= %= и прочие операторы

Как работает ++ и --

Никак. Их нет в языке. Используйте x += 1 и x -= 1. В циклах можно обойтись без них.

Побитовые операции над целыми числами

Синтаксис Описание
i \ j Битовая операция OR (ИЛИ) над целыми числами i и j; отрицательные числа представляются как двоичное дополнение
i ^ j Битовая операция XOR (исключающее ИЛИ) над целыми числами i и j
i & j Битовая операция AND (И) над целыми числами i и j
i << j Сдвигает значение i влево на j битов аналогично операции i * (2 ** j) без проверки на переполнение
i >> j Сдвигает значение i вправо на j битов аналогично операции i // (2 ** j) без проверки на переполнение
~i Инвертирует биты числа i

bool

True и False - константы.

Операторы and, or, not.

НЕ используйте 1 и 0 вместо True и False (понижает читаемость кода).

Числа с плавающей точкой

В стандартной библиотеке это float, complex и decimal.Decimal

float

Константы записываются как 0.0, 4., 5.7, –2.5, –2e9, 8.9e–4.

Обычно реализованые типом double языка С. Подробнее смотри sys.float_info Поэтому часть чисел может быть представлена точно (0.5), а часть - только приблизительно (0.1).

Можно написать простую функцию, которая сравнивает числа с машинной точностью:

def equal_float(a, b):
    return abs(a - b) <= sys.float_info.epsilon

Округление

Все numbers.Real типы (int и float) могут быть аргументами следующих функций :

Операция Результат
int(x) Округляет число в сторону нуля. Это стандартная функция, для ее использования не нужно подключать модуль math
round(x) Округляет число до ближайшего целого. Если дробная часть числа равна 0.5, то число округляется до ближайшего четного числа
round(x, n) Округляет число x до n знаков после точки. Это стандартная функция, для ее использования не нужно подключать модуль math
math.floor(x) Округляет число вниз («пол»), при этом floor(1.5) = 1, floor(-1.5) = -2
math.ceil(x) Округляет число вверх («потолок»), при этом ceil(1.5) = 2, ceil(-1.5) = -1
math.trunc(x) Отбрасывает дробную часть
float.is_integer() True, если дробная часть 0.
float.as_integer_ratio() Возвращает числитель и знаменатель дроби

Примеры:

Выражение Результат
int(1.7) 1
int(-1.7) -1
ceil(4.2) 5
ceil(4.8) 5
ceil(-4.2) -4
round(1.3) 1
round(1.7) 2
round(1.5) 2
round(2.5) 2
round(2.65, 1) 2.6
round(2.75, 1) 2.8
trunc(5.32) 5
trunc(-5.32) -5
>>> x = 3.0
>>> x.is_integer()
True
>>> x = 2.75
>>> a, b = x.as_integer_ratio()  # помним, что функция может возвращать несколько значений
>>> a                            # числитель
11
>>> b                            # знаменатель
4

Сюрпризы:

round(2.85, 1)   # 2.9

подробнее: Floating Point Arithmetic: Issues and Limitations

Функции и константы модуля math

Не забудьте сделать import math

Синтаксис Описание
math.acos(x) Возвращает арккосинус x в радианах
math.acosh(x) Возвращает гиперболический арккосинус x в радианах
math.asin(x) Возвращает арксинус x в радианах
math.asinh(x) Возвращает гиперболический арксинус x в радианах
math.atan(x) Возвращает арктангенс x в радианах
math.atan2(y, x) Возвращает арктангенс y/x в радианах
math.atanh(x) Возвращает гиперболический арктангенс x в радианах
math.ceil(x) Возвращает наименьшее целое число типа int, большее и равное x, например, math.ceil(5.4) == 6
math.copysign(x,y) Возвращает x со знаком числа y
math.cos(x) Возвращает косинус x в радианах
math.cosh(x) Возвращает гиперболический косинус x в радианах
math.degrees(r) Преобразует число r, типа float, из радианов в градусы
math.e Константа e, примерно равная значению 2.7182818284590451
math.exp(x) Возвращает e в степени x, то есть math.e ** x
math.fabs(x) Возвращает \ x\ , то есть абсолютное значение x в виде числа типа float
math.factorial(x) Возвращает x!
math.floor(x) Возвращает наименьшее целое число типа int, меньшее и равное x, например, math.floor(5.4) == 5
math.fmod(x, y) Выполняет деление по модулю (возвращает остаток) числа x на число y; дает более точный результат, чем оператор %, применительно к числам типа float
math.frexp(x) Возвращает кортеж из двух элементов с мантиссой (в виде числа типа float) и экспонентой (в виде числа типа int)
math.fsum(i) Возвращает сумму значений в итерируемом объекте i в виде числа типа float
math.hypot(x, y) Возвращает расстояние от точки (0,0) до точки (x,y) $$\sqrt{x^2 + y^2}$$
math.isinf(x) Возвращает True, если значение x типа float является бесконечностью $$±\infty$$
math.isnan(x) Возвращает True, если значение x типа float не является числом
math.ldexp(m, e) Возвращает $$m \cdot 2^x$$ – операция, обратная math.frexp
math.log(x, b) Возвращает $$\log_{b} {x}$$, аргумент b является необязательным и по умолчанию имеет значение math.e
math.log10(x) Возвращает $$\log_{10} {x}$$
math.log1p(x) Возвращает $$\log_{e} (1+x)$$; дает точные значения, даже когда значение x близко к 0
math.modf(x) Возвращает дробную и целую часть числа x в виде двух значений типа float
math.pi Константа $$\pi$$, примерно равна 3.1415926535897931
math.pow(x, y) Возвращает $$x^y$$ в виде числа типа float
math.radians(d) Преобразует число d, типа float, из градусов в радианы
math.sin(x) Возвращает синус x в радианах
math.sinh(x) Возвращает гиперболический синус x в радианах
math.sqrt(x) Возвращает $$\sqrt{x}$$
math.sum(i) Возвращает сумму значений в итерируемом объекте i в виде числа типа float
math.tan(x) Возвращает тангенс x в радианах
math.tanh(x) Возвращает гиперболический тангенс x в радианах
math.trunc(x) Возвращает целую часть числа x в виде значения типа int; то же самое, что и int(x)

Бесконечность и NaN (not a number)

Создаем бесконечность, отрицательную бесконечность и NaN

>>> a = float('inf')
>>> b = float('-inf')
>>> c = float('nan')
>>> a
inf
>>> b
-inf
>>> c
nan
>>>

Проверяем эти особые значения функциями math.isinf() и math.isnan()

>>> math.isinf(a)
True
>>> math.isinf(b)
True
>>> math.isnan(c)
True
>>> b < 0
True

Операции над бесконечностью интуитивно понятны математику:

>>> a = float('inf')
>>> a + 45
inf
>>> a * 10
inf
>>> 10 / a
0.0

Когда получается nan ?

>>> a = float('inf')
>>> a/a
nan
>>> b = float('-inf')
>>> a + b
nan

Из nan получается только nan

>>> c = float('nan')
>>> c + 23
nan
>>> c / 2
nan
>>> c * 2
nan
>>> math.sqrt(c)
nan

Не сравнивайте nan

>>> c = float('nan')
>>> d = float('nan')
>>> c == d
False
>>> c is d
False

Получить исключение, когда результат nan

Иногда при отладке нужно поймать, где возникло "не то значение". Используйте модуль fpectl Floating point exception control модуль не входит в стандартную поставку.

complex

Неизменяемый тип данных. Состоит из двух float чисел - действительной и мнимой части.

Для представления комплесных чисел есть встроенный тип complex. Мнимая единица обозначается как j или J. Если действительная часть 0, то ее можно не писать.

Примеры комплексных чисел: 3.5+2j, 0.5j, -7.24+0j

>>> x = 3.5 + 2.1j
>>> x.real, x.imag  # действительная и мнимая часть
(3.5, 2.1)
>>> x.conjugate()   # изменили знак мнимой части
(3.5-2.1j)

При конвертации из строки вокруг + или - НЕ должно быть пробелов

x = complex(3, 5) # 3+5j
x = complex(3.5) # 3.5+0j
x = complex(' 3+5j ') # 3+5j
x = complex('3 + 5j') # ОШИБКА

С комплексными числами работают привычные операторы и функции, за исключением //, %, divmod, pow с тремя аргументами (см. таблицу далее)

Для работы с комплексными числами используйте функции из модуля cmath.

Decimal

Если нужна бОльшая точность, чем дает float, используйте decimal.Decimal.

Эти числа обеспечивают уровень точности, который вы укажете (по умолчанию 28 знаков после запятой), и могут точно представлять периодические числа, такие как 0.11, но скорость работы с такими числами существенно ниже, чем с обычными числами типа float. Вследствие высокой точности числа типа decimal.Decimal прекрасно подходят для производства финансовых вычислений.

Различные типы в бинарных операторах

Тип операторов Тип результата
int float float
float complex complex
Decimal int Decimal

Decimal может использоваться только с Decimal или int, нельзя его использовать с float и другими неточными типами.

results matching ""

    No results matching ""