К содержанию

Модуль 1 · Урок 1.2

Значения, типы и переменные

Чем число отличается от текста, как дать значению имя и что происходит при присваивании.

7 задач

В прошлом уроке ты считал стоимость трёх тетрадей: print(3 * 40). Числа в этой записи безымянные: по коду не видно, где цена, а где количество. В этом уроке у значений появятся имена, а заодно выяснится, почему 40 и "40" для Python — разные данные.

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

Число и текст

Число и текст — разные данные, даже если выглядят одинаково. 27 — число. "27" — текст: ты помнишь из прошлого урока, что кавычки делают запись текстом. С числами выполняют арифметику, а текст можно соединить с другим текстом:

print(27 + 3)print("27" + "3")
30 273

Текст в кавычках в Python называют строкой — это строка символов. Не путай её со строкой программы: в одной строке программы print("27" + "3") записаны две строки — "27" и "3".

Знак + один и тот же, но числа он складывает, а строки склеивает:

Число 27 — одно значение, строка "27" — два символа подряд. Поэтому + у чисел даёт 30, а у строк — три символа «273».

Тип значения — его вид: 27 — целое число, "27" — строка. От типа зависит, что Python делает со значением: ты только что видел, что + у чисел и у строк работает по-разному. Тип значения сообщает type(...):

print(type(27))print(type("27"))print(type(2.5))
<class 'int'> <class 'str'> <class 'float'>

В выводе важно короткое имя типа в кавычках: int, str, float. Для первых программ этих трёх типов хватит:

Целые числа int — для счёта и точных вычислений, дробные float (их ещё называют числами с плавающей точкой) — для измерений и долей. Строка str — любой текст, даже из одних цифр или пустой: "".

Дробную часть в Python отделяют точкой, а не запятой. Запятая в коде разделяет значения, поэтому print(2,5) напечатает не дробь, а два числа:

print(2.5)print(2,5)
2.5 2 5

Ещё два типа — bool (ответ «да» или «нет») и None («значения нет») — понадобятся в уроках об условиях и функциях. Остальные типы появятся вместе с задачами, для которых они нужны.

Присваивание

Чтобы дать значению имя, пишут имя, знак = и значение. Так записывается покупка из прошлого урока:

price = 40quantity = 3cost = price * quantityprint(cost)
120

Первые две строки связывают имя price с числом 40, а quantity — с числом 3. В третьей справа от = стоит выражение: Python сначала вычисляет его из текущих значений и только потом связывает имя cost с результатом 120. Такая инструкция называется присваиванием, а имя, связанное со значением, — переменной. Говорят и короче: «переменная cost получила значение 120».

Сначала вычисляется правая часть: price и quantity дают 40 и 3, выражение — 120. Только потом имя cost слева связывается с готовым числом.

Имя появляется только после присваивания. Если напечатать cost раньше, программа остановится с NameError — той же ошибкой, что у pritn в прошлом уроке:

print(cost)cost = 120
NameError: name 'cost' is not defined

Знак = в Python — не равенство из математики, а действие: связать имя со значением в тот момент, когда выполняется строка. Нажми «Запуск» в шапке примера и пройди программу по шагам: рядом с кодом видно, с каким значением связано каждое имя.

x = 5y = x + 2x = 100print(y)
7

Во второй строке x + 2 вычисляется сразу: имя y связывается с числом 7, а не с формулой. Третья строка связывает с новым значением только x, поэтому программа печатает 7. Вот значения после каждой строки:

Выделено имя, которое связала строка. Третья строка связала заново только x: у y осталось 7.

Так же и с покупкой: если после вычисления cost присвоить price = 50, стоимость останется 120, пока её не вычислят заново.

x = x + 1

Запись x = x + 1 не противоречие, а шаг вычисления.

count = 4count = count + 1print(count)
5

Сначала вычисляется правая часть с прежним значением count: 4 + 1 = 5. Потом имя count связывается с результатом:

После второй строки count связано с 5: справа от = взяли прежнее значение 4 и прибавили 1.

Сокращённая запись для этого случая — count += 1. Так же работают -=, *= и другие: x *= 2 означает x = x * 2.

Тонкости:запись count++

Если ты встречал другие языки программирования: записи count++ в Python нет. Увеличение на единицу пишут count += 1.

Тип у значения

Тип принадлежит значению, а не имени. Одно имя можно связать сначала с целым числом, а затем со строкой:

value = 10print(type(value))value = "десять"print(type(value))
<class 'int'> <class 'str'>

type(value) сообщает тип того значения, с которым имя связано сейчас.

Тонкости:имена и объекты

Строже говоря, в памяти Python хранятся объекты — значения вместе с их типом, а имя только ссылается на объект. Поэтому «переменная хранит значение» — упрощение, а возможность связывать одно имя со значениями разных типов называют динамической типизацией. Разница между «хранит» и «ссылается» станет важна в уроке о списках: там два имени могут ссылаться на один список, и изменение через одно имя видно через другое.

Но смешивать типы в одной операции Python сам не станет:

print(10 + "5")
TypeError: unsupported operand type(s) for +: 'int' and 'str'

TypeError — ошибка неподходящего типа: число и строку нельзя сложить. Это исключение, как деление на ноль в прошлом уроке: запись верная, но выполнить её нельзя. Python не угадывает, нужно ли 15 или "105". Как превратить строку в число и обратно, разберём в уроке «Ввод, преобразование и вывод».

Хорошие имена

Хорошее имя объясняет смысл значения. price и quantity понятнее, чем a и b: через неделю ты сразу вспомнишь, что они значат. Слова в имени разделяют подчёркиванием: max_value, student_name.

Имя состоит из букв, цифр и знака _ и не начинается с цифры: price2 подходит, 2price — нет. Пробелов в имени не бывает: student name — это уже два имени подряд. Регистр различается: count и Count — разные имена, как print и Print в прошлом уроке. Служебные слова языка именами быть не могут — среди них уже знакомые True, False и None. Русские буквы Python в именах допускает, но так не принято: имена пишут английскими словами.

Не занимай имена, которые уже что-то значат в Python: print, type, int, str. Python разрешит такое присваивание, но имя потеряет прежний смысл:

print = 5print("Привет")
TypeError: 'int' object is not callable

После первой строки имя print связано с числом 5, и печатать им уже нельзя.

В прошлом уроке в коде встречались пояснения после #. Их называют комментариями: Python пропускает всё от # до конца строки. Комментарий пишут, когда смысл значения не виден из кода:

discount = 10  # Скидка в процентах, а не в рублях

Итог

За урок числа из задачи о тетрадях получили типы и имена. Вот что из этого понадобится в каждом следующем уроке.

  • ТипВид значения: int — целое число, float — дробное (через точку), str — строка, текст в кавычках. Тип сообщает type(...).
  • "27" + "3"От типа зависит действие: числа складываются, строки склеиваются — "273", а не 30.
  • ПрисваиваниеСначала вычисляется правая часть, затем имя слева связывается с результатом. Формула не запоминается.
  • ПеременнаяИмя, связанное со значением. До присваивания имени нет: обращение к нему даёт NameError.
  • count += 1То же, что count = count + 1: к прежнему значению прибавляется 1, имя связывается с новым.
  • 10 + "5"TypeError: Python не смешивает типы в одной операции и не угадывает, что имелось в виду.
  • ИменаБуквы, цифры и _, не с цифры, без пробелов, не служебное слово. Имя называет смысл значения и не занимает print, type, str.
  • КомментарийПояснение после #: Python его пропускает.

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

Ответь сначала сам, потом открой ответ.

Вопрос 1

Какой тип у значений 40, "40" и 4.0?

ОтветСкрыть ответ
Ответ

int, str и float: кавычки делают значение строкой, а запись с точкой — дробным числом, даже если дробная часть нулевая.

Вопрос 2

С какими значениями связаны имена a и b после каждой строки программы?

a = 1b = a + 1a = b * 3b = a - b
ОтветСкрыть ответ
Ответ

После строки 1: a = 1, b ещё нет. После строки 2: a = 1, b = 2. После строки 3: a = 6, b = 2. После строки 4: a = 6, b = 4 — правая часть берёт текущие значения 6 и 2.

Вопрос 3

Программа из двух строк print(total) и total = 150 остановилась. Какая это ошибка и как исправить программу?

ОтветСкрыть ответ
Ответ

NameError: name 'total' is not defined: первая строка обращается к имени, которое появится только во второй. Строки нужно поменять местами.

Вопрос 4

Программа print(10 + "5") остановилась. Какой тип ошибки в последней строке сообщения и как исправить запись, чтобы напечаталось 15?

ОтветСкрыть ответ
Ответ

TypeError: число нельзя сложить со строкой. Чтобы получить 15, убери кавычки: print(10 + 5).

Вопрос 5

Какие из имён не подойдут для переменной и почему: total_price, 3d, None, print?

ОтветСкрыть ответ
Ответ

3d начинается с цифры, а None — служебное слово: оба вызовут ошибку. print Python примет, но после такого присваивания печатать через print будет нельзя. Подходит только total_price.

Практика

Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.

Что напечатает программа?

print с двумя значениями через запятую печатает их в одну строку через пробел.

a = 3b = aa += 4print(a, b)

Запишите напечатанную строку: два числа через пробел, сначала a, затем b.

Какой тип у значений 18, "18" и 2.5?

Какой тип у значений 18, "18" и 2.5?

Запишите короткие имена типов через пробел в порядке значений, без <class …>.

Что напечатает программа?

x = 5x = x * 2x = x + 1print(x)

Введите число.

Что напечатает программа?

price = 40quantity = 3cost = price * quantityprice = 50print(cost)

Введите число.

Что напечатает программа?

print("12" + "8")print(12 + 8)

Запишите напечатанные строки через пробел в порядке вывода.

Какие из имён допустимы: 2nd_place, max_value, my name, None, total?

Какие из имён допустимы для переменной: 2nd_place, max_value, my name, None, total?

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

Напиши программу: общая стоимость тетрадей и ручек в переменной total

Тетрадь стоит 40 рублей, ручка — 15. Куплено 3 тетради и 2 ручки. Напиши программу: заведи переменные для цен и количеств, вычисли общую стоимость в переменной total и выведи её. Запусти программу и запиши, что она напечатала.

Введите число.