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). Усі числа з плаваючою точкою на камері відповідають стандарту IEEE 754 32-біт – точність до приблизно семи значущих цифр.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, змінює значення, на яке вказує прив’язування, тому кожне інше ім’я, що вказує на те саме значення, бачить цю зміну.