Модуль 1 · Урок 1.2
Значения, типы и переменные
Чем число отличается от текста, как дать значению имя и что происходит при присваивании.
В прошлом уроке ты считал стоимость трёх тетрадей: print(3 * 40). Числа в этой записи безымянные: по коду не видно, где цена, а где количество. В этом уроке у значений появятся имена, а заодно выяснится, почему 40 и "40" для Python — разные данные.
Сначала разберём, какими бывают значения, затем — как дать значению имя и что происходит, когда то же имя связывают с новым значением.
Число и текст
Число и текст — разные данные, даже если выглядят одинаково. 27 — число. "27" — текст: ты помнишь из прошлого урока, что кавычки делают запись текстом. С числами выполняют арифметику, а текст можно соединить с другим текстом:
print(27 + 3)print("27" + "3")Текст в кавычках в Python называют строкой — это строка символов. Не путай её со строкой программы: в одной строке программы print("27" + "3") записаны две строки — "27" и "3".
Знак + один и тот же, но числа он складывает, а строки склеивает:
"27" — два символа подряд. Поэтому + у чисел даёт 30, а у строк — три символа «273».Тип значения — его вид: 27 — целое число, "27" — строка. От типа зависит, что Python делает со значением: ты только что видел, что + у чисел и у строк работает по-разному. Тип значения сообщает type(...):
print(type(27))print(type("27"))print(type(2.5))В выводе важно короткое имя типа в кавычках: int, str, float. Для первых программ этих трёх типов хватит:
int — для счёта и точных вычислений, дробные float (их ещё называют числами с плавающей точкой) — для измерений и долей. Строка str — любой текст, даже из одних цифр или пустой: "".Дробную часть в Python отделяют точкой, а не запятой. Запятая в коде разделяет значения, поэтому print(2,5) напечатает не дробь, а два числа:
print(2.5)print(2,5)Ещё два типа — bool (ответ «да» или «нет») и None («значения нет») — понадобятся в уроках об условиях и функциях. Остальные типы появятся вместе с задачами, для которых они нужны.
Присваивание
Чтобы дать значению имя, пишут имя, знак = и значение. Так записывается покупка из прошлого урока:
price = 40quantity = 3cost = price * quantityprint(cost)Первые две строки связывают имя price с числом 40, а quantity — с числом 3. В третьей справа от = стоит выражение: Python сначала вычисляет его из текущих значений и только потом связывает имя cost с результатом 120. Такая инструкция называется присваиванием, а имя, связанное со значением, — переменной. Говорят и короче: «переменная cost получила значение 120».
price и quantity дают 40 и 3, выражение — 120. Только потом имя cost слева связывается с готовым числом.Имя появляется только после присваивания. Если напечатать cost раньше, программа остановится с NameError — той же ошибкой, что у pritn в прошлом уроке:
print(cost)cost = 120Знак = в Python — не равенство из математики, а действие: связать имя со значением в тот момент, когда выполняется строка. Нажми «Запуск» в шапке примера и пройди программу по шагам: рядом с кодом видно, с каким значением связано каждое имя.
x = 5y = x + 2x = 100print(y)Во второй строке x + 2 вычисляется сразу: имя y связывается с числом 7, а не с формулой. Третья строка связывает с новым значением только x, поэтому программа печатает 7. Вот значения после каждой строки:
x: у y осталось 7.Так же и с покупкой: если после вычисления cost присвоить price = 50, стоимость останется 120, пока её не вычислят заново.
x = x + 1
Запись x = x + 1 не противоречие, а шаг вычисления.
count = 4count = count + 1print(count)Сначала вычисляется правая часть с прежним значением 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))type(value) сообщает тип того значения, с которым имя связано сейчас.
Тонкости:имена и объекты
Строже говоря, в памяти Python хранятся объекты — значения вместе с их типом, а имя только ссылается на объект. Поэтому «переменная хранит значение» — упрощение, а возможность связывать одно имя со значениями разных типов называют динамической типизацией. Разница между «хранит» и «ссылается» станет важна в уроке о списках: там два имени могут ссылаться на один список, и изменение через одно имя видно через другое.
Но смешивать типы в одной операции Python сам не станет:
print(10 + "5")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("Привет")После первой строки имя 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 его пропускает.
Проверьте себя
Ответь сначала сам, потом открой ответ.
Какой тип у значений 40, "40" и 4.0?
ОтветСкрыть ответ
int, str и float: кавычки делают значение строкой, а запись с точкой — дробным числом, даже если дробная часть нулевая.
С какими значениями связаны имена 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.
Программа из двух строк print(total) и total = 150 остановилась. Какая это ошибка и как исправить программу?
ОтветСкрыть ответ
NameError: name 'total' is not defined: первая строка обращается к имени, которое появится только во второй. Строки нужно поменять местами.
Программа print(10 + "5") остановилась. Какой тип ошибки в последней строке сообщения и как исправить запись, чтобы напечаталось 15?
ОтветСкрыть ответ
TypeError: число нельзя сложить со строкой. Чтобы получить 15, убери кавычки: print(10 + 5).
Какие из имён не подойдут для переменной и почему: total_price, 3d, None, print?
ОтветСкрыть ответ
3d начинается с цифры, а None — служебное слово: оба вызовут ошибку. print Python примет, но после такого присваивания печатать через print будет нельзя. Подходит только total_price.
Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Что напечатает программа?
print с двумя значениями через запятую печатает их в одну строку через пробел.
a = 3b = aa += 4print(a, b)Запишите напечатанную строку: два числа через пробел, сначала a, затем b.
Подсказка
b = a связывает b с тем же числом, что и a. Следующая строка связывает с новым числом только a.
Разбор
b = a связывает b с числом 3. a += 4 вычисляет 3 + 4 и связывает с 7 только a; b по-прежнему связано с 3.
Ответ: 7 3
Какой тип у значений 18, "18" и 2.5?
Какой тип у значений 18, "18" и 2.5?
Запишите короткие имена типов через пробел в порядке значений, без <class …>.
Подсказка
Кавычки делают значение строкой, даже если внутри одни цифры. Точка в записи числа — признак дробного числа.
Разбор
18 — целое число (int), "18" — строка (str): в кавычках, хоть и из цифр. 2.5 — дробное число (float).
Ответ: int str float
Что напечатает программа?
x = 5x = x * 2x = x + 1print(x)Введите число.
Подсказка
Каждая строка берёт текущее значение x, вычисляет правую часть и связывает x с результатом.
Разбор
После первой строки x связано с 5, после второй — с 5 * 2 = 10, после третьей — с 10 + 1 = 11.
Ответ: 11
Что напечатает программа?
price = 40quantity = 3cost = price * quantityprice = 50print(cost)Введите число.
Подсказка
Присваивание запоминает результат, а не формулу: cost вычислено, когда цена была 40.
Разбор
cost связано с 120 — результатом 40 * 3. Строка price = 50 связывает с новым числом только price; cost не пересчитывается.
Ответ: 120
Что напечатает программа?
print("12" + "8")print(12 + 8)Запишите напечатанные строки через пробел в порядке вывода.
Подсказка
В кавычках — строки: + ставит их символы подряд. Без кавычек — числа: + их складывает.
Разбор
Первая строка склеивает строки "12" и "8" и печатает 128. Вторая складывает числа и печатает 20.
Ответ: 128 20
Какие из имён допустимы: 2nd_place, max_value, my name, None, total?
Какие из имён допустимы для переменной: 2nd_place, max_value, my name, None, total?
Запишите допустимые имена через пробел в том порядке, в каком они даны в условии.
Подсказка
Имя состоит из букв, цифр и _, не начинается с цифры, не содержит пробелов и не совпадает со служебным словом.
Разбор
2nd_place начинается с цифры, в my name пробел, None — служебное слово. Допустимы max_value и total.
Ответ: max_value total
Напиши программу: общая стоимость тетрадей и ручек в переменной total
Тетрадь стоит 40 рублей, ручка — 15. Куплено 3 тетради и 2 ручки. Напиши программу: заведи переменные для цен и количеств, вычисли общую стоимость в переменной total и выведи её. Запусти программу и запиши, что она напечатала.
Введите число.
Подсказка
total — сумма двух произведений: цена тетради на число тетрадей плюс цена ручки на число ручек.
Разбор
Например:
notebook_price = 40pen_price = 15notebooks = 3pens = 2total = notebook_price * notebooks + pen_price * pensprint(total)3 · 40 + 2 · 15 = 120 + 30 = 150.
Ответ: 150