$ sudo teach IT
Модуль 2 · Первые шаги · Урок 2.2

Переменные

Вы научитесь сохранять данные под именем, менять их по ходу программы и выводить на экран так, чтобы это было понятно человеку.

Теория~35 минутНовичок

В прошлом уроке вы вызывали готовые функции вроде print("текст") с готовым значением прямо внутри скобок. Но что делать, если значение нужно использовать несколько раз или менять по ходу программы? Для этого данные сохраняют под именем — в переменной.

Что такое переменная

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

Термин

Переменная (англ. variable) — это имя, под которым Python хранит значение в памяти компьютера. Создать переменную значит написать её имя, поставить знак = и указать значение справа.

Python · Создание переменной
age = 21

Разбор строки:

  • age — имя, которое вы придумали сами. Python ещё не знает про такое имя, пока вы его не создадите.
  • = — знак присваивания. Он не означает «равно», как в математике, а означает команду «сохрани то, что справа, под именем слева».
  • 21 — значение, которое нужно сохранить.

После этой строки где угодно дальше в программе можно написать age, и Python подставит вместо него 21. Ещё переменную можно перезаписать — старое значение исчезнет, а на его месте появится новое:

Python · Изменение значения
score = 0
print(score)      # 0

score = 10
print(score)      # 10

Здесь происходит следующее:

  • Строка 1: в переменную score кладётся 0.
  • Строка 2: print(score) смотрит, что лежит в score, и печатает это. На экране будет 0.
  • Строка 4: в score кладётся новое значение 10, старое (0) уже не существует.
  • Строка 5: print(score) снова заглядывает в ячейку и печатает уже 10.

Как называть переменные

Имя переменной вы придумываете сами, но не любое слово подойдёт. У Python есть жёсткие правила, которые он проверяет, и есть общепринятые привычки, которые он не проверяет, но которых придерживаются все программисты — чтобы чужой код было легко читать.

Термин

Соглашение об оформлении кода на Python называется PEP 8 (Python Enhancement Proposal 8) — официальный документ с рекомендациями по стилю. Правило для имён переменных из PEP 8 называется snake_case: все буквы строчные, слова разделены нижним подчёркиванием.

Можно

  • user_name
  • total_price
  • age2
  • is_active

Нельзя

  • 2name — начинается с цифры
  • user-name — дефис запрещён
  • user name — пробел запрещён
  • for — занято самим Python

Зарезервированные слова

Часть слов Python использует для собственных команд, и их нельзя брать в качестве имени переменной — Python выдаст ошибку. Самые частые из них:

True   False   None   if   else   for   while   def   class   import   and   or   not   return
Python · snake_case на практике
first_name = "Мария"
last_name = "Иванова"
age_in_years = 30
Все три имени составлены из строчных букв и подчёркиваний, каждое описывает, что внутри лежит. Хорошее имя переменной — то, глядя на которое сразу понятно, что там за значение, без подсказок и комментариев.

Какие бывают значения: типы данных

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

Термин

Тип данных — это категория, к которой относится значение, и она определяет, какие операции с ним допустимы. Python определяет тип автоматически по тому, как вы записали значение — объявлять его отдельно не нужно. Узнать тип поможет уже знакомая вам функция type().

В этом курсе вы будете чаще всего встречать четыре типа:

intцелое число23
floatдробное число1.82
strстрока (текст в кавычках)"Алексей"
boolистина или ложьTrue
Python · Все четыре типа в одном примере
name = "Алексей"      # str — текст в кавычках
age = 23              # int — целое число
height = 1.82         # float — есть точка и дробная часть
is_student = True     # bool — True или False, с заглавной буквы

print(type(name))       # <class 'str'>
print(type(age))        # <class 'int'>
print(type(height))     # <class 'float'>
print(type(is_student)) # <class 'bool'>

Как Python определяет тип по записи:

  • Есть кавычки — значит str, даже если внутри цифры: "23" это текст, а не число.
  • Нет кавычек, нет точки — значит int: 23.
  • Нет кавычек, есть точка — значит float: 1.82.
  • Слово True или False с заглавной буквы и без кавычек — значит bool.
  • type() заглядывает внутрь переменной и называет её тип: результат всегда выглядит как <class 'имя_типа'>.

"23" и 23 — разные вещи

Кавычки полностью меняют тип значения. age = "23" — это строка из двух символов, с ней нельзя делать то, что можно делать с числом. Позже, в уроке про ввод данных, вы увидите, к чему приводит эта путаница на практике.

Выводим переменные: f-строки

Как напечатать одну переменную, вы уже знаете: print(score). А ещё print умеет печатать несколько значений через запятую — это было в уроке про готовые функции. Значит, в одном print можно смешивать текст и переменные:

Python · текст и переменные через запятую
name = "Катя"
age = 22

print("Меня зовут", name)
print("Мне", age, "лет")
# Меня зовут Катя
# Мне 22 лет

Разбор строки print("Мне", age, "лет"):

  • "Мне" и "лет" — текст в кавычках, печатается как есть.
  • age — без кавычек, поэтому Python печатает не слово age, а значение переменной: 22.
  • Запятые разделяют части, а print сам ставит между ними пробел.

Работает. Но попробуйте собрать всё в одно предложение — с запятой после имени:

Python · одно предложение через запятые
print("Меня зовут", name, ", мне", age, "лет")
# Меня зовут Катя , мне 22 лет

Видите лишний пробел перед запятой? print честно ставит пробел между всеми частями, в том числе перед ", мне". А ещё в такой строке легко запутаться в кавычках и запятых. Для таких случаев в Python есть особый вид строки.

Термин

f-строка (англ. f-string, форматированная строка) — это строка с буквой f перед открывающей кавычкой, внутри которой в фигурных скобках { } можно писать имя переменной. Python подставит на это место её значение.

Python · f-строка
name = "Катя"
age = 22

print(f"Меня зовут {name}, мне {age} лет")
# Меня зовут Катя, мне 22 лет

Тот же результат — но без лишнего пробела и без нагромождения кавычек: всё предложение записано одной строкой, а переменные стоят ровно там, где должны оказаться их значения.

Разбор строки print(f"Меня зовут {name}, мне {age} лет"):

  • f перед первой кавычкой сообщает Python: внутри этой строки ищи фигурные скобки и подставляй в них значения.
  • Текст вне скобок — Меня зовут, запятая, мне, лет — печатается как есть, буква в букву.
  • {name} заменяется на значение переменной name, то есть на Катя.
  • {age} заменяется на значение переменной age, то есть на 22.
  • Обычные кавычки в конце строки закрывают f-строку, а внешние скобки print(...) — это вызов функции, которая печатает готовый результат.
В одну f-строку можно поставить сколько угодно переменных любого типа — Python сам превратит число или True/False в текст при подстановке, отдельно ничего конвертировать не нужно.

Комментарии: заметки внутри кода

Иногда код сам по себе не объясняет, зачем в нём именно такое значение. Например, почему скидка именно 0.1, а не 0.15? Для таких пояснений в код добавляют текст, который Python не выполняет — он существует только для человека, который читает код.

Термин

Комментарий — это часть строки после символа #. Python доходит до # при чтении кода и пропускает всё, что идёт за ним до конца строки.

Python · Комментарии
# создаём переменную для скидки постоянного клиента
discount = 0.1

price = 500  # цена в рублях, без учёта скидки
Первая строка — комментарий целиком: Python пропускает её без выполнения. В третьей строке комментарий стоит после кода на той же строке — Python выполнит price = 500, а всё, что после #, проигнорирует.

Частые ошибки

Перепутать = и ==

Начинающие часто пишут =, когда имеют в виду сравнение. Но = — это всегда присваивание, а сравнение (которое вы изучите позже) записывается двумя знаками ==. Пока просто помните: один знак = означает «сохранить значение».

Использовать переменную до её создания

Python читает программу сверху вниз. Если переменная встречается в коде раньше, чем строка с =, которая её создаёт, Python выдаст ошибку NameError: name 'age' is not defined — он ещё не знает такого имени.

Python · NameError
print(age)   # NameError: name 'age' is not defined
age = 20     # переменная создана только здесь, слишком поздно

Забыть букву f перед строкой

Если написать print("Возраст: {age}") без f перед кавычками, Python не станет ничего подставлять — на экране появятся ровно фигурные скобки с именем переменной внутри, как обычный текст.

Python · Забыли f
age = 20
print("Возраст: {age}")   # Возраст: {age} — подстановки не будет
print(f"Возраст: {age}")  # Возраст: 20 — теперь верно

Что важно запомнить

1.
Переменная — это имя для значения в памяти. Создаётся строкой вида имя = значение, знак = означает присваивание, а не равенство.
2.
Имена переменных пишут в стиле snake_case: строчные буквы, слова разделены подчёркиванием. Нельзя начинать с цифры, использовать пробел, дефис или зарезервированные слова Python.
3.
Четыре основных типа: int (целое число), float (дробное число), str (текст в кавычках), bool (True или False). Тип определяется автоматически по записи значения, проверить его можно функцией type().
4.
f-строка — буква f перед кавычками плюс имя переменной в фигурных скобках { } — удобный способ собрать несколько значений в одно предложение для вывода.
5.
Комментарий начинается с # и продолжается до конца строки. Python его не выполняет, он существует для человека, читающего код.

Проверьте себя

3 вопроса

Анкета пользователя

В заготовке уже заданы четыре переменные: name (строка), age (целое число), height (дробное число) и is_student (булево значение). Допишите одну строку с print() и f-строкой, чтобы программа вывела ровно:

Имя: Мария, Возраст: 24, Рост: 1.68, Студент: True

Поменяйте переменные местами

В заготовке заданы переменные a = 5 и b = 10. Сделайте так, чтобы после вашего кода в a лежало значение 10, а в b — значение 5, то есть поменяйте их значения местами. Использовать литералы 5 и 10 напрямую в новых присваиваниях нельзя — решение должно работать для любых начальных значений a и b, а не только для этих двух чисел.