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. Булева логіка#
Три оператори для об’єднання булевих значень:
and–Trueлише тоді, коли обидві сторони є істинними.or–True, коли будь-яка сторона є істинною.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:
&– побітове І|– побітове АБО^– побітове виключаюче АБО~– побітове НЕ (доповнення до одиниці)<<– зсув вліво>>– зсув вправо
Шістнадцяткові та двійкові літеральні форми зручні при читанні та записі цих операцій:
>>> 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) розглядаються у String methods and formatting.
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, але рідко потрібні для роботи з камерою; вони згадуються переважно для того, щоб не стати несподіванкою при перенесенні коду, який їх використовує.