Categories: Топ

Преобразование типов данных в Python 3

При написании программ часто возникает необходимость изменить тип данных, чтобы иметь возможность по-другому манипулировать значениями. Например, нам может потребоваться объединить числовые значения со строками или представить десятичные дроби в виде целых чисел.

В этой статье мы расскажем вам о преобразовании чисел, строк, кортежей и списков. Также вы найдете здесь примеры, которые помогут вам понять, в каких случаях может понадобиться преобразование данных.

Преобразование числовых типов

В Python есть два числовых типа данныхцелые числа (integer) и числа с плавающей запятой (float). 

Бывает, вы работаете над чужим кодом и вам нужно преобразовать целое число в число с плавающей запятой (и наоборот). Или вы можете обнаружить, что использовали целое число, хотя на самом деле вам нужно число с плавающей запятой. Python имеет встроенные методы, позволяющие легко выполнить все эти преобразования.

Преобразование целых чисел в числа с плавающей запятой

Метод Python float() преобразует целые числа в числа с плавающей запятой. Чтобы использовать эту функцию, добавьте в скобки целое число:

float(57)

В этом случае 57 будет преобразовано в 57.0.

Этот метод можно использовать и с переменной. Объявим f равным 57, а затем выведем новое значение с плавающей запятой:

f = 57
print(float(f))

Результат:

 57.0

Используя функцию float(), мы можем преобразовывать целые числа в числа с плавающей запятой.

Преобразование чисел с плавающей запятой в ​​целые числа

Python также имеет встроенную функцию для преобразования чисел с плавающей запятой в целые числа: int().

Функция  int() работает аналогично функции float(). Чтобы преобразовать десятичную дробь в целое число, вы можете добавить его внутрь скобок:

int(390.8)

В этом случае 390.8 будет преобразовано в 390.

Эту функцию можно использовать и с переменными. Давайте объявим b равным 125.0, а c — равным 390.8, а затем применим к переменным функцию int():

b = 125.0
c = 390.8

print(int(b))
print(int(c))

Результат:

 125
 390

При преобразовании чисел с плавающей запятой в целые числа с помощью функции int() Python отсекает все, что идет после запятой. Мы можем ожидать, что 390,8 округлится до 391, но с применением только лишь функции int() этого не произойдет.

Преобразование чисел путем деления

В Python 3 при делении одного целого числа на другое целое число результат преобразуется в число с плавающей запятой. То есть, если разделить 5 на 2, в Python 3 вы получите число с плавающей запятой:

a = 5 / 2
print(a)
 2.5

В Python 2, так как вы имели дело с двумя целыми числами, вы получите ответ в виде целого числа: 5 / 2 = 2. Прочтите «Python 2 vs Python 3: Практические соображения» для получения дополнительной информации о различиях между Python 2 и Python 3.

Преобразования со строками

Тип данных string представляет собой последовательность из одного или нескольких символов (буквы, цифры, символы). Строки — это распространенная форма данных в компьютерных программах. Нам может потребоваться довольно часто преобразовывать строки в числа и наоборот, особенно когда мы получаем данные, созданные пользователем.

Преобразование чисел в строки

Числа в строки можно преобразовать с помощью метода str(). Мы передаем число или переменную в скобки метода, а на выходе получаем строковое значение.

Давайте сначала рассмотрим преобразование целых чисел. Чтобы преобразовать целое число 12 в строку, передадим его в метод str():

str(12)

При запуске str(12) в интерактивной оболочке Python (чтобы войти в оболочку, введите python в окне терминала) вы получите следующий вывод:

 '12'

Кавычки вокруг числа 12 означают, что оно теперь является строковым значением, а не целым числом.

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

user = "Sammy"
lines = 50

print("Congratulations, " + user + "! You just wrote " + lines + " lines of code.")

Когда мы запускаем этот код, мы получаем следующую ошибку:

 TypeError: Can't convert 'int' object to str implicitly

Мы не можем объединять строки и целые числа в Python, поэтому нам придется преобразовать переменную lines в строковое значение:

user = "Sammy"
lines = 50

print("Congratulations, " + user + "! You just wrote " + str(lines) + " lines of code.")

Теперь при запуске кода мы получим следующий вывод, поздравляющий нашего пользователя с прогрессом:

 Congratulations, Sammy! You just wrote 50 lines of code.

Если мы хотим преобразовать в строку не целое число, а число с плавающей запятой, порядок действий остается прежним. Мы передаем в метод str() число с плавающей запятой, а возвращено будет строковое значение. Передавать в метод можно как само число, так и переменную:

print(str(421.034))

f = 5524.53
print(str(f))
 '421.034'
 '5524.53'

Чтобы убедиться, что все правильно, мы можем объединить в выводе преобразованное число и строковые значения:

f = 5524.53
print("Sammy has " + str(f) + " points.")
 Sammy has 5524.53 points.

Мы можем быть уверены, что наш float был правильно преобразован в строку, потому что конкатенация была выполнена без ошибок.

Преобразование строк в числа

Строки могут быть преобразованы в числа при помощи методов int() и float().

Если в вашей строке нет десятичных знаков, вы, скорее всего, захотите преобразовать ее в целое число с помощью метода int().

Давайте возьмем пример пользователя Сэмми, отслеживающего количество написанных строк кода. Чтобы предоставить пользователю более интересную обратную связь, мы можем проводить с полученными значениями какие-то математические действия. Но в настоящее время эти значения хранятся в строках:

lines_yesterday = "50"
lines_today = "108"

lines_more = lines_today - lines_yesterday

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

Поскольку два числовых значения хранились в строках, мы получили ошибку. Операнд «-» для вычитания не является допустимым операндом для двух строковых значений.

Давайте изменим код, чтобы включить в него метод int(). Он преобразует строки в целые числа и позволит нам выполнять математические действия со значениями, которые изначально были строками.

lines_yesterday = "50"
lines_today = "108"

lines_more = int(lines_today) - int(lines_yesterday)

print(lines_more)
 58

Переменная lines_more автоматически является целым числом, и в этом примере она равна числовому значению 58.

В приведенном выше примере мы также можем преобразовать строчные значения в числа с плавающей запятой, используя метод float() вместо метода int(). В этом случае вместо 58 мы получим число с плавающей запятой —  58.0. Пользователь Сэмми зарабатывает очки в дробных числах:

total_points = "5524.53"
new_points = "45.30"

new_total_points = total_points + new_points

print(new_total_points)
 5524.5345.30

В этом случае использование операнда «+» с двумя строками является допустимой операцией. Но эта операция объединяет две строки, а не складывает два числовых значения вместе. В результате наш output выглядит необычно, поскольку это просто два значения рядом друг с другом.

Перед выполнением любых математических операций нам нужно преобразовать эти строки в числа с плавающей запятой с помощью метода float():

total_points = "5524.53"
new_points = "45.30"

new_total_points = float(total_points) + float(new_points)

print(new_total_points)
 5569.83

Теперь, когда мы преобразовали две строки в числа с плавающей запятой, мы получаем ожидаемый результат: сумму чисел 45.30 и 5524.53.

Если мы попытаемся при помощи метода int() конвертировать строку, представляющую собой десятичную дробь, в целое число, мы получим ошибку:

f = "54.23"
print(int(f))
 ValueError: invalid literal for int() with base 10: '54.23'

Преобразование строк в числа позволяет нам быстро изменять тип данных, с которым мы работаем. Благодаря этому мы можем выполнять математические операции с числовыми значениями, изначально сохраненными в строчном виде.

Преобразование в кортежи и списки

Вы можете использовать методы list() и tuple() для преобразования переданных им значений в тип данных списка и кортежа соответственно. В Python:

  • список является изменяемой упорядоченной последовательностью элементов, заключенных в квадратные скобки [ ].
  • кортеж является неизменяемой упорядоченной последовательностью элементов, заключенных в круглые скобки ( ).

Преобразование в кортежи

Начнем с преобразования списка в кортеж. Поскольку кортеж — это неизменяемый тип данных, такое преобразование может способствовать существенной оптимизации наших программ. Метод tuple() возвращает «кортежную» версию переданного ему значения.

print(tuple(['pull request', 'open source', 'repository', 'branch']))
 ('pull request', 'open source', 'repository', 'branch')

Мы видим, что в результате выводится кортеж, поскольку элементы теперь заключены в круглые, а не в квадратные скобки.

Давайте используем tuple() с переменной, представляющей список:

sea_creatures = ['shark', 'cuttlefish', 'squid', 'mantis shrimp']
print(tuple(sea_creatures))
 ('shark', 'cuttlefish', 'squid', 'mantis shrimp')

Опять же, мы видим, что значения списка преобразуются в значения кортежа, что обозначается круглыми скобками. 

Мы можем преобразовать в кортеж не только список, но и любой итерируемый тип, включая строки:

print(tuple('Sammy'))
 ('S', 'a', 'm', 'm', 'y')

Строки можно преобразовывать в кортежи с помощью метода tuple(), потому что они итерируемые (их можно перебирать). Но с типами данных, которые не являются итерируемыми (пример — целые числа и числа с плавающей запятой), мы получим ошибку:

print(tuple(5000))
 TypeError: 'int' object is not iterable

Можно преобразовать целое число в строку, а затем в кортеж:  tuple(str(5000)). Но лучше выбрать читаемый код, а не сложные преобразования.

Преобразование в списки

Преобразование значений, особенно кортежей, в списки может быть полезно, когда вам нужно иметь изменяемую версию этого значения. Для преобразования в список используется метод list()

Давайте преобразуем кортеж в список. Будьте внимательны со скобками: одна пара для кортежа, вторая — для метода  list(), а третья — для метода print():

print(list(('blue coral', 'staghorn coral', 'pillar coral')))
 ['blue coral', 'staghorn coral', 'pillar coral']

Квадратные скобки сигнализируют о том, что кортеж, переданный в метод  list(), преобразован в список.

Чтобы сделать код более читабельным, мы можем ввести переменную и удалить одну из пар круглых скобок:

coral = ('blue coral', 'staghorn coral', 'pillar coral')
list(coral)

Если мы выведем list(coral), мы получим тот же результат, что и выше.

В список можно преобразовать не только кортеж, но и строку:

print(list('shark'))
 ['s', 'h', 'a', 'r', 'k']

Заключение

В этой статье мы рассмотрели, как можно преобразовать одни типы данных в другие (в основном, с помощью встроенных методов). Возможность конвертировать типы данных в Python дает вам дополнительную гибкость при написании программ.

serhiy.semelit@gmail.com

Recent Posts

Сборка мусора в Python: ключевые концепции и механизмы

Управление памятью - важный, но часто упускаемый из виду аспект программирования. При неправильном подходе оно…

6 дней ago

Круговой импорт в Python и как его избежать

Как возникает круговой импорт? Эта ошибка импорта обычно возникает, когда два или более модуля, зависящих…

2 недели ago

Библиотека tqdm: визуализация прогресса выполнения скриптов Python

Вы когда-нибудь оказывались в ситуации, когда скрипт на Python выполняется очень долго и вы задаетесь…

3 недели ago

Символы новой строки в Python

В этом руководстве мы разберем все, что нужно знать о символах перехода на новую строку…

2 месяца ago

if __name__ == «__main__» в Python: полное объяснение

Блок if __name__ == "__main__" в Python позволяет определить код, который будет выполняться только при…

2 месяца ago

Как писать модульные тесты для методов экземпляра в Python

Давайте разберем, как настроить модульные тесты для экземпляров классов. Мы напишем тесты для проверки функциональности…

4 месяца ago