- Переменные в Питоне
- Как объявить переменную в Питоне
- Автоматическое определение типа данных
- Как узнать тип переменной в Питоне
- Присвоение и преобразование типа данных
- Именование переменных
- Присвоить тип переменной python
- Аннотация функций
- Использование специальных типов
- Any
- Literal
- Union
- TypedDict
- NoReturn
- Final
- Использование статической проверки типов в Python
- Лучшие практики аннотации типов
- 1. Использование типа Any
- 2. Включите статическую проверку типов
- 3. Используйте кортежи для массивов фиксированной длины
- 4. Типы возврата функций
- Материалы по теме
- Источники
Переменные в Питоне
На курсе «Программирование на Питоне» мы во многом продолжим изучать то, о чем узнали на вводном курсе, но на гораздо более детальном уровне. И начнем мы этот путь с того, что еще раз взглянем на переменные в Питоне.
Перед прохождением этого занятия рекомендую изучить первый раздел вводного курса или, как минимум, познакомиться с программой Google Colab, которую мы используем в нашей работе, а также повторить основы программирования.
Как объявить переменную в Питоне
Создание или объявление переменной в Питоне происходит в тот момент, когда вы присваиваете ей определенное значение. Это очень удобно. Заранее объявлять переменную не требуется.
Также напомню, что в Питоне можно записать значения сразу в несколько переменных или присвоить одно и то же значение нескольким переменным.
Помимо этого, список можно «распаковать» (unpack) в несколько переменных:
Автоматическое определение типа данных
При создании и записи данных в переменную Питон попытается автоматически определить тип этих данных. Приведем несколько примеров:
Это очень важная и удобная особенность, которая выгодно отличает Питон от многих других языков программирования.
Как узнать тип переменной в Питоне
В случае, если вы не уверены в том, к какому типу данных относится переменная, можно воспользоваться функцией type().
Присвоение и преобразование типа данных
Иногда может быть полезно принудительно присвоить или преобразовать тип данных уже созданной переменной. Начнем с присвоения типа данных:
Также тип данных можно изменить.
Возможно, вы спрашиваете себя зачем инженеру машинного обучения в таких деталях разбираться в типах переменных. Одним из наиболее очевидных применений является предварительная обработка данных, поступивших, скажем, в формате строки (str), хотя с точки зрения логики это должно быть целое число (int).
Именование переменных
Напомню, что имя переменной может включать только латинские буквы и цифры, а также символ подчеркивания. Одновременно оно не должно начинаться с цифры. Питон отличает заглавную от строчной буквы. Пробелы и кириллицу использовать нельзя.
Как я не устаю повторять, название переменных должно быть осознанным. Это упростит работу с длинным кодом.
Посмотрим на допустимые названия переменных:
Присвоить тип переменной 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 = result
Literal
Литералы используются для указания программам проверки типов, что значение, которое имеет переменная или функция, равно одному из указанных значений.
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 в свой проект.