Проверка типа данных
Для определения типа данных, к которому принадлежит определенное значение, можно использовать функцию type().
Чтобы явно проверить, принадлежит ли значение определенному типу данных, можно использовать следующие конструкции.
— сравнить значение, полученное от функции type(), с определенным типом данных:
>>> x = 40 >>> if type(x) == int: print("Тип int")
— использование возможностей функции isinstance():
>>> s = "Строка" >>> if isinstance(s, str): print("Тип str")
Преобразование типов данных
Тип данных определяет, какой набор операций можно над ним производить. Числа можно сложить между собой, а вот число и список – уже нет. В этом случае будет выведено сообщение об ошибке.
>>> 2 + "25" Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> 2 + "25" TypeError: unsupported operand type(s) for +: 'int' and 'str'
Для предотвращения таких ситуаций необходимо предварительно преобразовать значение к нужному типу. Для этого можно использовать следующие функции:
— bool() – преобразует значение в логический тип.
>>> bool(1), bool(0), bool(""), bool("Текст"), bool([7, 1]), bool([]) (True, False, False, True, True, False)
int([<Значение>[, <Система счисления>]]) – преобразование в число. Второй параметр позволяет указать систему счисления, если не указывать, будет использоваться значение по умолчанию (10).
>>> int(7.6), int("76") (7, 76) >>> int("73", 10), int("71", 8), int("0o71", 8), int("A", 16) (73, 57, 57, 10)
Если нет возможности осуществить преобразование, генерируется исключение:
>>> int("74s") Traceback (most recent call last): File "<pyshell#9>", line 1, in <module> int("74s") ValueError: invalid literal for int() with base 10: '74s'
float() – преобразование в вещественный тип.
>>> float(8), float("8.1") (8.0, 8.1) >>> float("Infinity"), float("-inf") (inf, -inf) >>> float("Infinity") + float("-inf") Nan
str – преобразование в строку.
>>> str(125), str([1, 2, 3]) ('125', '[1, 2, 3]') >>> str(bytes("строка", "utf-8")) "b'\\xd1\\x81\\xd1\\x82\\xd1\\x80\\xd0\\xbe\\xd0\\xba\\xd0\\xb0'" >>> str((1, 2, 3)), str({"x": 5, "y": 10}) ('(1, 2, 3)', "{'y': 10, 'x': 5}") >>> str(bytearray("строка", "utf-8")) "bytearray(b'\\xd1\\x81\\xd1\\x82\\xd1\\x80\\xd0\\xbe\\xd0\\xba\\xd0\\xb0')"
str(<Значение>[, <Кодировка>[, <Обработка ошибок>]]) – преобразование значения bytes или bytearray в строку с указанной кодировкой. Третий параметр может иметь значение strict (ошибка приводит к возбуждению ошибки UnicodeDecodeError, используется по умолчанию), replace (неизвестный символ автоматически заменяется на символ с кодом \uFFFD) или ignore (неизвестные символы просто игнорируются). Примеры:
>>> obj1 = bytes("Первая строка", "utf-8") >>> obj2 = bytearray("Вторая строка", "utf-8") >>> str(obj1, "utf-8"), str(obj2, "utf-8") ('Первая строка', 'Вторая строка') >>> str(obj1, "ascii", "strict") Traceback (most recent call last): File "<pyshell#16>", line 1, in <module> str(obj1, "ascii", "strict") UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 0: ordinal not in range(128) >>> str(obj1, "ascii", "ignore") '1'
bytes(<Строка>, <Кодировка>[, <Обработка ошибок>]). Преобразование указанной строки в объект bytes, можно указать нужную кодировку. В третий параметр может принимать значения ignore, replace или strict (по умолчанию). Примеры:
>>> bytes("строка1234", "ascii", "ignore") b'1234' >>> bytes("строка", "cp1251") b'\xf1\xf2\xf0\xee\xea\xe0'
bytes(<Последовательность>). Указанная последовательность преобразуется в объект bytes. Должны использоваться только цифры в диапазоне 0-255, в противном случае генерируется исключение ValueError.
>>> b = bytes([225, 226, 224, 174, 170, 160]) >>> b b'\xe1\xe2\xe0\xae\xaa\xa0' >>> str(b, "cp866") 'строка'
bytearray(<Последовательность>). Преобразование указанной последовательности в объект bytearray. Поддерживаются только числа 0-255, при выходе за пределы диапазона генерируется исключение ValueError. Пример:
>>> b = bytearray([225, 226, 224, 174, 170, 160]) >>> b bytearray(b'\xe1\xe2\xe0\xae\xaa\xa0') >>> str(b, "cp866") 'строка'
bytearray(<Строка>, <Кодировка>[, <Обработка ошибок>]). Заданная строка преобразуется в объект bytearray. Параметр для обработки ошибок может принимать значения: ignore, replace или strict (используется по умолчанию).
>>> bytearray("строка", "cp1251") bytearray(b'\xf1\xf2\xf0\xee\xea\xe0')
list(<Последовательность>). Элементы указанной последовательности преобразуются в список.
>>> list("123456") # Преобразование строки ['1', '2', '3', '4', '5', '6'] >>> list((1, 2, 3, 4, 5, 6)) # Преобразование кортежа [1, 2, 3, 4, 5, 6]
tuple(<Последовательность>). Преобразование указанных элементов в кортеж. Пример:
>>> tuple("123456") # Преобразование строки ('1', '2', '3', '4', '5', '6') >>> tuple([2, 3, 4, 5]) # Преобразование списка (2, 3, 4, 5)
Особенности работы с разными типами данных можно рассмотреть на примере простой программы для сложения чисел:
x = input("x = ") # Вводим 7 y = input("y = ") # Вводим 45 print(x + y) input()
В такой реализации в качестве результата будет строка 745, хотя задача стоит в получении числа. Чтобы получить именно сумму, необходимо предварительно преобразовать введенные данные в числа. В этом случае уже будет получен нужный результат:
x = int(input("x = ")) # Вводим 7 y = int(input("y = ")) # Вводим 45 print(x + y) input()
Но в этом случае возникает другая проблема – если пользователь введет не число, а строку, то работа программы завершится фатальной ошибкой. Разработчики должны сразу это учитывать и обрабатывать такие ситуации (обработка ошибок будет рассмотрена позднее).