Вирази, оператори, введення і перетворення типів
Вирази, оператори, введення і перетворення типів
Програма, що рахує за вас
Досі програми лише виводили готовий текст. Тепер вони навчаться обчислювати: брати числа від користувача, виконувати дії та показувати результат. Для цього потрібні три речі: вирази й оператори, функція введення input і перетворення типів, бо введене користувачем Python завжди сприймає як текст.
🎯 Мета лекції
- Записувати арифметичні вирази й знати пріоритет операторів.
- Розрізняти
/,//,%і**, зокрема з від'ємними числами. - Користуватися скороченими операторами (
+=та іншими). - Читати введення через
input()і перетворювати його на число. - Форматувати вивід за допомогою f-рядків.
🔑 Ключові терміни
- Вираз (expression): код, який має значення (
2 + 3). - Інструкція (statement): код, який виконує дію (
x = 2 + 3). - Оператор: символ дії:
+,-,*,/,//,%,**. - Приведення типів (type conversion): створення об'єкта іншого типу з наявного.
- f-рядок: рядок з виразами у фігурних дужках.
Пригадаємо попередній урок
x на нього. Старе число не змінюється.== порівнює значення, is перевіряє, чи це один і той самий об'єкт.Вирази та інструкції
Вираз (expression) — частина коду, яка має значення: 2 + 3, x * 4, len("abc"). Python обчислює вираз і отримує об'єкт.
Інструкція (statement) — рядок, який щось виконує: x = 2 + 3, print(x). Інструкція може містити вирази. Правило для розрізнення: вираз можна вставити всередину print(...), а інструкцію — ні.
print(2 + 3)
x = 2 + 3
print(x)
5
5
Арифметичні оператори
| Оператор | Дія | Приклад | Результат |
|---|---|---|---|
+ | додавання | 7 + 2 | 9 |
- | віднімання | 7 - 2 | 5 |
* | множення | 7 * 2 | 14 |
/ | ділення | 7 / 2 | 3.5 |
// | ділення націло | 7 // 2 | 3 |
% | остача від ділення | 7 % 2 | 1 |
** | піднесення до степеня | 7 ** 2 | 49 |
Оператор / завжди повертає float, навіть коли ділення без остачі: 10 / 2 дорівнює 5.0. Для цілого результату використовують //.
Пріоритет операторів
Вираз Python будує як дерево: спершу виконуються операції з вищим пріоритетом. Порядок такий:
**(степінь);- унарний мінус (
-x); *,/,//,%;+,-.

Дужки змінюють порядок:
print(2 + 3 * 4)
print((2 + 3) * 4)
print(2 ** 3 ** 2)
print(-2 ** 2, (-2) ** 2)
14
20
512
-4 4
Дві особливості: ** виконується справа наліво (2 ** 3 ** 2 це 2 ** 9), а мінус нижчий за степінь: -2 ** 2 — це -(2 ** 2). Якщо порядок неочевидний, ставте дужки.
Ділення націло і остача
Оператор // повертає цілу частку, % — остачу. Для додатних чисел це очевидно: 7 // 2 дорівнює 3, 7 % 2 дорівнює 1. Корисні застосування:
- парність:
n % 2дорівнює0для парних чисел; - розбиття на одиниці й десятки:
47 // 10дає4,47 % 10дає7; - перерахунок одиниць: секунди в години, хвилини й секунди.
З від'ємними числами Python ділить із округленням униз (до меншого цілого), а не до нуля:
print(-7 // 2, -7 % 2)
print(7 // -2, 7 % -2)
print(divmod(-7, 2))
-4 1
-4 -1
(-4, 1)
Результат -7 / 2 дорівнює -3.5, і округлення вниз дає -4, а не -3. Остача підбирається так, щоб виконувалась рівність -7 = 2 · (-4) + 1.

Функція divmod(a, b) повертає частку й остачу разом. Знак остачі збігається зі знаком дільника: -7 % 2 дорівнює 1, а 7 % -2 дорівнює -1.
ZeroDivisionError для /, // і %: 10 / 0 завершується повідомленням ZeroDivisionError: division by zero.Скорочені оператори
Дію над змінною та присвоєння результату тій самій змінній записують коротко:
| Скорочено | Те саме, що |
|---|---|
x += 5 | x = x + 5 |
x -= 3 | x = x - 3 |
x *= 2 | x = x * 2 |
x //= 5 | x = x // 5 |
x **= 2 | x = x ** 2 |
x %= 7 | x = x % 7 |
Для незмінних типів (int, float, str) такий запис створює новий об'єкт, як і x = x + 1 з минулого уроку. Перевірте на рядках: += склеює рядки, але другу змінну не змінює.
Рядок word += "c" створив новий рядок "abc" і переніс на нього word. Об'єкт "ab" лишився за copy.
Введення: input()
Функція input() зупиняє програму, чекає, поки користувач введе рядок і натисне Enter, і повертає введене як рядок (str). Аргумент input — підказка, яка виводиться перед введенням:
name = input("Ваше ім'я: ")
print("Привіт,", name)
Головна особливість: input() завжди повертає str, навіть якщо користувач ввів число. Тому арифметика над введенням без перетворення не працює:
x = input("n: ")
print(x + 1)
TypeError: can only concatenate str (not "int") to str
Для рядка "5" оператор + означає склеювання, а склеїти рядок із числом Python не може. Оператор * із рядком означає повторення: "5" * 3 дає "555".
Перетворення типів
Щоб отримати число з рядка, використовують функції-перетворювачі: int(), float(), str(), bool(). Кожна створює новий об'єкт потрібного типу, а початковий не змінює.

print(int("42"), int(" 42 "), float("3.14"), float(3), str(42))
print(int(3.9), int(-3.9))
42 42 3.14 3.0 42
3 -3
- Пробіли навколо числа в рядку допустимі.
int()від дробу відкидає дробову частину (до нуля), а не округлює:int(3.9)дорівнює3.round(x)округлює до найближчого цілого,round(x, n)— доnзнаків.
Простежте повний цикл у трасувальнику: input повертає рядок, int створює окремий об'єкт-число.
На схемі після рядка number = int(raw) лежать два різні об'єкти: рядок '41' і число 41. Рядок raw залишився без змін.
Що може піти не так
Не кожен рядок можна перетворити. Якщо вміст не схожий на число, Python викликає ValueError:
int("3.5")
ValueError: invalid literal for int() with base 10: '3.5'
Рядок "3.5" — це не ціле число, тому int його відхиляє, і це правильна поведінка: Python не здогадується, що користувач мав на увазі. Правильний шлях для дробу: float("3.5"), а потім за потреби int(...). Інші типові помилки:
| Код | Результат |
|---|---|
int("abc") | ValueError: invalid literal for int() with base 10: 'abc' |
int("") | ValueError: invalid literal for int() with base 10: '' |
float("1,5") | ValueError: could not convert string to float: '1,5' |
int(None) | TypeError: int() argument must be a string, a bytes-like object or a real number, not 'NoneType' |
Для дробів Python чекає крапку, а не кому. Як перехоплювати такі помилки й просити користувача ввести дані ще раз, розглянемо в уроці про винятки.
bool() і неявні перетворення
bool() повертає False для нуля, порожнього рядка та порожніх колекцій, а в решті випадків True. Важлива деталь: непорожній рядок завжди істинний, навіть "0" та "False":
print(bool(0), bool(0.0), bool(""), bool("0"), bool("False"))
False False False True True
Іноді Python перетворює типи сам. Це неявне перетворення, і воно відбувається лише там, де результат однозначний:
print(1 + 2.0)
print(True + 1)
3.0
2
int у змішаному виразі з float перетворюється на float, bool — на int. Рядок із числом так не змішується: "5" + 5 завершується TypeError.
f-рядки
f-рядок (f-string) — рядок із літерою f перед лапками. Вирази у фігурних дужках обчислюються й підставляються:
name, age = "Олена", 20
print(f"{name} має {age} років")
print(f"Через рік: {age + 1}")
print(f"{age=}")
Олена має 20 років
Через рік: 21
age=20
Після двокрапки в дужках задають формат:
| Запис | Результат | Опис |
|---|---|---|
{3.14159:.2f} | 3.14 | два знаки після крапки |
{1234567:,} | 1,234,567 | роздільник розрядів |
{42:05d} | 00042 | ширина 5, нулі зліва |
{0.256:.1%} | 25.6% | відсотки |
{"Олена":>8} | Олена | вирівнювання праворуч |
{"Олена":<8} | Олена | ліворуч |
{"Олена":^8} | Олена | по центру |
Щоб вивести фігурну дужку, її подвоюють: f"{{текст}}" дає {текст}.
Приклад: калькулятор гіпотенузи
Об'єднаємо все: введення, перетворення, вираз і форматований вивід.
a = float(input("Катет a: "))
b = float(input("Катет b: "))
c = (a ** 2 + b ** 2) ** 0.5
print(f"Гіпотенуза: {c:.2f}")
Порядок дій: input повертає рядки, float перетворює їх на числа, вираз обчислює корінь через степінь 0.5, f-рядок виводить результат із двома знаками.
Підсумок
- Вираз має значення, інструкція виконує дію. Пріоритет:
**, унарний-,* / // %,+ -. /завжди даєfloat,//ділить націло з округленням вниз,%дає остачу зі знаком дільника.- Скорочені оператори (
+=та інші) для незмінних типів створюють новий об'єкт. input()завжди повертаєstr.int(),float(),str(),bool()створюють новий об'єкт.int("3.5")—ValueError,int(3.9)—3.- f-рядок підставляє вирази й форматує вивід:
{x:.2f},{n:05d}.
Типові хибні уявлення
input() завжди повертає str. Число отримують через int() або float().int() відкидає дробову частину: int(3.9) дорівнює 3, int(-3.9) дорівнює -3. Для округлення використовують round().// округлює вниз, тому результат -4."0" та "False": bool("0") дорівнює True.Передбачте, перш ніж запускати
print(17 // 5, 17 % 5, -17 // 5, -17 % 5)
3 2 -4 3
17 = 5 · 3 + 2, а -17 = 5 · (-4) + 3.
print(2 + 3 * 4 ** 2)
50
Спершу 4 ** 2 дорівнює 16, потім 3 * 16 дорівнює 48, потім 2 + 48 дорівнює 50.
Користувач вводить 5:
x = input()
print(x * 3)
print(int(x) * 3)
555
15
Рядок "5" повторюється тричі, а число 5 множиться.
print(int("7") + float("0.5"))
7.5
Сума int і float — це float.
Практичні завдання
Разом: 149.97 грн.price = float(input("Ціна: "))
qty = int(input("Кількість: "))
print(f"Разом: {price * qty:.2f} грн")
01:02:05. Для 3725 результат має бути 01:02:05.total = int(input("Секунд: "))
hours, rest = divmod(total, 3600)
minutes, seconds = divmod(rest, 60)
print(f"{hours:02d}:{minutes:02d}:{seconds:02d}")
01:02:05
47 результат 11.n = int(input("Число: "))
print(n // 10 + n % 10)
0, якщо введене число парне, і 1, якщо непарне. Умовні конструкції не використовуйте.n = int(input("Число: "))
print(n % 2)
Для від'ємних чисел результат теж правильний: -3 % 2 дорівнює 1.
and, or, not, if і elif, match.Змінні — імена, посилання, ідентичність
Змінна в Python — це ім'я, яке вказує на об'єкт у пам'яті, а не комірка зі значенням. Присвоєння, перепризначення, дві змінні на один об'єкт, лічильник посилань, різниця між is та ==, обмін значень і правила іменування.
Логіка та розгалуження
Порівняння та ланцюжки порівнянь, логічні оператори and, or, not з коротким замиканням, істинність значень, розгалуження if, elif, else, умовний вираз та інструкція match.