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

Проверка типа данных

Для определения типа данных, к которому принадлежит определенное значение, можно использовать функцию 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()

Но в этом случае возникает другая проблема – если пользователь введет не число, а строку, то работа программы завершится фатальной ошибкой. Разработчики должны сразу это учитывать и обрабатывать такие ситуации (обработка ошибок будет рассмотрена позднее).





Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: