1. Типы данных¶
Переменная в языке программирования это название для зарезервированного места в памяти компьютера, предназначенное для хранения значений. Это означает, что когда вы создаете переменную, вы на самом деле резервируете определенное место в памяти компьютера. Основываясь на типе данных переменной, интерпретатор выделяет необходимое количество памяти и решает, что может находится в зарезервированной области памяти. Для понимания, можете думать о переменной как о коробке, в которую можно положить любую вещь, но только определенного размера. Размер в данном примере будет типом переменной. Это не совсем верное определение, но оно дает общее представление о картине в целом.
Присвоение значения переменной:
В Python вам не нужно объявлять тип переменной вручную (как, например в С++). Объявление происходит автоматически (это называется динамическая типизация), когда вы присваиваете значение переменной. Знак равенства ( = ) используется для присвоения значения переменной. Операнд по левую сторону от знака равно ( = ) это имя переменной, операнд по правую сторону — значение присвоенное этой переменной.
3.1. Теория¶
Практически любая программа получает на вход какие-либо данные, обрабатывает их и генерирует выходную информацию. Для этого типизированный язык программирования должен знать, с какими данными он имеет дело и какие операции над ними можно производить.
3.1.1. Понятие типа данных и переменной¶
Тип данных (англ. Data type) — характеристика, определяющая:
множество допустимых значений, которые могут принимать данные, принадлежащие к этому типу (например, объект типа Целое число может принимать только целочисленные значения в определенном диапазоне);
набор операций, которые можно осуществлять над данными, принадлежащими к этому типу (например, объекты типа Целое число умеют складываться, умножаться и т.д.).
Все типы в Python являются объектами (в отличие, например, от C++). При создании объекта вызывается специальная функция — конструктор.
Переменная (англ. Variable) — это идентификатор, который указывает на определенную область памяти, где хранятся произвольные данные — созданный объект (значение переменной).
Для имен переменных используется змеиный_регистр (англ. snake_case): например, my_variable или i .
Информативные имена переменных.
Переменным необходимо давать информативные имена, по которым можно было бы понять, с какими данными она связана — это чрезвычайно облегчает дальнейшее чтение и изменение кода.
Например, переменную, хранящую данные о скорости можно назвать speed , а не sk ; значение баланса телефона клиента — balance , а не b и т.д. «Привычные» со школы короткие имена следует использовать там, где они либо подходят по смыслу (например, a , b , c в роли коэффициентов квадратного уравнения), либо используются временно (например, счетчик i в циклической конструкции).
3.1.1.1. Классификация типов данных¶
В Python встроенные типы данных подразделяются на 2 группы:
-
Числа (целое, вещественное).
-
Логический тип.
-
NoneType.
Структурированные (составные) / коллекции.
-
Последовательности: строка, список, кортеж, числовой диапазон.
-
Множества.
-
Отображения: словарь.
Кроме того, все объекты в Python относятся к одной из 2-х категорий:
Мутирующие (англ. Mutable): содержимое объекта можно изменить после создания (например, список);
Немутирующие (англ. Immutable): содержимое объекта нельзя изменить после создания (например, строка или число).
Также часто используется терминология «изменяемые» и «неизменяемые» типы соответственно.
Как мутирующие, так и немутирующие объекты имеют свои преимущества и недостатки. Основным преимуществом немутирующих типов является гарантия неизменяемости с момента создания: каждый использующий участок кода имеет дело с копией объекта и не может его каким-либо образом изменить. Этот же принцип формирует основной недостаток немутирующих типов: большее количество потребляемой памяти на дополнительное копирование объектов при необходимости внесения изменений.
3.1.1.2. Оператор присваивания¶
Для связывания (и при необходимости предварительного создания) объекта и переменной используется оператор присваивания = .
Присваивание выполняется «справа налево» и подразумевает шаги:
если справа от оператора находится литерал (например, строка или число) в операнд слева записывается ссылка, которая указывает на объект в памяти, хранящий значение литерала:
если справа находится ссылка на объект, в левый операнд записывается ссылка, указывающая на тот же самый объект, на который ссылается правый операнд;
Переменная лишь указывает на данные — хранит ссылку, а не сами данные. В виду того, что копирования данных при этом не происходит, операция присваивания выполняется с высокой скоростью.
В связи с этим целесообразнее в Python в качестве метафоры рассматривать переменные как стикеры (этикетки), цепляемые к данным, а не ящики (Рисунок 3.1.1) и говорить, что «переменная присвоена объекту», а не привычное «переменной присвоен объект».

Рисунок 3.1.1 — Переменные в Python — стикеры, а не ящики 3 ¶
Пример использования оператора присваивания приведен в Листинге 3.1.1.
Инициализация переменной перед использованием
Переменная должна быть проинициализирована (ссылаться на данные) перед использованием в выражении. Например, код a = b + 2 или b += 1 , вызовет ошибку, если идентификатор b не был предварительно определен.
Присваивание и побочный эффект
Присваивание, меняя значение переменной, изменяет состояние программы — т.е. имеет побочный эффект. После выполнения присваивания, например x += 1 , весь дальнейший код программы будет иметь дело с новым, измененным значением 1.
3.1.1.3. Управление памятью и сборщик мусора¶
Создание объекта любого типа подразумевает выделение памяти для размещения данных об этом объекте. Когда объект больше не нужен — его необходимо удалить, очистив занимаемую память. Python — язык с встроенным менеджером управления памятью и выполняет данные операции автоматически за счет наличия сборщика мусора (англ. Garbage Collection, GC).
Сборка мусора — технология, позволяющая, с одной стороны, упростить программирование, избавив программиста от необходимости вручную удалять объекты, созданные в динамической памяти, с другой — устранить ошибки, вызванные неправильным ручным управлением памятью. Алгоритм, используемый сборщиком мусора называется подсчетом ссылок (англ. Reference Counting). Python хранит журнал ссылок на каждый объект и автоматически уничтожает объект, как только на него больше нет ссылок (Рисунок 3.1.2).
Рисунок 3.1.2 — Примерная схема работы сборщика мусора ¶
Время между созданием и уничтожением объекта — его жизненный цикл.
Объекты, которые имеют на протяжении своего жизненного цикла одно неменяющееся и характеризующее их значение, а также умеют сравниваться, называются хешируемыми. К хешируемым объектам относятся все немутирующие типы данных, а также пользовательские объекты.
3.1.2. Скалярные типы¶
3.1.2.1. Числа¶
В Python существует 2 категории чисел: целые и вещественные (с плавающей точкой).
3.1.2.1.1. Целое число¶
Целые числа в Python представлены типом int .
Размер целого числа ограничивается только объемом памяти компьютера. Литералы целых чисел по умолчанию записываются в десятичной системе счисления, но при желании можно использовать и другие (Листинг 3.1.2).
3.1.2.1.2. Вещественное число¶
Python предоставляет три типа значений с плавающей точкой:
decimal.Decimal (большая точность, по умолчанию 28 знаков после запятой).
Наиболее часто используемый тип float представляет числа с плавающей точкой двойной точности, диапазон значений которых зависит от компилятора, применявшегося для компиляции интерпретатора Python. Числа типа float записываются с десятичной точкой или в экспоненциальной форме записи (Листинг 3.1.3).
Для чисел с плавающей точкой существует ряд нюансов:
в машинном представлении такие хранятся как двоичные числа. Это означает, что одни дробные значения могут быть представлены точно (такие как 0.5 ), а другие — только приблизительно (такие как 0.1 и 0.2 , например, их сумма будет равна не 0.3 , а 0.30000000000000004 );
для представления используется фиксированное число битов, поэтому существует ограничение на количество цифр в представлении таких чисел.
В связи с этим числа типа float не могут надежно сравниваться на равенство значений, т.к. имеют ограниченную точность. Проблема потери точности — это не проблема, свойственная только языку Python, а особенность компьютерного представления чисел 2.
3.1.2.1.3. Операции над числами¶
Типовые операции, которые можно производить над числами ( int и float ), указаны в Листинге 3.1.4.
Для арифметических операций тип результата операции определяется типом аргументов. Если тип результата явно не предусмотрен при вычислении (например, округление до целых подразумевает получение результата типа int ), действуют следующие правила: