2.2. Змінні та базові типи#

Змінна — це ім’я, яке ви прив’язуєте до значення за допомогою оператора =. Після присвоювання ім’я можна використовувати скрізь, де можна використовувати значення:

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

Спочатку обчислюється права частина =, потім результат прив’язується до імені ліворуч. Читання імені, яке ніколи не було присвоєно, викликає NameError.

Змінна — це просто мітка. Вона вказує на значення – значення знаходиться десь в іншому місці, і одне значення може мати будь-яку кількість міток.

Three labels pointing at three boxed values; reassigning a label moves the arrow, not the value.

Змінні — це мітки, що вказують на значення. Перепризначення змінної переміщує мітку; воно не змінює значення, на яке вказувала мітка раніше.#

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, змінює значення, на яке вказує прив’язування, тому кожне інше ім’я, що вказує на те саме значення, бачить цю зміну.