Типизация в Python. Типы данных, переменные
Переменные — зарезервированные ячейки памяти, используемые в Python для хранения значений. Типы данных переменной бывают разные, а на основе типа данных интерпретатор осуществляет выделение необходимого объёма памяти. В этой статье мы рассмотрим 6 основных типов данных в Python.
Числа
Для хранения числовых значений используют числовые типы данных. Создание числовых объектов не вызывает затруднений:
var1 = 1 var2 = 10Ссылка на числовой объект без проблем удаляется с помощью оператора del. Синтаксис:
del var1[,var2[,var3[. varN]]]]В Python поддерживаются 3 разных числовых типа: — целые числа со знаком (int); — значения с плавающей запятой (float); — комплексные числа (complex).
В Python 3 все целые числа представлены как long числа, то есть отдельного типа long нет.
Чтобы узнать класс переменной либо значения, мы можем использовать функции type() и isinstance() . Это позволяет проверить принадлежность объекта конкретному классу:
>>> a = 5 >>> print(a, "is of type", type(a)) 5 is of type >>> a = 2.0 >>> print(a, "is of type", type(a)) 2.0 is of type >>> a = 1+2j >>> print(a, "is complex number?", isinstance(1+2j, complex)) (1+2j) is complex number? TrueУ чисел с плавающей запятой ограниченная точность. Визуально разница видна в консоли по наличию точки: 1.0 — число с плавающей запятой, 1 — целое число.
Что касается комплексных чисел, то они записываются в виде x+yj . Х в данном случае — действительная часть числа, Y — мнимая. Примеры:
>>> a = 1234567890123456789 >>> a 1234567890123456789 >>> b = 0.1234567890123456789 >>> b 0.12345678901234568 >>> c = 1+2j >>> c (1+2j)Здесь следует учесть, что значение переменной b усечено.
Списки
Список — упорядоченная последовательность элементов. Этот тип данных используется в Python очень часто. Кстати, все элементы списка не обязательно должны иметь один и тот же тип.
Объявить список несложно. Элементы помещаются внутрь квадратных скобок и разделяются запятой:
>>> a = [1, 2.2, 'python']Для доступа к значениям списка используют оператор среза [] . Индексация в Python начинается с нуля:
>>> a = [5,10,15,20,25,30,35,40] >>> print("a[2] =", a[2]) a[2] = 15 >>> print("a[0:3] =", a[0:3]) a[0:3] = [5, 10, 15] >>> print("a[5:] =", a[5:]) a[5:] = [30, 35, 40]Списки — изменяемый тип, т. е. значения элементов можно менять:
>>> a = [1,2,3] >>> a[2] = 4 >>> a [1, 2, 4]Кортежи
Кортежи, как и списки — это упорядоченные последовательности элементов, только они неизменяемы. Кроме того, кортежи заключены в круглые скобки. Их используют для защиты данных о перезаписи. Эти типы данных можно рассматривать как «списки только для чтения».
>>> t = (5,'program', 1+3j)Для извлечения элементов также используют оператор среза [] . Но поменять значения не получится:
>>> t = (5,'program', 1+3j) >>> print("t[1] =", t[1]) t[1] = program >>> print("t[0:3] =", t[0:3]) t[0:3] = (5, 'program', (1+3j)) # Приведёт к ошибке, т. к. # кортежи неизменяемы >>> t[0] = 10Строки
Строка — непрерывный набор символов, которые размещаются в двойных или одинарных кавычках:
>>> s = "Простая строка" >>> s = '''многострочная строка'''Как и в случае с кортежами и списками, можно применять [] . Строки — тип данных, который относится к категории неизменяемых последовательностей.
Множества
Неупорядоченная уникализированная последовательность, объявляемая посредством элементов, которые разделены запятой внутри фигурных скобок:
>>> a = # вывод переменной множества >>> print("a =", a) a = # тип данных переменной а >>> print(type(a))
Можно выполнять объединение и пересечение множеств. Так как все элементы должны быть уникальными, дубликаты автоматически удаляются:
>>> a = >>> a
Раз последовательность не упорядочена, оператор извлечения среза не работает.
Словари
Словари — это хеш-таблицы или неупорядоченные наборы пар типа «ключ-значение». Работают, как ассоциативные массивы. Используются, если нужно сопоставить значение какому-нибудь ключу, чтобы иметь возможность получить доступ к этому значению, имея соответствующий ключ. В других языках программирования словари называют map , hash , object .
Словарь оптимизирован для извлечения данных. Он объявляется парами элементов в виде ключ:значение, которые заключены в фигурные скобки:
>>> d = >>> type(d)
Ключ используется для получения значения, которое ему соответствует. Не наоборот!
>>> d = >>> print("d[1] =", d[1]); d[1] = value >>> print("d['key'] =", d['key']); d['key'] = 2 # Приведёт к ошибке >>> print("d[2] =", d[2]);Преобразование типов данных
Мы можем преобразовывать значения из одного типа в другой с помощью таких функций, как int() , str() , float() и других:
>>> float(5) 5.0Когда происходит преобразование числа с плавающей запятой в целое, то теряется часть после запятой:
>>> int(10.6) 10 >>> int(-10.6) -10Преобразование в словарь требует, чтобы каждый элемент последовательности был парой:
>>> dict([[1,2],[3,4]]) >>> dict([(3,26),(4,44)])
Подробнее о преобразовании типов данных в Python смотрите в таблице ниже:
Материал «Типизация в Python. Типы данных, переменные» подготовлен специально для OTUS на основании статьи «Python Data Types».
Как указать тип переменной в python
Аннотация функций
Синтаксис аннотации переменных работает и для параметров функций. Однако, чтобы указать тип возврата ( return ), мы добавляем стрелку –> , за которой следует его тип.
from typing import Dict, List def convert_celcius_to_fahrenheit(celcius_temp: float) –> float: return (celcius_temp * 9/5) + 32 def send_email(subject: str, body: str, recipients: List[str], cache: Dict[str, str]) –> bool: # пропущено для краткости return True # или FalseИспользование специальных типов
Итак, когда мы разогрелись и познакомились с синтаксисом аннотаций типов, давайте познакомимся с более сложными типами.
Any
Переменная типа Any является неограниченной. Поэтому такие переменные совместимы со всеми другими типами ( int , str , List и т. д.), а все остальные типы совместимы с ними.
from typing import Any result: Any = "SUCCESS" # также работает, потому что переменные типа Any совместимы с другими типами result = 10 state: str = "PENDING" # работает, потому что все остальные типы совместимы с типом Any. state = resultLiteral
Литералы используются для указания программам проверки типов, что значение, которое имеет переменная или функция, равно одному из указанных значений.
from typing import Literal GENDER = Literal["male", "female", "non–conforming"] def create_user(first_name: str, last_name: str, gender: GENDER) –> dict[str, str, GENDER]: return create_user("John", "Bond", "male")В вышеприведенном примере пол будет одним из значений литерального объявления GENDER – «мужской», «женский» или «non–conforming».
Union
Иногда переменная может обладать свойствами, охватывающими два объявленных типа. Переменная также может быть двух типов.
from typing import Union def get_room_temperature() –> Union[int, float]: return 20.8 # 20 тоже сработаетTypedDict
Словари, будучи одной из самых простых форм структуры данных в Python, являются одним из наиболее используемых типов переменных в языке.
Использование TypedDict может значительно улучшить читаемость кода, особенно в большом проекте, где много объявлений в разных местах; отслеживание того, что куда идет, становится затруднительным по мере изменения размера проекта.
from typing import TypedDict, Union class Card(TypedDict): rank: Union[str, int] suit: str # класс Card теперь имеет поведение обоих классов TypedDict и dict # Card может быть использован для аннотации переменной ace_of_spade: Card = # или может быть инстанцирован ace_of_spade = Card(rank='A', suit='♤')NoReturn
Тип NoReturn аналогичен типу void в других языках программирования. Он используется для объявления того, что функция не имеет возврата.
from typing import NoReturn def say_greeting() –> NoReturn: print("Hello World!")Final
Это конструкция типизации, используемая для указания того, что переменная не должна быть повторно назначена или переопределена в подклассе.
from typing import Final MIN_NAME_LENGTH: Final = 2 # выдаст ошибку, зафиксированную системой проверки типов MIN_NAME_LENGTH += 1 class Validator(object): MIN_NAME_LENGTH: Final[int] = 4 class UserValidator(Validator): # эта строка будет отмечена интерпретатором MIN_NAME_LENGTH = 3Использование статической проверки типов в Python
Интерпретатор Python по умолчанию не осуществляет проверку типов. Однако была создана версия интерпретатора Python – mypy , которая обеспечивает проверку типов на уровне интерпретатора.
Вы можете использовать mypy двумя способами:
- Загрузить командную строку mypy и использовать ее для запуска ваших скриптов Python.
- Установить расширение mypy , доступное в VSCode и PyCharm.
Лучшие практики аннотации типов
1. Использование типа Any
Тип Any следует использовать только тогда, когда точный тип возвращаемой переменной или параметра функции нам неизвестен; это может быть при использовании сторонней библиотеки, не имеющей аннотаций типов, или при использовании модуля без аннотаций типов.
2. Включите статическую проверку типов
Преимущества проверки типов, заключающиеся в предотвращении ошибок и помощи разработчику, будут не так ощутимы, если она будет динамической. Если вы не любите командную строку mypy , вы также можете установить его как расширение VSCode или PyCharm.
3. Используйте кортежи для массивов фиксированной длины
Кортежи выполняют двойную функцию записи. Поэтому, когда у вас есть известное количество элементов в массиве, особенно когда они не все одного типа, для переменной лучше использовать тип кортеж.
4. Типы возврата функций
Функции должны выполнять одно и только одно действие, поэтому они должны иметь один определенный тип.
В этой статье мы научились:
- Синтаксису аннотации типов, а также аннотации переменных и функций.
- Как использовать сложные конструкции типизации ( Any , Literal , Union , TypedDict , NoReturn , Final ).
- Как можно обеспечить проверку типов на уровне интерпретатора Python.
- Лучшим практикам аннотации типов и как внедрить проверку типов Python в свой проект.
Материалы по теме
- Словари в Python: 12 задач для начинающих с решениями
- Дорожная карта Python-разработчика
- 28 лучших каналов YouTube про Python для начинающих


