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 изменяет значение, на которое указывает привязка, поэтому каждое другое имя, указывающее на то же значение, видит это изменение.