Типи даних. Функції перетворення типів. Операції з числовими типами

Дані та їх типи

Можна помітити, що все, що ми робимо, ми робимо над чимось - якимись предметами або об'єктами. Ми міняємо властивості об'єктів та їх можливості. Програми для комп'ютерів також маніпулюють якимись об'єктами (назвемо їх поки даними).

Очевидно, дані бувають різними. Дуже часто комп'ютерній програмі доводиться працювати з числами і рядками. Наприклад, в минулих статтях ми "маніпулювали" числами, виконуючи над ними арифметичні операції. Можна сказати, що операція додавання виконувала зміну першого числа на величину другого, або множення збільшувало одне число в кількість разів, що відповідає другому числу.

Числа у свою чергу також бувають різними: цілими, дробовими, можуть мати величезне значення або дуже довгу дробову частину. При знайомстві з мовою програмування Python ми точно зіткнемося з трьома типами даних:

  • Цілі числа (integer) - позитивні і негативні цілі числа, а також 0 (наприклад, 4, 687, -45, 0).
  • Числа з плаваючою крапкою (float point) - дробові числа (наприклад, 1.45, -3.789654, 0.00453). Примітка: роздільником цілої і дробової частини служить крапка, а не кома.
  • Рядки (string) - набір символів, укладених в лапки (наприклад, "ball", "What is your name?", 'DkfjUUv', '6589'). Примітка: лапки в Python можуть бути одинарними або подвійними.

Цілими (integers) називаються числа, які ми легко можемо порахувати, наприклад 1, 2, 3. Зрозуміло, сюди ж відносяться 0 і негативні числа -1, -2, -3 і т. д.

Десяткові числа (decimal numbers), які також називають дійсними (real numbers), мають десяткову точку і якесь значення після неї, наприклад 1.25, 0.3752 і -101.2.

У програмуванні такі числа ще називають числами з плаваючою точкою (floating-point numbers). Адже десяткова точка може зміщуватися в різні боки. Наприклад, в змінній даного типу може міститися число 0.00123456 або 12345.6.

Перетворення типів

Часто виникає необхідність перейти від одного типу даних до іншого. Наприклад,  число, яке виводиться на екран, спочатку може знадобитися перетворити в текст. Цю операцію за вас виконує команда print, але бувають ситуації, коли потрібно поміняти тип без виведення інформації на екран або здійснити перетворення рядка в число (таке перетворення команда print виконувати не вміє). Ця операція називається перетворенням типів (type conversion). Яким чином вона реалізується? Насправді інтерпретатор Python не «перетворює» типи один в одного. Він створює з вихідного елемента новий елемент потрібного вам типу. Ось ряд функцій, які вміють виконувати цю операцію: 

  • float () створює нове число з плаваючою точкою (десяткове) з рядка або цілого числа. 
  • int () створює нове ціле число з рядка або числа з плаваючою крапкою. 
  • str () створює новий рядок з числа (або значення будь-якого іншого типу).

Дужки в кінці вказують, що перед нами не команди мови Python (такі як print), а вбудовані в нього функції. Детально функції будуть розглянуті трохи пізніше, а на даному етапі вам досить знати, що значення яке підлягає перетворенню вказується в дужках. Найкраще помітно це на прикладах. Розглянемо їх в інтерактивному режимі оболонки IDLE.

Перетворення цілого в десяткове

Візьмемо ціле число і за допомогою функції float () створимо на його основі число з плаваючою точкою:

>>> a = 12
>>> b = float(a)
>>> a
12
>>> b
12.0

Зверніть увагу на десяткову точку і завершальний 0 при виведенні змінної b. Саме за цими ознаками ми бачимо, що перед нами не ціле, а десяткове число. При цьому змінна a не змінюється, так як на початкове значення функція float () не впливає - вона створює нове значення. В інтерактивному режимі досить ввести ім'я змінної (без команди print), і інтерпретатор Python виведе на екран її значення. (Ви вже робили так) Однак в програмах це не працює. 

Перетворення десяткового в ціле 

Тепер спробуємо зробити зворотний перехід - візьмемо десяткове число і за допомогою функції int () отримаємо з нього ціле:

>>> c = 36.6
>>> d = int(c)
>>> c
36.6
>>> d
36

 Ми створили нову змінну d, яка представляє собою цілу частину змінної c.

Розглянемо ще один приклад:

>>> e = 99.98
>>> f = int(e)
>>> e
99.98
>>> f
99

Незважаючи на те що 99.98 - це майже 100, відповідь буде 99. Функція int() не виконує округлення, а просто відкидає дробову частину. Тому вона дає нам не найближче ціле, а менше з двох цілих.

Перетворення рядків у числа з плаваючою точкою

Отримати з рядка число можна наступним чином:

>>> a = '36.6'
>>> b = float(a)
>>> a
'36.6'
>>> b
36.6

 Зверніть увагу, що змінна a виводиться в лапках. Так інтерпретатор Python показує, що це рядок. А для змінної b виводиться значення з плаваючою точкою. 

Отримуємо додаткову інформацію 

Раніше, за наявністю лапок ми визначали, що саме перед нами - число або рядок. Але це можна дізнатися і іншим способом. В Python існує функція type (), що повідомляє в явному вигляді тип змінної. Подивимося, як вона працює:

>>> a = '36.6'
>>> b = 36.6
>>> c = 36
>>> type(a)
<
class 'str'>
>>> type(b)
<
class 'float'>
>>> type(c)
<
class 'int'>

 Функція type () для змінної a виводить class 'str', що відповідає рядку, для змінної b - class 'float', а , для змінної c - class 'int'. Вам більше не потрібно нічого вгадувати! 

Помилки при перетворенні типів 

Якщо дати функції int () або float () щось відмінне від числа, вона не спрацює. Переконайтеся самі:

>>> print(float('Hello!'))
Traceback (most recent call last):
  File "<pyshell#30>", line 1, in <module>
    print(float('Hello!'))
ValueError: could not convert string to float: 'Hello!'

 Ми отримали повідомлення про помилку, в якому говориться, що інтерпретатор Python не знає, як перетворити рядок "Hello!" в число. А ви знаєте? 

Операції з числовими типами:

Для цілих чисел:

Вхідні дані

Операція

Результат

a = int()
b =
int()
a+b
>>> type(a+b)
<
class 'int'>

a = int()
b =
int()

a-b

>>> type(a-b)
<
class 'int'>

a = int()
b =
int()

a*b

>>> type(a*b)
<
class 'int'>

a = int()
b =
int()

a/b
>>> type(a/b)
<
class 'float'>

a = int()
b =
int()

a**b

Якщо b>=0:

>>> type(a**b)
<
class 'int'>

Якщо b<0:

>>> type(a**b)
<
class 'float'>

a = int()
b =
int()

a//b

>>> type(a//b)
<
class 'int'>

a = int()
b =
int()

a%b

>>> type(a%b)
<
class 'int'>

Для дійсних чисел:

 Для дійсних чисел притаманні всі ті ж операції, що і для цілих. Якщо хоча б один з операндів буде дійсним числом - то і результат всієї операції буде числом дійсним!

Інкремент і декремент 

Пам'ятайте приклад з попередньої статті: first = first + 10? Ми назвали цю операцію збільшенням, або инкрементуванням. Аналогічний приклад first = first – 10 називають негативним приростом, або декрементуванням. Ці операції в програмуванні виконуються настільки часто, що для них вигадали спеціальні оператори: + = (інкремент) і - = (декремент). Ось як вони застосовуються:

>>> num = 10
>>> num += 1
>>> num
11

 Або:

>>> num = 10
>>> num -= 1
>>> num
9

 У першому випадку до числа додається одиниця. (Воно змінюється з 10 на 11) У другому випадку від числа віднімається одиниця. (Воно змінюється з 10 на 9.) 

Пам’ятаємо про попередній результат

При роботі в інтерактивному режимі з інтерпретатором досить часто виникає необхідність повторного використання попереднього результату обчислення. Щоб не вводити повторно числові значення (оскільки можна легко помилитись), доцільно використовувати символ “_”, який позначає результат попереднього обчислення. Наприклад, визначимо кількість секунд в 12 роках:

>>> 60*60
3600
>>> _*24
86400
>>> _*365
31536000
>>> _*12
378432000

 Дуже великі і дуже маленькі 

Пам'ятайте, як ми перемножуємо два дуже великих числа? Відповідь також являла собою велике число. Іноді в Python такі числа виводяться на екран трохи по-іншому. Виконайте в інтерактивному режимі цю операцію:

>>> 123654789654586.3256*256325896533254.32
3.169592481884282e+28

 В даному випадку не має значення, які саме цифри ви вводите. Підійдуть будь-які великі дійсні числа.

Буква e дозволяє виводити на екран дуже великі числа і називається експоненціальним поданням, або e-нотацією. При роботі з дуже великими (або з дуже маленькими) числами вкрай незручно писати всі цифри і десяткові розряди. А в математиці такі числа зустрічаються досить часто. Наприклад, астрономічна програма, що показує відстань від Землі до зірки Альфа Центавра, може вивести на екран 38000000000000000, 38,000,000,000,000,000 або 38 000 000 000 000 000. (Це 38 квадрильйонів кілометрів!) І в будь-якому з трьох варіантів вам доведеться помучитися, перераховуючи всі нулі. Іншим способом відображення цього числа є експоненціальне представлення, в якому поряд з десятковими числами фігурує ступінь 10. Відстань до зірки Альфа Центавра в цьому випадку буде записано як 3.8 × 10**16, вираз читається як «три цілих вісім десятих на десять в шістнадцятому ступені» і означає, що ви берете 3.8 і переміщує десяткову точку на 16 розрядів вправо, додаючи необхідні нулі:

E-нотація 

В e-нотації наше число виводиться на екран як 3.8E16 або як 3.8e16. В даному випадку буква E позначає ступінь 10. Тобто фактично у нас написано 3.8 × 10**16.

У більшості мов програмування, в тому числі і в Python, букву E можна писати як в верхньому (E), так і в нижньому (e) регістрі .

При записі дуже маленьких чисел, наприклад 0.0000000000001752, застосовується піднесення в негативну ступінь. Тобто можна записати 1.752 × 10**-13, або 1.752e-13. Негативна ступінь означає, що десяткову точку потрібно зрушити на вказану кількість розрядів не праворуч, а ліворуч:

Подібна форма запису дозволяє представляти в Python як дуже великі, так і дуже маленькі числа (більш того, в ній можна при необхідності представити будь-яке число). Спробуємо скористатися цим для введення чисел:

>>> a = 2.6e3
>>> b = 4.8E5
>>> a+b
482600.0

 Незважаючи на введення чисел з буквою e, відповідь виведена в звичайній десятковій формі. Справа в тому, що інтерпретатор Python показує результат в експоненційному представленні, тільки якщо число дуже маленьке або дуже велике (містить багато нулів) або якщо ви в явному вигляді зажадали вивести дані в такій формі. Спробуйте зробити так:

>>> a = 12.36e23
>>> b = 14.25e32
>>> a*b
1.7613e+57

 На цей раз відповідь автоматично подається в експоненційному вигляді, так як нерозумно виводити на екран число з 57 нулями! 

Перевірте свої знання:

Задачі для самостійного виконання: 

Вирішіть наступні завдання в інтерактивному режимі або написавши невелику програму:

1. Три людини обідають в ресторані і хочуть оплатити вскладчину рахунок в 352.7 гривні. На чай вони збираються залишити 15%. Яку суму повинен викласти кожен з тих, що обідають?

2. Обчисліть площу і периметр прямокутної кімнати шириною 12.5 метрів і довжиною 16.7 метра.

3. Напишіть програму для перетворення градусів Фаренгейта в градуси Цельсія. Перетворення здійснюється за формулою C = 5/9 * (F - 32). 

4. Як дізнатися, скільки часу займає подорож на автомобілі? Словами формула виражається так: «час подорожі дорівнює відстані, поділеній на швидкість». Напишіть програму, яка порахує, скільки часу займе переміщення на 200 кілометрів зі швидкістю 80 кілометрів на годину, і відобразіть відповідь на екрані.

5. За допомогою функції float () перетворіть рядок '12 .34' в число. Переконайтеся, що в результаті дійсно виходить число!

6. За допомогою функції int () перетворіть число 56.78 в ціле. У більшу або в меншу сторону відбувається округлення в даному випадку?

7. За допомогою функції int () створіть з рядка ціле число. Переконайтеся, що в результаті виходить саме ціле число!

8. Проведіть самостійно наступний експеримент: перевірте типи значень "12" і "2.4"? Якого вони типу і чому?

9. Що станеться, якщо рядок "8.53" спробувати перетворити в ціле число з допомогою функції int ()? Як вирішити цю проблему?

10. Обчисліть вираз 2 в 179 ступені. Виведіть на екран обчислене значення.

Використана література:

  1. У. Сэнд, К. Сэнд "Hello World! Занимательное программирование."
  2.  Python для детей. Самоучитель по программированию / Джейсон Бриггс 
  3. Программирование для детей / К.Вордерман, Дж. Вудкок, Ш. Макаманус
  4. Козолуп Є.В. Програмування в школі. Мова Python : Навчальний посібник. 8 клас. / Суми, 2017
  5. Пориньте у Python 3/Стандартні типи даних
  6. Програмування на мові Python (3.x). Початковий курс
  7. Типы данных в Python