Python як калькулятор: оператори, math і змінні
Перше, що робить кожен студент у Python, — рахує. І саме тут ховаються сюрпризи: чому 7 // 2 дорівнює 3, а −7 // 2 — уже −4, чому 0.1 + 0.2 не 0.3 і чому sin(30) — не одна друга. Розбираємо оператори, модуль math, змінні й введення даних.

Сім арифметичних операторів
| Оператор | Дія | Приклад | Результат |
|---|---|---|---|
+ | Додавання | 7 + 2 | 9 |
- | Віднімання | 7 - 2 | 5 |
* | Множення | 7 * 2 | 14 |
/ | Ділення | 7 / 2 | 3.5 |
// | Цілочислове ділення | 7 // 2 | 3 |
% | Залишок від ділення | 7 % 2 | 1 |
** | Піднесення до степеня | 7 ** 2 | 49 |
Чотири моменти варто розібрати окремо — саме на них найчастіше помиляються.
Звичайне ділення / завжди дає дробове число (тип float), навіть якщо ділиться націло: 10 / 5 — це 2.0, а не 2.
// округлює вниз, а не відкидає дробову частину. Для додатних чисел різниці не видно, для від’ємних — є:
>>> 7 // 2
3
>>> -7 // 2
-4
>>> -7 % 2
1−3,5 округлюється вниз до −4, а залишок підлаштовується так, щоб виконувалася рівність a == (a // b) * b + a % b: (−4) · 2 + 1 = −7. Знак залишку збігається зі знаком дільника.
** — це степінь, а ^ — ні. Звичний із калькуляторів запис 2^3 у Python означає побітову операцію «виключне АБО» й дає 1 без жодного попередження:
>>> 2 ** 3
8
>>> 2 ^ 3
1Дробові числа наближені. 0.1 + 0.2 дає 0.30000000000000004: більшість десяткових дробів неможливо точно записати у двійковому вигляді. Це не вада Python — так рахують процесори в усіх мовах. Дробові значення порівнюють не через ==, а функцією math.isclose(0.1 + 0.2, 0.3), яка дає True.
Пріоритет: що рахується першим
Python дотримується математичних правил, але з кількома особливостями. Від старшого до молодшого:
| Пріоритет | Операції | Приклад |
|---|---|---|
| 1 | Дужки ( ) | (2 + 3) * 4 → 20 |
| 2 | Степінь ** — справа наліво | 2 ** 3 ** 2 → 512 |
| 3 | Унарний мінус -x | -2 ** 2 → -4 |
| 4 | * / // % — зліва направо | 2 + 3 * 4 → 14 |
| 5 | + - — зліва направо | 10 - 4 - 3 → 3 |
Два результати дивують найчастіше. 2 ** 3 ** 2 — це 2⁹ = 512, а не 8² = 64: степені рахуються справа наліво. -2 ** 2 — це −(2²) = −4, бо степінь старший за унарний мінус. Якщо сумніваєтеся, ставте дужки: зайві дужки не шкодять, а вираз читається легше.
Модуль math
Для складніших обчислень у стандартній бібліотеці є модуль math. Його підключають один раз — командою import math — і далі звертаються до функцій через крапку:
>>> import math
>>> math.cos(0.123) + math.sin(0.321)
1.3079606707279208| Функція | Що обчислює | Приклад → результат |
|---|---|---|
math.sqrt(x) | Квадратний корінь | math.sqrt(2) → 1.4142135623730951 |
math.exp(x) | e в степені x | math.exp(1) → 2.718281828459045 |
math.log(x) | Натуральний логарифм ln x | math.log(math.e) → 1.0 |
math.log10(x) | Десятковий логарифм lg x | math.log10(1000) → 3.0 |
math.sin(x), math.cos(x) | Синус, косинус (x у радіанах) | math.cos(0) → 1.0 |
math.radians(x) | Градуси → радіани | math.radians(180) → 3.141592653589793 |
math.factorial(n) | Факторіал n! | math.factorial(5) → 120 |
math.floor(x), math.ceil(x) | Округлення вниз / вгору | math.floor(-2.5) → -3 |
math.pi, math.e | Константи π і e | math.pi → 3.141592653589793 |
math.sin(30) — це синус 30 радіан, тобто −0.988…, а не 0.5. Для градусів спершу переведіть кут: math.sin(math.radians(30)) дає 0.49999999999999994 — ті самі 0,5 з похибкою дробових чисел.Корінь і логарифм мають область визначення. math.sqrt(-1) і math.log(0) завершуються помилкою ValueError (у Python 3.12 — з текстом math domain error, у новіших версіях повідомлення детальніше). Це не збій, а сигнал: для таких даних вираз не має дійсного значення.
Повний перелік функцій — у документації модуля: docs.python.org/3/library/math.html.
Змінні: імена для значень
Щоб не повторювати числа в кожному виразі, значення зберігають у змінних. Присвоєння записують одним знаком =: зліва — ім’я, справа — вираз, який обчислюється першим.
>>> a = 3
>>> b = 4
>>> c = a ** 2 + b ** 2
>>> c
25
>>> a = a + 1
>>> a
4Запис a = a + 1 з погляду математики абсурдний, а для Python цілком звичайний: спочатку обчислюється права частина (3 + 1), потім результат отримує ім’я a. Тому = читають не «дорівнює», а «присвоїти». Щоб просто побачити значення змінної, у REPL достатньо набрати її ім’я, у програмі — print(c).
У класичному описі змінна — пойменована ділянка пам’яті з типом і значенням. Для Python точніша інша модель: значення (об’єкт) живе в пам’яті окремо, а змінна — це ім’я, прив’язане до нього. Тип має саме об’єкт, тому одне ім’я в різний час може вказувати на значення різних типів:
>>> x = 10
>>> type(x)
<class 'int'>
>>> x = "десять"
>>> type(x)
<class 'str'>Це динамічна типізація: оголошувати тип заздалегідь не потрібно. Водночас типізація в Python сильна — несумісні типи самі собою не змішуються:
>>> "12" + 30
Traceback (most recent call last):
...
TypeError: can only concatenate str (not "int") to strВідповідальність за те, що лежить у змінній, — на програмісті, а функція type() швидко показує, з чим ви насправді працюєте.
Правила імен. Ім’я складається з літер, цифр і підкреслення, не починається з цифри й не збігається із зарезервованими словами (if, for, class…). Регістр важливий: Hip і hip — різні змінні. Технічно Python 3 дозволяє навіть кирилицю, але домовленість (стиль PEP 8) — латиниця і snake_case: my_hip, а не myHip чи ціна.
Типи й введення даних
Для першої лабораторної досить трьох типів: int — цілі числа, float — дробові (з крапкою: 3.5, а не 3,5), str — рядки тексту в лапках.
Функція input() завжди повертає рядок — навіть якщо користувач набрав цифри. Тому перед обчисленнями введене перетворюють:
>>> "12" + "30"
'1230'
>>> int("12") + int("30")
42
>>> float("3.5")
3.5
>>> int("3.5")
Traceback (most recent call last):
...
ValueError: invalid literal for int() with base 10: '3.5'Тепер програма з IDLE з попереднього уроку читається рядок за рядком:
a = int(input("Enter num1 -> "))— показати підказку, прочитати рядок, перетворити на ціле число, назвати результатa. Вкладені виклики виконуються зсередини назовні.s = a + b,d = a - b,m = a * b— проміжні результати лінійного алгоритму.v = a / b— ділення даєfloat; якщо ввестиb = 0, програма зупиниться зZeroDivisionError.print(s, d, m, v, sep="; ")— вивести кілька значень; параметрsepзадає роздільник між ними (за замовчуванням — пробіл).
float(input(...)): int на введенні 2.5 завершиться помилкою ValueError.Гіпотенуза двома способами
Фінальна вправа практичної частини — програма, що обчислює гіпотенузу прямокутного трикутника за теоремою Пифагора і готовою функцією модуля math:
import math
a = float(input("Катет a: "))
b = float(input("Катет b: "))
my_hip = math.sqrt(a ** 2 + b ** 2) # за формулою c = √(a² + b²)
h = math.hypot(a, b) # готова функція
print(my_hip, h, sep=" ")Для катетів 3 і 4 обидва способи дадуть 5.0 5.0, для 5 і 12 — 13.0 13.0. Навіщо тоді hypot? Вона акуратніше рахує на крайніх значеннях: проміжне a ** 2 для дуже великого числа просто не вміщується у float.
>>> math.sqrt(1e200 ** 2 + 1e200 ** 2)
Traceback (most recent call last):
...
OverflowError: (34, 'Result too large')
>>> math.hypot(1e200, 1e200)
1.414213562373095e+200(Текст після коду 34 залежить від операційної системи.) На звичайних даних обидва способи збігаються, а вбудована функція додатково захищає від переповнення — саме це й варто помітити, коли порівнюєте результати.
IndentationError: unexpected indent. Відступи ставлять лише всередині блоків if, for, while і функцій.Міні-курс Python з нуля
Усі матеріали курсу по порядку. Програма, завдання лабораторної та інформація про авторку — на головній сторінці курсу.
- Урок 1 · 9 хвАлгоритм і блок-схемиВластивості алгоритму, способи запису, базові блоки й три структури — лінійна, розгалужена, циклічна — з кодом Python.
- Урок 2 · 8 хвЯк Python виконує кодКомпілятор проти інтерпретатора, байткод, встановлення Python 3.12+, REPL, «Дзен Python» і перша програма в IDLE.
- Урок 3 · 9 хв · ви тутPython як калькуляторСім арифметичних операторів і пріоритети, модуль math, змінні, типи даних і перетворення введення.
- Практика · 10 хвЛабораторна робота №1 покроковоОбидва завдання на прикладах, переклад формул у Python, перевірка ОДЗ, чекліст звіту й контрольні запитання.
Перевір себе
/ — звичайне ділення, завжди дає float (7 / 2 = 3.5). // — цілочислове ділення з округленням униз (7 // 2 = 3, −7 // 2 = −4).
Оператором ** (2 ** 3 = 8) або функцією math.pow. Символ ^ — це побітове «виключне АБО», а не степінь.
Тригонометричні функції модуля math приймають кут у радіанах. Для градусів використовуйте math.sin(math.radians(30)).
Присвоєння — один знак = (x = 5), порівняння — два (==). Вивести значення — print(x); у REPL достатньо набрати ім’я змінної.
Далі: лабораторна робота №1
Теорію пройдено — виконуємо обидва завдання й збираємо звіт. Перейти до лабораторної