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, але рідко потрібні для роботи з камерою; вони згадуються переважно для того, щоб не стати несподіванкою при перенесенні коду, який їх використовує.