Типи даних та їх перетворення

Last updated on 2025-02-23 | Edit this page

Estimated time: 20 minutes

Overview

Questions

  • Які види даних зберігають програми?
  • Як я можу перетворити один тип в інший?

Objectives

  • Визначення ключових відмінностей між цілими числами та числами з плаваючою точкою.
  • З’ясувати ключові відмінності між числами та символьними рядками.
  • Використання вбудованих функцій для перетворення цілих чисел, чисел з плаваючою точкою та рядків.

Кожне значення має тип.


  • Кожне значення, яке використовує програма, має певний тип.
  • Ціле число (int): зображує додатні або від’ємні цілі числа, наприклад 3 або -512.
  • Число з плаваючою крапкою (float): зображує дійсні числа, наприклад 3.14159 або -2.5.
  • Рядки символів (зазвичай просто “рядки”, str): представляють текст.
    • Укладені в одинарні або подвійні лапки (тип лапок має збігатися).
    • Під час відображення рядку лапки не друкуються.

Вбудована функція type повертає тип значення.


  • Використовуйте вбудовану функцію type, щоб з’ясувати, який тип має значення.
  • Це також працює зі змінними.
    • Але запамʼятайте: значення має свій тип, а змінна тільки вказує на деяке значення.

PYTHON

print(type(52))

OUTPUT

<class 'int'>

PYTHON

fitness = 'average' print(type(fitness))

OUTPUT

<class 'str'>

Тип визначає, які операції (або методи) можна виконувати над даним значенням.


  • Тип значення визначає, що може робити з ним програма.

PYTHON

print(5 - 3)

OUTPUT

2

PYTHON

print('hello' - 'h')

ERROR

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-67f5626a1e07> in <module>()
----> 1 print('hello' - 'h')

TypeError: unsupported operand type(s) for -: 'str' and 'str'

Ви можете використовувати оператори “+” та “*” для дій над рядками.


  • “Додавання” рядків об’єднує їх.

PYTHON

full_name = 'Ahmed' + ' ' + 'Walsh' 
print(full_name)

OUTPUT

Ahmed Walsh
  • Якщо рядок помножити на ціле число N, то це створить новий рядок, який буде містити вихідний рядок, повторений N разів.
    • Оскільки множення - це повторюване додавання.

PYTHON

separator = '=' * 10 
print(separator)

OUTPUT

==========

Рядки мають довжину (але числа її не мають).


  • Вбудована функція len повертає кількість символів у рядку.

PYTHON

print(len(full_name))

OUTPUT

11
  • Але числа не мають довжини (навіть нульової).

PYTHON

print(len(52))

ERROR

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-f769e8e8097d> in <module>()
----> 1 print(len(52))

TypeError: object of type 'int' has no len()

Must convert numbers to strings or vice versa when operating on them.


  • Додавання чисел та рядків неможливе.

PYTHON

print(1 + '2')

ERROR

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-fe4f54a023c6> in <module>()
----> 1 print(1 + '2')

TypeError: unsupported operand type(s) for +: 'int' and 'str'
  • Таке додавання не дозволено, тому що воно не визначене: чи має 1 + '2' повертати 3 чи '12'?
  • Перетворення типу виконується за допомогою функції, яка має те ж саме імʼя, що і потрібний тип.

PYTHON

print(1 + int('2')) 
print(str(1) + '2')

OUTPUT

3
12

З цілими та дійсними числами можна оперувати одночасно.


  • Цілі та дійсні числа можна використовувати разом для арифметичних дій.
    • Python 3 автоматично перетворить цілі числа у дійсні, якщо це потрібно.

PYTHON

print('half is', 1 / 2.0) 
print('three squared is', 3.0 ** 2)

OUTPUT

half is 0.5
three squared is 9.0

Змінні можуть змінити своє значення тільки через присвоєння.


  • Якщо в електронних таблицях ми зробимо одну комірку залежною від іншої та оновимо останню, перша оновиться автоматично.
  • Це не трапляється у мовах програмування.

PYTHON

variable_one = 1
variable_two = 5 * variable_one
variable_one = 2
print('first is', variable_one, 'and second is', variable_two)

OUTPUT

first is 2 and second is 5
  • Комп’ютер зчитує значення variable_one під час множення, створює нове значення та призначає цьому значенню ім’я variable_two.
  • Після того, як значення variable_two встановлено, воно не залежить від значення variable_one, отже його значення не змінюється автоматично, коли variable_one змінюється.

Дроби

Який тип має значення 3.4? Як це можна встановити?

It is a floating-point number (often abbreviated “float”). Це можна перевірити, використовуючи вбудовану функцію type().

PYTHON

print(type(3.4))

OUTPUT

<class 'float'>

Автоматичне перетворення типів

Який тип має вираз 3.25 + 4?

Це - дійсне число: цілі числа автоматично перетворюються у дійсні, коли це необхідно.

PYTHON

result = 3.25 + 4
print(result, 'is', type(result))

OUTPUT

7.25 is <class 'float'>

Вибір типу

Який тип значення (ціле число, дійсне число або рядок символів) ви б використовували для представлення кожного з наступних значень? Спробуйте знайти більш ніж одну гарну відповідь для кожної проблеми. For example, in # 1, when would counting days with a floating point variable make more sense than using an integer?

  1. Кількість днів, які пройшли з початку року.
  2. Час, що пройшов від початку року до сьогоднішнього дня.
  3. Серійний номер лабораторного обладнання.
  4. Вік лабораторного зразка
  5. Поточне населення міста.
  6. Середня чисельність населення міста протягом певного часу.

Відповіді на запитання:

  1. Ціле, оскільки число днів належить діапазону від 1 до 365.

  2. Дійсне число, оскільки потрібно використовувати частини дня.

  3. Символьний рядок, якщо серійний номер містить літери та цифри, або ціле число, якщо серійний номер складається лише з цифр.

  4. Це залежить від багатьох факторів! Як вимірюється вік зразка? Кількість днів з моменту, коли його було створено (ціле число)? Дата і час (рядок)?

  5. Виберіть дійсне число, щоб представити приблизну кількість населення за допомогою округлення (наприклад, до мільйонів), або ціле число, щоб представити точну кількість населення.

  6. Дійсне число, оскільки результат усереднення, швидше за все, буде мати дробну частину.

Типи операцій ділення

У Python 3 оператор // виконує ціле ділення (повертає цілу частину результату), оператор / виконує ділення з плаваючою точкою, та оператор ‘%’ (або модуль) повертає залишок від цілого ділення:

PYTHON

print('5 // 3:', 5 // 3)
print('5 / 3:', 5 / 3)
print('5 % 3:', 5 % 3)

OUTPUT

5 // 3: 1
5 / 3: 1.6666666666666667
5 % 3: 2

Припустимо, що num_subjects - це кількість суб’єктів, які беруть участь у дослідженні, а num_per_survey — кількість, яка може взяти участь в одному опитуванні. Напишіть вираз, який обчислює кількість необхідних опитувань для охоплення кожного хоча б один раз.

Потрібно визначити мінімальну кількість опитувань для охоплення кожного суб’єкта хоча б один раз, тобто округлене значення num_subjects/num_per_survey. Це еквівалентно виконанню дійсного ділення за допомогою оператору // і додаванню 1 до результату. Перед діленням нам потрібно відняти 1 від кількості num_subjects, щоб працювати з випадком, коли num_subjects порівну ділиться на num_per_survey.

PYTHON

num_subjects = 600
num_per_survey = 42
num_surveys = (num_subjects - 1) // num_per_survey + 1

print(num_subjects, 'subjects,', num_per_survey, 'per survey:', num_surveys)

OUTPUT

600 subjects, 42 per survey: 15

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

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

PYTHON

print("string to float:", float("3.4"))
print("float to int:", int(3.4))

OUTPUT

string to float: 3.4
float to int: 3

Якщо перетворення не має сенсу, то генерується повідомлення про помилку.

PYTHON

print("string to float:", float("Hello world!"))

ERROR

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-5-df3b790bf0a2> in <module>
----> 1 print("string to float:", float("Hello world!"))

ValueError: could not convert string to float: 'Hello world!'

Беручи це до уваги, чого чекати від наступної програми?

Що вона робить насправді?

Як це пояснити?

PYTHON

print("fractional string to int:", int("3.4"))

Що ви очікуєте від цієї програми? Чому б не очікувати, що у Python 3 команда int перетворить рядок “3.4” на 3.4 та виконає додаткове перетворення у ціле число 3. After all, Python 3 performs a lot of other magic - isn’t that part of its charm?

PYTHON

int("3.4")

OUTPUT

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-2-ec6729dfccdc> in <module>
----> 1 int("3.4")
ValueError: invalid literal for int() with base 10: '3.4'

Однак Python 3 видає помилку. Чому? Можливо, щоб бути послідовним. If you ask Python to perform two consecutive typecasts, you must convert it explicitly in code.

PYTHON

int(float("3.4"))

OUTPUT

3

Арифметичні дії з різними типами

Яка з наступних команд поверне дійсне число 2.0? Примітка: це питання може мати декілька коректних відповідей.

PYTHON

first = 1.0
second = "1"
third = "1.1"
  1. first + float(second)
  2. float(second) + float(third)
  3. first + int(third)
  4. first + int(float(third))
  5. int(first) + int(float(third))
  6. 2.0 * second

Правильні відповіді: 1 та 4

Комплексні числа

Python підтримує комплексні числа, які записуються як 1.0 + 2.0j. If val is a complex number, its real and imaginary parts can be accessed using dot notation as val.real and val.imag.

PYTHON

a_complex_number = 6 + 2j
print(a_complex_number.real)
print(a_complex_number.imag)

OUTPUT

6.0
2.0
  1. Чому, на вашу думку, Python використовує j замість i для уявної частини?
  2. What do you expect 1 + 2j + 3 to produce?
  3. Що ви очікуєте від 4j? А що від 4 j або 4 + j?
  1. Стандартні математичні позначення зазвичай використовують i для позначення комплексного числа. However, from media reports it was an early convention established from electrical engineering that now presents a technically expensive area to change. Stack Overflow містить додаткові пояснення та обговорення.

  2. (4+2j)

  3. 4j або Syntax Error: invalid syntax. В останньому випадку j вважається змінною і значення виразу залежить від того, чи є j визначеним.

Key Points

  • Кожне значення має тип.
  • Вбудована функція type повертає тип значення.
  • Типи контролюють, які операції можна виконувати над значеннями.
  • Рядки можна додавати і помножувати.
  • Рядки мають довжину (але числа її не мають).
  • Необхідно перетворювати числа в рядки або навпаки під час виконання певних операцій.
  • Цілі та дійсні числа можна використовувати разом.
  • Змінні можуть набути своє значення тільки через присвоювання.