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