2.2. Переменные и базовые типы

Переменная – это имя, которое вы связываете со значением с помощью оператора =. После присваивания имя можно использовать везде, где можно использовать значение:

width = 320
height = 240
pixels = width * height
print(pixels)               # prints 76800

Правая часть = вычисляется первой, затем результат связывается с именем слева. Чтение имени, которому никогда не присваивалось значение, вызывает NameError.

Переменная – это просто метка. Она указывает на значение – само значение находится где-то ещё, и у одного и того же значения может быть любое количество меток.

Три метки, указывающие на три значения в ячейках; переназначение метки перемещает стрелку, а не значение.

Переменные – это метки, указывающие на значения. Переназначение переменной перемещает метку; оно не изменяет значение, на которое метка указывала ранее.

2.2.1. Правила именования

  • Имена начинаются с буквы или подчёркивания и могут содержать буквы, цифры и подчёркивания. frame_count и _internal допустимы; 1st_frame – синтаксическая ошибка.

  • Имена чувствительны к регистру: Width и width – две разные переменные.

  • Избегайте повторного использования встроенных имён, таких как list, str, id() или print() – их перекрытие не вызывает ошибки, но исходная встроенная функция становится недоступной для остальной части скрипта.

  • Соглашение: snake_case для переменных и функций, ALL_CAPS для констант, которые вы не намерены изменять, CamelCase для имён классов.

2.2.2. Базовые типы

Каждое значение в Python имеет тип, который определяет, какие операции оно поддерживает. Четыре типа, которые вы будете записывать чаще всего:

  • int – целые числа, положительные или отрицательные. Целые числа в MicroPython растут настолько, насколько позволяет память. Литералы записываются обычными цифрами: 0, 42, -7. Шестнадцатеричные (0x1A), восьмеричные (0o17) и двоичные (0b1010) литералы также допустимы и полезны для регистров и битовых масок.

  • float – числа с десятичной точкой или показателем степени: 3.14, 1.0, -0.5, 2e6 (= 2 000 000.0). Все числа с плавающей точкой на камере соответствуют 32-битному формату IEEE 754 – с точностью примерно до семи значащих цифр.

  • bool – один из двух литералов True или False (обратите внимание на регистр букв).

  • str – текст, записанный как символы между одинарными или двойными кавычками: "hello", 'OpenMV'. Оба стиля кавычек эквивалентны; выбирайте тот, который позволяет избежать экранирования кавычек, встречающихся внутри строки.

Есть также пятое значение, о котором стоит узнать сразу:

  • None – единственное значение типа NoneType. Используется в значении «нет значения» или «ещё не задано». Функции, которые явно ничего не возвращают, неявно возвращают None.

2.2.3. Проверка и преобразование типов

Встроенная функция type() возвращает тип любого значения:

>>> type(42)
<class 'int'>
>>> type(3.14)
<class 'float'>
>>> type("hello")
<class 'str'>

Каждый тип также служит функцией преобразования. Передайте ей значение другого типа, и вы получите обратно эквивалентное значение нового типа – когда преобразование чётко определено:

>>> int("42")
42
>>> int(3.9)
3                           # truncates toward zero, not rounds
>>> float("1.5")
1.5
>>> str(255)
'255'
>>> bool(0), bool(1), bool("")
(False, True, False)

Преобразования, которые не являются чётко определёнными, вызывают ValueError:

>>> int("hello")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid syntax for integer with base 10

2.2.4. Переназначение и динамическая типизация

Имя можно переназначить значению любого типа в любое время. Следующее допустимо:

x = 42
x = "now I'm a string"
x = 3.14

Python не связывает переменную с типом. Код, который зависит от того, что x является целым числом, просто ожидает целое число в той точке, где он его использует; если он получит что-то другое, вы получите TypeError во время выполнения.

Примечание

Переназначение x не изменяет значение, на которое указывала старая привязка. Если два имени разделяют одно и то же значение, переназначение одного не влияет на другое:

a = [1, 2, 3]
b = a                       # both point at the same list
a = "different now"
print(b)                    # still [1, 2, 3]

Изменение разделяемого значения – это другое дело: метод вроде list.append изменяет значение, на которое указывает привязка, поэтому каждое другое имя, указывающее на то же значение, видит это изменение.