Типы данных: преобразование и базовые операции
В этой части страницы мы рассмотрим способы ввода и вывода информации, встроенные типы данных, математические операции с числами и способы преобразования одних типов данных в другие. В конце статьи – 10 практических заданий с решениями.
Ввод, вывод данных и переменные в Python
Большинство программ, даже самых простых, выполняют обработку какой-либо информации – получают разнообразные данные, производят необходимые операции, после чего выводят результат.
За ввод и вывод данных в Python отвечают встроенные функции input() и print(). С помощью функции вывода print() можно написать классическую программу Hello, World! в одну строку:
>>> print('Hello, World!')
Hello, World!
Для ввода нужной информации используют input(). В этом примере переменная name
с помощью оператора присваивания =
получит введенное пользователем значение:
name = input()
Чтобы пользователю было понятнее, какое именно значение от него ожидает программа, можно добавить пояснение:
name = input('Как тебя зовут? ')
Или:
name = input('Введите свое имя ')
Напишем программу, которая запрашивает имя пользователя и выводит приветствие:
name = input('Как тебя зовут? ')
print('Привет,', name)
Результат:
Как тебя зовут? Вася
Привет, Вася
В этой программе используются две встроенные функции input() и print(), а также переменная name
. Переменная – это именованная область памяти, в которой во время выполнения программы хранятся данные определенного типа (о типах данных расскажем ниже). В стандартах оформления кода PEP 8 даны рекомендации по названиям переменных:
- Названия не должны начинаться с цифры, но могут заканчиваться цифрой. Например, назвать переменную
7up
– неправильно, а так –seven11
– можно. - Названия могут состоять из комбинации строчных, заглавных букв, цифр и символов подчеркивания:
lower_case
,mixedCase
,CapitalizedCase
,UPPER_CASE
,lower123
. - Не следует давать переменным названия, совпадающие со служебными словами, названиями встроенных функций и методов, к примеру – print, list, dict, set, pass, break, raise.
- Следует избегать использования отдельных букв, которые могут быть ошибочно приняты друг за друга –
l
(L в нижнем регистре),I
(i в верхнем регистре) или за нуль –O
. - В названиях не должно быть пробелов, дефисов и специальных символов, например,
'
или$
. - Главный принцип именования переменных – осмысленность. По названию переменной должно быть понятно, какого рода данные в ней хранятся – например, car_model, petName, CARD_NUMBER более информативны, чем a, а1, а2.
Переменные выполняют две важные функции:
- делают код понятнее;
- дают возможность многократно использовать введенные данные.
Если программа небольшая, а введенное значение используется однократно, можно обойтись без использования переменной:
print('Привет,', input('Как тебя зовут?'))
Ввод и вывод нескольких переменных, f-строки
Если в программе используются несколько переменных, ввод данных можно оформить на отдельных строках:
first_name = input()
last_name = input()
age = input()
Или в одну строку:
first_name, last_name, age = input(), input(), input()
Либо так – если значения переменных равны:
x1 = x2 = x3 = input()
Чтобы вывести значения переменных на экран, названия перечисляют в print() через запятую:
print(first_name, last_name, age)
Или по отдельности:
print(first_name)
print(last_name)
print(age)
При перечислении через запятую Python выводит все переменные в одну строку, разделяя значения пробелами:
Вася Пупкин 12
Вместо пробела можно подставить любой другой разделитель. Например:
print(first_name, last_name, age, sep="***")
В результате значения будут разделены звездочками:
Вася***Пупкин***12
Если нужно вывести значения не в строку, а в столбик, можно воспользоваться специальным параметром end="\n"
– он обеспечивает переход на новую строку:
print(first_name, last_name, age, end="\n")
Чтобы сделать вывод более информативным, используют f-строки:
print(f'Имя: {first_name}, Фамилия: {last_name}, Возраст: {age}')
Все содержимое такой строки находится в конструкции f'...'
, а названия переменных внутри строки заключаются в фигурные скобки {...}
.
Операции во время вывода
Функция print(), помимо вывода результатов работы программы, допускает проведение разнообразных операций с данными:
>>> print(5 + 5)
10
>>> print(10 // 3)
3
>>> print(6 ** 2)
36
>>> print('I' + ' love' + ' Python')
I love Python
Встроенные типы данных в Python
Питон работает с двумя категориями данных – встроенными типами (они поддерживаются по умолчанию) и специализированными (для операций с ними нужно подключение определенного модуля). К специализированным типам данных относятся, например, datetime (дата и время) и deque (двухсторонняя очередь).
Все встроенные типы данных в Python можно разделить на следующие группы:
- Числовые – целые, вещественные, комплексные числа. Примечание: для максимально точных расчетов с десятичными числами в Python используют модуль
decimal
(тип данных Decimal), а для операций с рациональными числами (дробями) – модульfractions
(тип данных Fraction). - Булевы – логические значения True (истина) и False (ложь).
- Строковые – последовательности символов в кодировке Unicode.
- NoneType – нейтральное пустое значение, аналогичное null в других языках программирования.
- Последовательности – списки, кортежи, диапазоны.
- Словари – структура данных типа «ключ: значение».
- Множества – контейнеры, содержащие уникальные значения. Подразделяются на изменяемые
set
и неизменяемыеfrozenset
множества. - Байтовые типы –
bytes
(байты),bytearray
(изменяемая байтовая строка),memoryview
(предоставление доступа к внутренним данным объекта).
В таблице приведены примеры и определения встроенных типов данных:
Тип данных | Значение | Определение в Python | Вариант использования |
Целые числа | -3, -2, -1, 0, 1, 2, 3 | int | a = int(input()) |
Вещественные числа | -1.5, -1.1, 0.6, 1.7 | float | a = float(input()) |
Комплексные числа | −5i, 3+2i | complex | a = complex(input()) |
Булевы значения | True, False | True, False | flag = True |
NoneType | None | None | a = None |
Строка | ‘abracadabra’ | str | a = str(5) |
Список | [1, 2, 3], [‘a’, ‘b’, ‘c’] | list | a = list((‘a’, ‘b’, ‘c’)) |
Кортеж | (‘red’, ‘blue’, ‘green’) | tuple | a = tuple((‘red’, ‘blue’, ‘green’)) |
Изменяемое множество | {‘black’, ‘blue’, ‘white’}, {1, 3, 9, 7} | set | a = set((‘black’, ‘blue’, ‘white’)) |
Неизменяемое множество | {‘red’, ‘blue’, ‘green’}, {2, 3, 9, 5} | frozenset | a = frozenset((2, 5, 3, 9)) |
Диапазон | 0, 1, 2, 3, 4, 5 | range | a = range(6) |
Словарь | {‘color’: ‘red’, ‘model’: ‘VC6’, ‘dimensions’: ’30×50′} | dict | a = dict(color=’red’, model=’VC6′, dimensions=’30×50′) |
Байты | b’\x00\x00\x00′ | bytes | a = bytes(3) |
Байтовая строка | (b’\x00\x00′) | bytearray | a = bytearray(2) |
Просмотр памяти | 0x1477a5813a00 | memoryview | a = memoryview(bytes(15)) |
Чтобы узнать тип данных, нужно воспользоваться встроенной функцией type():
>>> a = 3.5
>>> type(a)
<class 'float'>
Как задать тип переменной
Важно заметить, что если тип переменной не указан явно при вводе, т.е. ввод выполняется как a = input()
, то Python будет считать введенное значение строкой. В приведенном ниже примере Питон вместо сложения двух чисел выполняет конкатенацию строк:
>>> a, b = input(), input()
5
6
>>> print(a + b)
56
Это произошло потому, что a и b были введены как строки, а не целые числа:
>>> type(a)
<class 'str'>
>>> type(b)
<class 'str'>
Чтобы ввести целое число, следует использовать конструкцию int(input())
, вещественное –float(input())
.
Математические операции в Python
Все операции в математике имеют определенный приоритет: сначала выполняется возведение в степень, затем деление по модулю и так далее. Этот приоритет соблюдается и в Питоне:
Приоритет | Оператор Python | Операция | Пример | Результат |
1 | ** | Возведение в степень | 5 ** 5 | 3125 |
2 | % | Деление по модулю (получение остатка) | 16 % 7 | 2 |
3 | // | Целочисленное деление (дробная часть отбрасывается) | 13 // 3 | 4 |
4 | / | Деление | 39 / 2 | 19.5 |
5 | * | Умножение | 123 * 321 | 39483 |
6 | – | Вычитание | 999 – 135 | 864 |
7 | + | Сложение | 478 + 32 | 510 |
Python допускает применение сложения и умножения в операциях со строками. Сложение строк, как уже упоминалось выше, называется конкатенацией:
>>> print('Python -' + ' лучший' + ' язык' + ' программирования')
Python - лучший язык программирования
Умножение строки на целое число называется репликацией:
>>> print('Репликанты' * 5)
РепликантыРепликантыРепликантыРепликантыРепликанты
Однако попытки умножить строки друг на друга или на вещественное число обречены на провал:
>>> print('Репликанты' * 5.5)
Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
TypeError: can't multiply sequence by non-int of type 'float'
Преобразование типов данных
Python позволяет на лету изменять типы данных. Это может оказаться очень полезным при решении тренировочных и практических задач.
Округление вещественного числа:
>>> a = float(input())
5.123
>>> print(int(a))
5
Преобразование целого числа в вещественное:
>>> a = 5
>>> print(float(a))
5.0
Преобразование строки в число и вывод числа без ведущих нулей:
>>> a = '00032567'
>>> print(int(a))
32567
Сложение строки и числа:
>>> a = 'Apollo '
>>> b = 13
>>> print(a + str(b))
Apollo 13
Преобразование списка в строку:
>>> a = ['п', 'р', 'и', 'в', 'е', 'т']
>>> print('*'.join(a))
п*р*и*в*е*т
Преобразование строки в множество:
>>> a = 'привет'
>>> print(set(a))
{'в', 'е', 'и', 'т', 'п', 'р'}
Преобразование строки в список:
>>> a = 'я изучаю Python'
>>> print(list(a))
['я', ' ', 'и', 'з', 'у', 'ч', 'а', 'ю', ' ', 'P', 'y', 't', 'h', 'o', 'n']
Преобразование кортежа в список:
>>> a = ('red', 'blue', 'green')
>>> print(list(a))
['red', 'blue', 'green']
Разумеется, преобразование типов данных происходит в определенных пределах – строку, содержащую буквенные и специальные символы, нельзя сделать числом, а превращение списка, строки, множества или кортежа в словарь потребует дополнительных манипуляций, которые мы изучим позже.
Практика – задачи с решениями
Задание 1. Напишите программу, которая запрашивает имя и возраст пользователя, и выводит приветствие и возраст пользователя в следующем году. Пример работы программы:
Как тебя зовут? Катя
Привет, Катя!
Сколько тебе лет? 14
Здорово! В следующем году тебе будет 15!
Решение:
name = input('Как тебя зовут? ')
print(f'Привет, {name}!')
age = int(input('Сколько тебе лет? '))
print(f'Здорово! В следующем году тебе будет {age + 1}!')
Задание 2. Напишите программу, которая запрашивает имя, фамилию и возраст пользователя, а затем выводит эти данные в столбик с помощью f-строки. Результат работы программы:
Имя: Евгения
Фамилия: Фролова
Возраст: 19
Решение:
first_name = input()
last_name = input()
age = input()
print(f'Имя: {first_name}\nФамилия: {last_name}\nВозраст: {age}')
Задание 3. Напишите программу, которая выводит на экран прямоугольник 5 х 15, сформированный из звездочек. Пример вывода:
***************
* *
* *
* *
***************
Решение:
print('*' * 15)
print('*' + ' ' * 13 + '*')
print('*' + ' ' * 13 + '*')
print('*' + ' ' * 13 + '*')
print('*' * 15)
Задание 4. Напишите программу, которая получает на вход целое число n из диапазона от 1 до 9 включительно, и выводит результат вычисления выражения nnn – nn – n. Например, если введенное число 3, программа должна вывести 297 (333 – 33 – 3).
Решение:
num1 = input()
num2 = int(num1 * 2)
num3 = int(num1 * 3)
print(num3 - num2 - int(num1))
Задание 5. Напишите программу, которая получает на вход целые положительные числа a и b, а затем выводит результаты математических операций в следующем формате:
Число а в степени b = 25
Произведение a * b = 10
Сумма a + b = 7
Разница a - b = 3
Решение:
a, b = int(input()), int(input())
print('Число а в степени b =', a ** b)
print('Произведение a * b =', a * b)
print('Сумма a + b =', a + b)
print('Разница a - b =', a - b)
Задание 6. Напишите программу, которая получает от пользователя вещественные числа a и b – длину и ширину прямоугольника, – и выводит периметр и площадь прямоугольника в следующем формате:
Площадь S = 88.0
Периметр P = 38.0
Площадь вычисляется по формуле S = a * b, периметр P = 2 * (a + b).
Решение:
a, b = float(input()), float(input())
print('Площадь S =', a * b)
print('Периметр P =', 2 * (a + b))
Задание 7. Напишите программу, которая получает на вход число от 420 до 540 (оптимальная продолжительность сна в минутах) и помогает пользователю определить, на какое время (в формате «часы:минуты») нужно установить звонок будильника. Отсчет времени начинается с полуночи.
Пример ввода:
470
Вывод:
Поставь будильник на 7:50
Решение:
time = int(input())
print(f'Поставь будильник на {time // 60}:{time % 60}')
Задание 8. Напишите программу, которая получает на вход целое число n – количество дней, и конвертирует n в годы, месяцы и дни.
Пример ввода:
398
Вывод:
Годы: 1 Месяцы: 1 Дни: 3
Решение:
n = int(input("Введите количество дней: "))
years = n // 365
months = (n - years * 365) // 30
days = (n - years * 365 - months * 30)
print(f'Годы: {years} Месяцы: {months} Дни: {days}')
Задание 9. Напишите программу, которая получает от пользователя целое число n – количество секунд, и конвертирует n в часы, минуты и секунды.
Пример ввода:
3426
Вывод:
Часы: 0 Минуты: 57 Секунды: 6
Решение:
n = int(input())
seconds = n % (24 * 3600)
hours = seconds // 3600
seconds = seconds % 3600
minutes = seconds // 60
seconds = seconds % 60
print(f'Часы: {hours} Минуты: {minutes} Секунды: {seconds}')
Задание 10. Напишите программу, которая получает на вход вещественные числа x1, y1, х2, y2 – координаты точек a (x1, y1) и b (х2, y2) на плоскости – и вычисляет расстояние между a и b.
Пример ввода:
3.6
6.7
5.4
15.2
Вывод:
10.278618584226189
Решение:
x1, x2, y1, y2 = float(input()), float(input()), float(input()), float(input())
dist = ((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5
print(dist)
Примечание: модуль math, работу с которым мы уже знакомы, имеет функцию dist
для вычисления расстояния между точками на плоскости и в пространстве:
import math
x1, x2, y1, y2 = float(input()), float(input()), float(input()), float(input())
a, b = [x1, y1], [x2, y2]
d = math.dist(a, b)
print(d)
Подведем итоги
В этой части мы рассмотрели базовые типы данных в Python, разобрали дополнительные параметры ввода и вывода, научились преобразовывать одни типы данных в другие, написали первые простые программы. В следующей части будем изучать методы работы со строками.