Об'єкти, значення і типи
Об'єкти, значення і типи
Що лежить у пам'яті, коли ви пишете 42
У попередньому уроці print виводив текст. Тепер розглянемо самі дані: що таке "Hello", 42 чи 3.14 з точки зору Python. Кожне таке значення зберігається в пам'яті як об'єкт (object) — структура, яка містить не лише значення, а й відомості про нього. Від цього залежить, що можна робити зі значенням: числа додають, тексти склеюють, а додати число до тексту не можна.
🎯 Мета лекції
- Пояснити, що в Python усе є об'єктом із типом, ідентичністю та значенням.
- Визначати тип значення функцією
type(). - Записувати числа в різних системах числення.
- Знати, чим
intвідрізняється відfloatі чому0.1 + 0.2не дорівнює0.3. - Розуміти, що
bool— це різновидint, аNoneіснує в єдиному екземплярі.
🔑 Ключові терміни
- Літерал: значення, записане безпосередньо в коді (
42,"текст"). - Об'єкт: значення в пам'яті з типом та ідентичністю.
- Тип (type): що це за значення й що з ним можна робити.
- Ідентичність (identity,
id): номер, що відрізняє об'єкт від інших. - IEEE 754: стандарт зберігання дробових чисел.
Пригадаємо попередній урок
None. print лише виводить текст.print("a", "b", sep="-") вивід — a-b. Параметр sep задає роздільник між аргументами."\n" один символ: len("\n") дорівнює 1.Усе в Python — об'єкт
Літерал (literal) — значення, записане прямо в коді: 42, 3.14, "Привіт". Коли Python виконує літерал, він створює в пам'яті об'єкт. Кожен об'єкт має три характеристики:
- тип — вид значення (
int,strтощо); - ідентичність — число, яке відрізняє цей об'єкт від інших, поки він існує;
- значення — власне дані.

Тип показує функція type(), ідентичність — функція id():
x = 42
print(type(x))
print(type(id(x)))
print(id(x) == id(x))
<class 'int'>
<class 'int'>
True
id() повертає ціле число. Його значення відрізняється між запусками та комп'ютерами, тому порівнювати треба лише id одного й того самого об'єкта. Зараз x = 42 лише показує, що значення можна зберегти під іменем. Детально про імена йтиметься в наступному уроці.
Основні типи
У цьому курсі ми почнемо з п'яти типів:
| Тип | Що зберігає | Приклад |
|---|---|---|
int | цілі числа | 42, -5, 0 |
float | дробові числа | 3.14, -0.4 |
str | текст | "Привіт" |
bool | істина або хиба | True, False |
NoneType | «немає значення» | None |

Тип визначає форма літерала. Наявність крапки перетворює ціле на дробове:
print(type(4))
print(type(4.0))
print(type(.4))
print(type("4"))
<class 'int'>
<class 'float'>
<class 'float'>
<class 'str'>
Значення 4, 4.0 і "4" виглядають схоже, але це три різні об'єкти різних типів. Вираз із числом і дробом дає дріб: type(1 + 2.0) — це float.
"4" — рядок, а не число. "4" + "4" дає "44", а 4 + 4 дає 8. Python визначає операцію за типом, а не за виглядом значення.Цілі числа
Літерал int — це цифри без дробової частини. Для зручності читання між цифрами можна ставити підкреслення: 1_000_000 — те саме, що 1000000. Від'ємні числа мають мінус: -50.
Особливість Python: цілі числа не мають верхньої межі (обмеженої лише пам'яттю). Математичні операції з великими числами працюють без спеціальних дій:
print(2**100)
print(2**1000 > 10**300)
1267650600228229401496703205376
True
У багатьох мовах (C, Java) int займає фіксовану кількість байтів, і число більше за межу «переповнюється». У Python int зберігається як список «цифр» за основою 2³⁰ (приблизно мільярд), і список стає довшим. Число 2**100 займає чотири такі цифри.

Звідси наслідок: об'єкт великого числа займає більше пам'яті. Функція sys.getsizeof показує розмір об'єкта в байтах:
import sys
print(sys.getsizeof(1))
print(sys.getsizeof(2**100))
print(sys.getsizeof(2**1000))
28
40
160
Системи числення
Одне й те саме число можна записати по-різному. Python підтримує чотири системи:
| Система | Префікс | Цифри | Число 83 |
|---|---|---|---|
| десяткова | немає | 0–9 | 83 |
| двійкова | 0b | 0, 1 | 0b1010011 |
| вісімкова | 0o | 0–7 | 0o123 |
| шістнадцяткова | 0x | 0–9, A–F | 0x53 |
print(0b101010, 0o123, 0x123, 0xFF)
print(bin(42), oct(83), hex(291))
print(int("101010", 2), int("ff", 16))
42 83 291 255
0b101010 0o123 0x123
42 255
Літерали 0b…, 0o…, 0x… записують число в потрібній системі. Функції bin(), oct(), hex() повертають текстовий запис числа в цій системі. Функція int(рядок, основа) виконує зворотне перетворення. Усі чотири записи — це одне й те саме число, змінюється лише форма запису. Двійкова система використовується для бітів, шістнадцяткова — для кольорів і адрес у пам'яті.
Дробові числа
Літерал float містить крапку, а не кому: 2.5, -0.4. Нулі можна не писати: .4 означає 0.4, а 4. означає 4.0. Дуже великі й малі числа записують в експоненційній формі: 3e8 означає 3 · 10⁸.
print(3e8)
print(6.62607E-34)
print(7 / 2, 7 // 2)
300000000.0
6.62607e-34
3.5 3
Звичайне ділення / завжди дає float, цілочисельне // — int (для цілих операндів).
Чому 0.1 + 0.2 не дорівнює 0.3
print(0.1 + 0.2)
print(0.1 + 0.2 == 0.3)
0.30000000000000004
False
Це не помилка Python. Комп'ютер зберігає float у двійковому вигляді за стандартом IEEE 754: 64 біти поділено на знак, експоненту й мантису. Число 0.1 у двійковому записі нескінченне (як 1/3 у десятковому), тому в мантису поміщається лише наближене значення:
print(f"{0.1:.30f}")
0.100000000000000005551115123126

Під час додавання дві такі невеликі похибки складаються, і результат трохи відхиляється від 0.3. Така поведінка властива всім мовам, які використовують IEEE 754: JavaScript, Java, C. Числа, що є степенями двійки (наприклад, 0.5 і 0.25), зберігаються точно.
==. Для порівняння використовують допустиму похибку, наприклад math.isclose(a, b):import math
print(math.isclose(0.1 + 0.2, 0.3))
True
decimal.bool і None
bool має лише два значення: True і False. Особливість Python: bool — це підтип int, причому True дорівнює 1, а False дорівнює 0.
print(True + True)
print(isinstance(True, int))
print(bool(0), bool(""), bool("a"), bool([]), bool(-1))
2
True
False False True False True
Функція bool() перетворює значення на True чи False. Хибними (False) є 0, порожній рядок, порожній список і None. Решта значень — істинні. Це знадобиться в уроці про логіку.
None — спеціальний об'єкт, який означає «значення відсутнє». Протягом усієї програми існує лише один об'єкт None, тому його перевіряють через is:
print(None is None)
print(type(None))
True
<class 'NoneType'>

Підсумок
- Усі значення в Python — об'єкти з типом, ідентичністю та значенням.
type()показує тип,id()— ідентичність.- Тип визначає, що можна робити зі значенням:
4,4.0і"4"— різні об'єкти. intне має верхньої межі: він зберігається як список 30-бітних цифр.floatзберігається за стандартом IEEE 754, тому0.1 + 0.2не дорівнює0.3. Дроби порівнюють із допустимою похибкою.bool— підтипint,None— єдиний об'єкт типуNoneType.
Типові хибні уявлення
math.isclose."42" — рядок. З ним працюють текстові операції: "42" + "1" дає "421", а не 43.int росте, поки вистачає пам'яті.True + True дорівнює 2, бо bool — підтип int.Передбачте, перш ніж запускати
print(type(2 * 3.0))
print(type(10 // 5))
print(type(10 / 5))
print(type("5" + "5"))
<class 'float'>
<class 'int'>
<class 'float'>
<class 'str'>
Добуток int і float — це float. Ділення / завжди дає float, // для цілих — int. Додавання двох рядків склеює їх, результат — str.
print(True + 1)
print(0b1010 + 0o10 + 0x10)
2
34
True дорівнює 1. Другий вираз: 10 + 8 + 16 = 34.
Практичні завдання
255 у двійковій і шістнадцятковій системах за допомогою функцій. Потім за допомогою int() поверніть число 101010 з двійкового запису.print(bin(255))
print(hex(255))
print(int("101010", 2))
0b11111111
0xff
42
2**64 і порівняйте його з 10**19. Який вираз більший? Скільки цифр у 2**1000?print(2**64)
print(2**64 > 10**19)
print(len(str(2**1000)))
18446744073709551616
True
302
0.1 * 3 числу 0.3. Виведіть результат порівняння через == та через math.isclose.import math
print(0.1 * 3 == 0.3)
print(math.isclose(0.1 * 3, 0.3))
False
True
float(2**53) і float(2**53 + 1). Порівняйте їх. Що це означає для великих цілих чисел, збережених як float?print(float(2**53) == float(2**53 + 1))
True
Мантиса float має 52 біти, тому після 2**53 послідовні цілі числа вже не відрізняються. Для точних цілих використовують int.
is і ==, і чому b = a не копіює значення.Перша програма і функція print
Перша програма на Python, виклик функції, позиційні та ключові аргументи, параметри sep і end, коментарі, рядкові літерали та екранування. Як читати перші повідомлення про помилки SyntaxError і NameError.
Змінні — імена, посилання, ідентичність
Змінна в Python — це ім'я, яке вказує на об'єкт у пам'яті, а не комірка зі значенням. Присвоєння, перепризначення, дві змінні на один об'єкт, лічильник посилань, різниця між is та ==, обмін значень і правила іменування.