Глава 6 Типи скалярних даних

⏱️ Час на опанування теми: 25 хвилин

🤷 Для чого ми це вивчаємо:

  • Відрізняти різні типи скалярних даних
  • Вибирати тип скалярних даних відповідно до завдання

🔑 Результати навчання:

  • Створювати змінні з одним з чотирьох основних типів скалярних даних
  • Визначати тип даних скалярного об’єкта
  • Перетворювати один тип скалярних даних на інший

У цій главі ми розберемося з простими типами даних 🇬🇧 data types . Розглянемо ми тільки ті типи даних, які активно використовуються в науці про дані та машинному навчанні, а саме типи int, float, bool та str. Ми навчимося створювати об’єкти з такими типами даних, визначати типи даних об’єктів та змінювати типи з одного на інший.


6.1 ☝ Розбираємось в скалярах

У попередніх главах, ми створювали змінні, які вказували на об’єкти з одним єдиним значенням. Такі об’єкти ми будемо називати скалярами 🇬🇧 scalars .5 Дотепер, ми розглядали скаляри, які містили тільки числові значення 🔢. Цим типом скаляри не обмежуються. Ми можемо також створити скаляри, які будуть містити текстові  🔡 (наприклад: "I love machine learning", "apple") та бульові 🇬🇧 boolean значення (наприклад, True та False). Що таке бульові значення, ми дізнаємось трохи згодом.

В цій главі, ми розберемо тільки найважливіші типи скалярних даних. Тип даних – це те, як мова програмування буде інтерпретувати дані. Наприклад, значення 3.14 може зберігатися в об’єкті з типом, який дозволяє математичне додавання ➕ та віднімання ➖ цього значення. З іншого боку, ми можемо використати тип даних, який дозволить приєднати текст " - це число pi" до цього значення. Але це все згодом, зараз ми повинні запам’ятати чотири основні типи:

  • int: тип даних для цілих чисел
  • float: тип даних для дійсних чисел
  • bool: тип даних для бульових значень
  • str: тип даних для текстових стрічок

Існують ще більш екзотичні, такі як complex, bytes, NoneType, але вони зараз нам не знадобляться. До одного з них ми повернемось у наступних главах, коли він будуть використовуватись. А зараз почнемо ми саме з того, що ми вже бачили – чисел, які представлені у Python типом даних int та float.

6.2 🔢 Використовуємо тип int для цілих чисел

Цілі числа – це ті числа, які не мають дробової частини.6 Наприклад: 0, -112342345, 25 тощо. Число 3.51234 має дробову частину, тому воно вже не ціле. Для зберігання цілих чисел ми будемо використовувати тип даних int.7

Створювати об’єкти з цим типом дуже просто – треба безпосередньо зазначити саме число:

age = 16 # змінна age містить вік студента
age
## 16

Якщо ж ми хочемо зазначити від’ємне число, то нам треба поставити знак - на початку нашого числа:

challenger_deep = -10935 # змінна challenger_deep містить найглибшу точку
                         # на Землі у метрах відносно рівня моря
challenger_deep
## -10935

Тип int ідеально підходить для змінних, які містять кількості: кількість стрибків з парашутом 🪂, кількість квартир в будівлі 🏙️ тощо. Також цей тип підходить для оцінок у школі, віку, поверху квартири тощо.

6.3 ⛵️ Використовуємо тип float для дійсних чисел

Якщо ж число має дробову частину, то ми його можемо представити за допомогою типу float. У Python задля десяткового розділювача використовується крапка . замість звичної для нас коми ,. Іншими словами, число 3,7 буде представлено як 3.7.

🎈 Увага: використання пробілу до або після десяткової крапки викличе помилку!

Створювати скаляри типу float легко, нам треба безпосередньо записати число:

ugly_number = 3.2342523432487324 # змінна ugly_number містить некрасиве число
ugly_number
## 3.2342523432487322

Ми можемо використовувати тип foat, наприклад, для зберігання температури 🌡️ пацієнта 36.6 або ціни 🏷️ 23.99. До речі, ми можемо також зберігати й цілі числа. Для цього ми поставимо крапку і нуль після цілої частини:

nice_number = 25.0 # змінна nice_number містить гарне число
nice_number
## 25.0

З точки зору математики, 25 як мало значення 25, так і матиме. А ось з точки зору програмування 25 та 25.0 є об’єктами з різними типами даних.

6.4 🐂 Використовуємо тип bool для бульових значень

Об’єкти типу bool можуть приймати два значення: або True або False. З англійської, True – істина, False - хибність. Ми використовуємо цей тип скалярів для даних, які можуть прийняти тільки два значення. Наприклад, телевізор 📺 може бути увімкненим або вимкненим. Зараз може бути або день ☀️ або ніч 🌙. Літак ✈️ може прилетіти вчасно або запізнитись.

Розглянемо останній приклад зі змінною, яка містить інформацію чи запізнився літак ✈️. Ми можемо “закодувати” цю змінну наступним чином. Якщо літак запізнився, то вона матиме значення True, якщо ж прилетів вчасно – тоді False. Давайте тепер створимо змінну з ім’ям is_delayed, і запишемо в неї значення, яке відповідає випадку коли літак запізнився, тобто True:

is_delayed = True
is_delayed
## True

Звичайно, ви можете посперечатися, що ту ж саму інформацію можна закодувати за допомогою int. Скажімо, змінна матиме значення 1 коли літак запізнився і 0 коли прилетів вчасно. І це буде непогане рішення, але у такому випад ми можемо зіткнутися з проблемами, коли випадково змінемо значення на, наприклад, 2, яке не матиме сенсу в нашій системі кодування. У випадку, коли ми використовуємо тип bool, це неможливо, тому що тільки два значення можливі – True та False.

До речі, не забувайте що Python чутливий до регістру, тобто він відрізняє великі 🔠 та малі літери 🔡. Тому писати True і False треба саме так, як вони написані: перша велика і всі інші малі літери.

А ось ще один спосіб легко запам’ятати. Пам’ятаєте гру, коли вам на лоб чипляють стікер з ім’ям героя, і вам треба вгадати хто це, ставлячи тільки питання з відповідями так/ні? Те ж саме і з об’єктими з типом bool: вони використовуються для інформації, яка може бути відображенна відповідями так або ні.

6.5 🔤 Використовуємо тип str для текстових стрічок

Також нам знадобиться спеціальний скаляр для зберігання тексту. Такі значення ми будемо називати текстові стрічки або просто стрічки 🇬🇧 strings .8 Під текстовою стрічкою ми розуміємо послідовність символів. Наприклад, ось це Hey! I am a string! – стрічка. І це – a – теж стрічка. Python підтримує усі символи з Юнікоду, тому стрічка може містити також символи з української абетки, наприклад, Я є стрічка.

Щоб створити стрічку, нам треба загорнути текст цієї стрічки у подвійні (") чи одинарні (') лапки. Давайте створимо стрічку за допомогою подвійних лапок:

greetings_en = "Hello!" # подвійні лапки
greetings_en
## 'Hello!'

А тепер за допомогою одинарних лапок:

greetings_ua = 'Вітання!' # одинарні лапки
greetings_ua
## 'Вітання!'

Стрічки – дуже важливі об’єкти та ми можемо робити з ними велку кількість корисного. Проте зараз для нас набагато важливіше побудувати загальне розуміння програмування. Тому ми залишимо більше практичної інформації у Додатку D.

6.6 🪄 Перетворюємо типи

Одна і та сама інформація може зберігатись в об’єктах різних типів. Наприклад, число 2008 (рік нарождення) може зберігатись в об’єкті типу int, float або str. Давайте представимо 2008 за допомогою об’єкта str:

year_str = "2008" # нагадуємо, що str створюється за допомогою лапок
year_str
## '2008'

6.6.1 Перевіряємо тип об’єкта з type()

В нашому розпорядженні також є дуже корисна функція, яка дозволяє перевірити тип об’єкта. Називається вона type():

type(year_str)
## <class 'str'>

Головну інформацію, яку нам треба побачити, це – str. Усе інше, тобто <class ' '> ми можемо наразі проігнорувати. Якщо ж наш рік 2008 буде представлений об’єктом float, то функція поверне <class 'float'>:

year_float = 2008.0 # нагадуємо, що float створюється за домомогою крапки
type(year_float)
## <class 'float'>

Залежно від типу даних, об’єкт буде поводитись різним чином. Наприклад, int та float без проблем можна використовувати в одному виразі:

year_float = 2008.0
current_year = 2023 # цей об'єкт має тип int
current_year - year_float
## 15.0

А ось якщо наш рік представлений об’єктом str, це означає що ми не можемо поводитись з ним, як з числом. Навіть якщо воно виглядає як число. Давайте подивимось, що трапиться, якщо ми віднімемо рік народження, який зберігається в str, від числа 2023:

year_str = "2008" 
2023 - year_str
## unsupported operand type(s) for -: 'int' and 'str'

Упс, щось пішло не так і Python роздрукував помилку. Виявляється ми не можемо віднімати об’єкти з даними int та str. Але що нам робити, якщо нам все одно треба відняти ці числа? Виявляється, ми можемо перетворювати 🇬🇧 cast 🔄 об’єкти одного типу на інший. Для цього ми будемо використовувати функції:

  • int() для перетворення 🔄 на об’єкт int
  • float() для перетворення 🔄 на об’єкт float
  • bool() для перетворення 🔄 на об’єкт bool
  • str() для перетворення 🔄 на об’єкт str

6.6.2 Перетворюємо об’єкти на int та float з int() та float()

Давайте спробуємо перетворити year_str на об’єкт типу int:

year_str = "2008"
year_int = int(year_str)
type(year_int)
## <class 'int'>

Тепер ми можемо використати year_int, яка була створена з year_str, щоб порахувати вік:

2023 - year_int
## 15

Те що треба! Але будьте обережні, не завжди ми можемо перетворити str на int або float. Наприклад, перевести текстові символи, а не цифрові, ми не можемо, тому що це не має математичного сенсу:

some_letters = "number"
int(some_letters)
## invalid literal for int() with base 10: 'number'

Ми також можемо перетворити об’єкт типу bool на int або float. Значення True перетвориться на 1 (int()) або 1.0 (float()), тоді як False перетвориться на 0 (int()) або 0.0 (float()).

6.6.3 Перетворюємо об’єкти на bool з bool()

А ось навпаки, тобто перетворити об’єкти типів int/float на bool, можна здійснити за допомогою функції bool(). Ця функція поверне False тільки якщо об’єкт дорівню нулю (0 або 0.0):

bool(0.0)
## False

Якщо ж об’єкт не є нулем, тоді True:

bool(-213.23)
## True

Якщо ми перетворюємо стрічку str у bool, тут все цікавіше. Функція bool() поверне True в усіх випадках, крім пустої стрічки, тобто "":

bool("")
## False

До речі, навіть якщо ми зазначимо непусту стрічку "False", функція все одно поверне True 😳. Давайте перевіримо:

bool("False")
## True

6.6.4 Перетворюємо об’єкти на str з str()

З функцією str(), яка перетворює об’єкти на стрічки str простіше. Ця функція так би мовити загорне значення у лапки, тобто значення True стане "True", а число 42 перетвориться на стрічку "42".


Ми подивились на найпоширеніші типи скалярних даних та навчилися створювати змінні з такими типами. Ми також побачили що значення можуть зберігатися в об’єктах з різними типами даних та навчилися їх змінювати.


🤸 Вправи
1. Вкажіть скаляр з типом даних float:
2. Вкажіть скаляр з типом даних int:
3. Які типи даних можуть містити скаляри?
4. Обʼєкти типу bool можуть приймати:
5. Вкажіть рядок, у якому правильно створено текстову стрічку:
1️⃣ my_age = "13"
2️⃣ my_age = 13
3️⃣ my_age = тринадцять
4️⃣ my_age = 'тринадцять'
6. Функція type() допомагає перевірити тип обʼєкта:
7. Які функції перетворюють текст на число?
8. Що поверне наступний код:
price_apple = 25
price_orange = '29.99'
price_apple + price_orange
9. Перетягніть символи коду у правильному порядку, щоб перевірити тип об'єкту bar:
(
bar
type
)

  1. Тобто якщо об’єкт містить більше одного значення, то це вже не скаляр.↩︎

  2. Як колишній викладач вищої математики, можу сказати, що це дуже кепське визначення. Проте, воно дуже і дуже зрозуміле, що є головним зараз.↩︎

  3. Назва int – це скорочення від integer, яке з англійської перекладається як раз як ціле число.↩︎

  4. Деякі ресурси перекладають string як рядок. Проте тоді нам буде важко розрізняти три поняття: рядок в таблиці (a table’s row), рядок коду (code’s line) та текстовий рядок (string).↩︎