Справочник по Python · модуль 1 · данные и имена
Глава 1.1
Переменные
в программировании
Переменная — первое, с чего начинается любая программа сложнее одной строки. Разберём, что это такое, как переменной присваивают значение и почему без переменных код быстро становится нечитаемым.
- Категория
- Синтаксис и базовые концепции
- Уровень
- Начальный
- Связанные темы
- Типы данных, ввод и вывод, циклы
- Зачем это знать
- Понимать, где программа хранит данные и как к ним обращаться
§1Что такое переменная
Переменная — это имя для данных, с которыми работает программа. С её помощью значение можно записать, использовать в вычислении и заменить новым.
Переменная решает три задачи:
- хранит данные — значение можно использовать в следующих строках программы;
- позволяет их изменять — переменной можно присвоить новое значение;
- передаёт результаты дальше — то, что посчитано в начале, используется в следующих вычислениях.
В самой короткой записи это выглядит так: имя = значение. Знак равенства здесь — не сравнение и не равенство из математики, а операция присваивания: сначала вычисляется правая часть, затем результат записывается в переменную слева.
§2Как переменная получает значение
Для начала удобно представить переменную как подписанную коробку, в которой лежит значение.
Значение переменной можно прочитать, использовать в вычислении или заменить новым. Этой простой модели достаточно для первых программ.
# справа вычисляется значение, затем записывается в переменную слева 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 км: топливо плюс проживание. Данные вынесены наверх отдельным блоком, дальше идут только вычисления — так их удобно менять, не выискивая числа по всему коду.
# Исходные данные 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 пришлось бы написать два раза, а при правке — не забыть исправить оба.
Деление в Python даёт дробное число, и точного результата здесь нет: fuel_cost хранит 1895.8333333333333. Если вывести значение как есть, в терминал попадёт весь длинный хвост. Запись {fuel_cost:.2f} внутри f-строки округляет число до двух знаков при выводе, не меняя самого значения — в дальнейших расчётах участвует полная точность.
§5Зачем нужны переменные
Формально можно обойтись и без них: вычисление разрешено записать прямо в вызове функции. Сравним два варианта одной задачи.
print("Сумма чисел 2, 3 и 4:", 2 + 3 + 4)
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Изменение значения
Значение переменной можно заменить. Для частого случая «взять текущее значение, что-то с ним сделать и записать обратно» в языке есть сокращённая запись.
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 += 5 | x = x + 5 | увеличить на 5 |
x -= 5 | x = x - 5 | уменьшить на 5 |
x *= 2 | x = x * 2 | умножить на 2 |
x /= 2 | x = x / 2 | разделить на 2 (результат дробный) |
§7Назначение print()
Функция print() отвечает за одно: показать готовый результат. Вычисления стоит выносить в отдельные строки с осмысленными именами, а в вывод передавать уже посчитанное.
Технически ничто не мешает написать всю формулу внутри print(). Но такую строку тяжело читать, невозможно переиспользовать и неудобно отлаживать: когда результат окажется неверным, вы не увидите промежуточных значений и будете разбирать выражение глазами. Разделение «сначала считаем — потом выводим» — не стилевая придирка, а способ быстрее находить собственные ошибки.
§8Частые ошибки
| Что написано | Что произойдёт | Как правильно |
|---|---|---|
print(summ) до присваивания | NameError: name 'summ' is not defined — имени ещё не существует | сначала присвоить значение, потом использовать |
5 = x | SyntaxError — слева от = стоит значение, а не имя | 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 + 3print(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.