2.3. Математические операции

Python работает как калькулятор прямо из коробки. На этой странице рассматриваются операторы, которые вы будете использовать чаще всего: арифметика над числами, сравнения, дающие логические значения, логические операторы для объединения условий и побитовые операторы для работы на уровне аппаратуры.

2.3.1. Арифметика

Стандартные арифметические операторы над значениями int и float:

  • + – сложение

  • - – вычитание (или отрицание в качестве префикса: -x)

  • * – умножение

  • / – деление. Всегда возвращает float, даже если оба операнда – целые числа.

  • // – целочисленное деление с округлением вниз. Возвращает целочисленное частное, округлённое в сторону минус бесконечности.

  • % – остаток от деления (по модулю).

  • ** – возведение в степень (2 ** 10 равно 1024).

>>> 7 / 2
3.5
>>> 7 // 2
3
>>> -7 // 2
-4
>>> 7 % 2
1
>>> 2 ** 16
65536

Арифметика со смешанными типами автоматически приводит целые числа к числам с плавающей точкой:

>>> 3 + 0.5
3.5

Составное присваивание объединяет оператор с = для компактного обновления на месте:

counter = 0
counter += 1                # equivalent to counter = counter + 1
counter *= 2                # works for *= /= //= %= **= too

Приоритет операторов следует обычному порядку: сначала **, затем унарный -, затем *, /, // и %, затем + и -. Используйте скобки, когда не уверены – во время выполнения они ничего не стоят.

2.3.2. Сравнение

Операторы сравнения возвращают bool (True или False):

  • == и != – равно / не равно.

  • <, <=, >, >= – упорядочивание.

>>> 3 == 3
True
>>> 3 == 3.0
True
>>> 3 < 5 <= 5
True

Последний пример – это цепочечное сравнение, которое в точности эквивалентно 3 < 5 and 5 <= 5.

Предупреждение

= присваивает; == сравнивает. Выражение if x = 5: является синтаксической ошибкой именно потому, что Python отказывается молча путать эти две вещи.

2.3.3. Логические операции

Три оператора объединяют логические значения:

  • andTrue только тогда, когда обе стороны истинны.

  • orTrue, когда истинна хотя бы одна из сторон.

  • not – инвертирует одно логическое значение.

and и or используют короткое замыкание: они прекращают вычисление, как только результат становится известен. False and slow_check() никогда не вызывает slow_check.

and и or также возвращают один из своих операндов, а не литерал True или False, что позволяет компактно записывать значения по умолчанию:

name = user_name or "anonymous"   # "" / 0 / None are falsy

2.3.4. Побитовые операторы

Для работы с аппаратурой – упаковки полей регистров, маскирования битов, разбора заголовков протоколов – вы будете использовать побитовые операторы. Они работают с двоичным представлением int:

  • & – побитовое И

  • | – побитовое ИЛИ

  • ^ – побитовое исключающее ИЛИ (XOR)

  • ~ – побитовое НЕ (дополнение до единицы)

  • << – сдвиг влево

  • >> – сдвиг вправо

Шестнадцатеричная и двоичная формы литералов удобны при чтении и записи этих значений:

>>> 0b1100 & 0b1010
8                              # 0b1000
>>> 0b1100 | 0b1010
14                             # 0b1110
>>> 0xFF ^ 0x0F
240                            # 0xF0
>>> 1 << 8
256
>>> (0xABCD >> 8) & 0xFF
171                            # extract the high byte

Для каждого существуют составные формы: |=, &=, ^=, <<=, >>=.

Примечание

and / or работают с логическими значениями (или с истинностью); & / | работают с битами. Не путайте их. 0b1100 and 0b1010 вычисляется как 0b1010, потому что оба операнда истинны – а это обычно не то, что нужно при манипуляции битами.

2.3.5. Полезные встроенные функции для чисел

Небольшой набор встроенных функций покрывает распространённые числовые операции, которые сами по себе операторы не выполняют:

  • round() – ближайшее целое число или ближайшее значение с точностью до ndigits знаков после запятой, если задан второй аргумент. Возвращает int для round(x) и float для round(x, n). Промежуточные значения (0.5, 1.5, …) округляются к ближайшему чётному числу, а не всегда вверх.

  • divmod() – возвращает (quotient, remainder) за один вызов. Удобно для разбиения одной величины на единицы (секунд на минуты и секунды, байтов на страницы и смещения).

  • pow() – то же, что ** в форме с двумя аргументами. Форма с тремя аргументами pow(base, exp, mod) вычисляет (base ** exp) % mod, ни разу не материализуя гигантское промежуточное значение, что является единственным практичным способом выполнять модульное возведение в степень для больших показателей.

>>> round(3.7)
4
>>> round(3.14159, 2)
3.14
>>> round(0.5)               # ties go to even, not always up
0
>>> round(1.5)
2

>>> divmod(125, 60)          # 125 seconds = 2 min, 5 sec
(2, 5)
>>> minutes, seconds = divmod(125, 60)

>>> pow(3, 4)                # same as 3 ** 4
81
>>> pow(3, 100, 7)           # (3 ** 100) mod 7, efficient
4

Преобразования целых чисел в строки по основанию системы счисления (bin, oct, hex) рассматриваются в Методы строк и форматирование.

2.3.6. Модуль math

Распространённые математические функции находятся в модуле math. Импортируйте его один раз и вызывайте его функции через точечное имя:

import math

print(math.sqrt(2))              # 1.4142135
print(math.sin(math.pi / 2))     # 1.0
print(math.floor(3.7))           # 3
print(math.log(100, 10))         # 2.0

Модуль math в MicroPython покрывает обычный набор (sqrt, exp, log, sin, cos, tan, atan2, floor, ceil, pi, e, …). Для случайных чисел см. модуль random; для манипуляций битами с фиксированной точкой обычно достаточно операторов, описанных выше.

2.3.7. Комплексные числа

Для численных расчётов, требующих мнимых компонентов, в Python есть тип complex с литералами, имеющими суффикс j (1 + 2j). Модуль cmath повторяет math для комплексных входных данных. Оба присутствуют в большинстве сборок MicroPython, но редко нужны для работы с камерой; мы упоминаем их в основном для того, чтобы они не стали неожиданностью, если вы переносите код, который их использует.