Міні-курс «Python з нуля» · Урок 3

Python як калькулятор: оператори, math і змінні

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

Крок 3 з 4·Авторка: Марина Мальцева·9 хв читання
Python як калькулятор — урок 3 міні-курсу «Python з нуля»

Сім арифметичних операторів

ОператорДіяПрикладРезультат
+Додавання7 + 29
-Віднімання7 - 25
*Множення7 * 214
/Ділення7 / 23.5
//Цілочислове ділення7 // 23
%Залишок від ділення7 % 21
**Піднесення до степеня7 ** 249

Чотири моменти варто розібрати окремо — саме на них найчастіше помиляються.

Звичайне ділення / завжди дає дробове число (тип 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) * 420
2Степінь ** — справа наліво2 ** 3 ** 2512
3Унарний мінус -x-2 ** 2-4
4* / // % — зліва направо2 + 3 * 414
5+ - — зліва направо10 - 4 - 33

Два результати дивують найчастіше. 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 в степені xmath.exp(1)2.718281828459045
math.log(x)Натуральний логарифм ln xmath.log(math.e)1.0
math.log10(x)Десятковий логарифм lg xmath.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Константи π і emath.pi3.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 залежить від операційної системи.) На звичайних даних обидва способи збігаються, а вбудована функція додатково захищає від переповнення — саме це й варто помітити, коли порівнюєте результати.

Зайвий відступ — теж помилка. Якщо рядок програми випадково почати з пробілів (так буває після копіювання з документа), Python не виконає файл узагалі й повідомить IndentationError: unexpected indent. Відступи ставлять лише всередині блоків if, for, while і функцій.

Міні-курс Python з нуля

Усі матеріали курсу по порядку. Програма, завдання лабораторної та інформація про авторку — на головній сторінці курсу.

  1. Урок 1 · 9 хвАлгоритм і блок-схемиВластивості алгоритму, способи запису, базові блоки й три структури — лінійна, розгалужена, циклічна — з кодом Python.
  2. Урок 2 · 8 хвЯк Python виконує кодКомпілятор проти інтерпретатора, байткод, встановлення Python 3.12+, REPL, «Дзен Python» і перша програма в IDLE.
  3. Урок 3 · 9 хв · ви тутPython як калькуляторСім арифметичних операторів і пріоритети, модуль math, змінні, типи даних і перетворення введення.
  4. Практика · 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

Теорію пройдено — виконуємо обидва завдання й збираємо звіт. Перейти до лабораторної

Сподобалось? Поділіться — це найкраща підтримка

Розбори кіберзагроз від SEOWORK

Одна практична стаття на тиждень — як не купитися на фішинг, захистити акаунти й дані. У подарунок одразу памʼятка у PDF.