Модуль 1 · Данные и имена

Справочник по Python · модуль 1 · данные и имена

Глава 1.1

1.1

Переменные
в программировании

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

Категория
Синтаксис и базовые концепции
Уровень
Начальный
Связанные темы
Типы данных, ввод и вывод, циклы
Зачем это знать
Понимать, где программа хранит данные и как к ним обращаться

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

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

Переменная решает три задачи:

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

В самой короткой записи это выглядит так: имя = значение. Знак равенства здесь — не сравнение и не равенство из математики, а операция присваивания: сначала вычисляется правая часть, затем результат записывается в переменную слева.

§2Как переменная получает значение

Для начала удобно представить переменную как подписанную коробку, в которой лежит значение.

distance→500
fuel_price→45.5
cost_home→2500

Значение переменной можно прочитать, использовать в вычислении или заменить новым. Этой простой модели достаточно для первых программ.

Pythonприсваивание
# справа вычисляется значение, затем записывается в переменную слева
distance = 500
fuel_price = 45.5
fuel_efficiency = 12
cost_home = 2500
ПеременнаяЧто хранитЗначение
distanceрасстояние поездки, км500
fuel_priceцена литра топлива, руб.45.5
fuel_efficiencyрасход: сколько км на литр12
cost_homeстоимость проживания, руб.2500

§3Имена: правила и стиль

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

Что требует язык

  • имя состоит из букв, цифр и подчёркиваний; пробелов и дефисов в нём быть не может;
  • имя не начинается с цифры: 2day — ошибка, day2 — допустимо;
  • регистр важен: distance и Distance — две разные переменные;
  • нельзя занимать ключевые слова языка: for, if, class, import и другие.

Что требует читаемость

  • имя пишется в нижнем регистре, слова разделяются подчёркиванием: fuel_price, а не fuelPrice и не FP;
  • имя называет данные, а не их тип: total_cost понятнее, чем number1 или x;
  • не занимайте имена встроенных функций. Строка print = 5 выполнится, но после неё вывести что-либо в программе уже не получится.
Осторожно

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

§4Разбор задачи: стоимость поездки

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

main.pyполная программа
# Исходные данные
distance = 500
fuel_price = 45.5
fuel_efficiency = 12
cost_home = 2500

# Расчёт стоимости топлива
fuel_cost = (distance / fuel_efficiency) * fuel_price

# Общая стоимость
total_cost = fuel_cost + cost_home

print("Стоимость путешествия:")
print(f"Расходы на топливо: {fuel_cost:.2f} руб.")
print(f"Расходы на проживание: {cost_home} руб.")
print(f"Общая стоимость: {total_cost:.2f} руб.")
Вывод в терминалрезультат запуска
Стоимость путешествия:
Расходы на топливо: 1895.83 руб.
Расходы на проживание: 2500 руб.
Общая стоимость: 4395.83 руб.

Обратите внимание на строку с fuel_cost. Промежуточный результат получил имя — и дальше мы им пользуемся дважды: в выводе и в подсчёте общей суммы. Без этого имени выражение (distance / fuel_efficiency) * fuel_price пришлось бы написать два раза, а при правке — не забыть исправить оба.

На полях: откуда взялось :.2f

Деление в Python даёт дробное число, и точного результата здесь нет: fuel_cost хранит 1895.8333333333333. Если вывести значение как есть, в терминал попадёт весь длинный хвост. Запись {fuel_cost:.2f} внутри f-строки округляет число до двух знаков при выводе, не меняя самого значения — в дальнейших расчётах участвует полная точность.

§5Зачем нужны переменные

Формально можно обойтись и без них: вычисление разрешено записать прямо в вызове функции. Сравним два варианта одной задачи.

Вариант 1без переменной
print("Сумма чисел 2, 3 и 4:", 2 + 3 + 4)
Вариант 2с переменной
summ = 2 + 3 + 4
print("Сумма:", summ)

На одной строке разница незаметна — работают оба. Она появляется, когда результат нужен не один раз:

Что происходит дальшебез переменных
print("Сумма:", 2 + 3 + 4)
print("Сумма +5:", 2 + 3 + 4 + 5)
print("Результат:", (2 + 3 + 4 + 5) * 2)

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

Итого переменные дают нам возможность хранить промежуточные результаты, повторно использовать данные, сокращать код и — главное — объяснять читателю, что именно вычисляется. Имя fuel_cost говорит о смысле числа больше, чем само число.

§6Изменение значения

Значение переменной можно заменить. Для частого случая «взять текущее значение, что-то с ним сделать и записать обратно» в языке есть сокращённая запись.

Pythonсоставное присваивание
summ = 2 + 3 + 4   # summ → 9
summ += 5          # то же, что summ = summ + 5 → 14
summ *= 2          # то же, что summ = summ * 2 → 28

print("Результат:", summ)
Вывод в терминалрезультат запуска
Результат: 28

Порядок строк здесь имеет значение: интерпретатор выполняет их сверху вниз, и каждое присваивание работает с тем значением, которое лежит в переменной на этот момент. Поменяйте += 5 и *= 2 местами — получите 23, а не 28.

ЗаписьПолная формаДействие
x += 5x = x + 5увеличить на 5
x -= 5x = x - 5уменьшить на 5
x *= 2x = x * 2умножить на 2
x /= 2x = x / 2разделить на 2 (результат дробный)

§7Назначение print()

Функция print() отвечает за одно: показать готовый результат. Вычисления стоит выносить в отдельные строки с осмысленными именами, а в вывод передавать уже посчитанное.

Технически ничто не мешает написать всю формулу внутри print(). Но такую строку тяжело читать, невозможно переиспользовать и неудобно отлаживать: когда результат окажется неверным, вы не увидите промежуточных значений и будете разбирать выражение глазами. Разделение «сначала считаем — потом выводим» — не стилевая придирка, а способ быстрее находить собственные ошибки.

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

Что написаноЧто произойдётКак правильно
print(summ) до присваиванияNameError: name 'summ' is not defined — имени ещё не существуетсначала присвоить значение, потом использовать
5 = xSyntaxError — слева от = стоит значение, а не имяx = 5
total = fuel + home при опечатке в имениNameError — fuell и fuel для языка разные именакопировать имя, а не набирать заново
x = x + 1 в первой же строкеNameError — справа читается несуществующее значениезадать начальное значение: x = 0
print = "текст"имя встроенной функции занято, вывод перестанет работатьвыбрать другое имя, например message

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

Чем = в программировании отличается от знака равенства в математике?

В математике это утверждение о равенстве двух частей. В Python это присваивание: сначала вычисляется правая часть, затем результат записывается в переменную слева. Поэтому запись x = x + 1 корректна — она означает «взять текущее значение x, прибавить 1 и записать обратно».

Что выведет программа: a = 10, затем b = a, затем a = 3, затем print(b)?

10. В строке b = a текущее значение a записывается в b. Последующее присваивание a = 3 меняет только a, поэтому в b остаётся 10.

Какие из имён недопустимы: 2day, day_2, total cost, Total, for?

Недопустимы три: 2day — начинается с цифры; total cost — содержит пробел; for — ключевое слово языка. Имена day_2 и Total допустимы, но по стилю переменную лучше назвать total в нижнем регистре.

Перепишите так, чтобы вычисление не повторялось: print((2 + 3) * 2) и print((2 + 3) * 10).

Вынести общую часть в переменную:

  • base = 2 + 3
  • print(base * 2)
  • print(base * 10)

Теперь изменение исходных чисел правится в одном месте.

Задача для практики: измените программу о поездке так, чтобы она считала стоимость поездки туда и обратно.

Достаточно поменять одно значение — distance = 1000 — либо ввести отдельное имя, например trips = 2, и умножить на него расстояние: fuel_cost = (distance * trips / fuel_efficiency) * fuel_price. Второй вариант лучше: из кода видно, откуда взялось удвоение.

§10Шпаргалка

Создать и прочитать x = 10 y = x + 5 print(y)
Изменить значение x = 3 x += 2 # 5 x *= 10 # 50
Вывести с округлением price = 1895.8333 print(f"{price:.2f}") # 1895.83
Стиль имени fuel_price ✓ fuelPrice ✗ fp, x1 ✗

Итог главы

Переменная — это имя для данных. Она хранит значение между строками программы, позволяет заменить его на новое и переиспользовать результат вместо повторного вычисления. Хорошо названные переменные делают код короче и, что важнее, объясняют читателю смысл каждого числа: total_cost вместо безымянного 4395.83.

Глава 1.1 · Переменные в программировании · Справочник по Python Автор: Макаров Максим Николаевич