От чисел к тексту
В прошлом уроке мы считали числа и выводили результат. Но настоящие программы общаются с человеком словами: «Привет, Анна», «Итого: 300 рублей», «Сколько вам лет?». Для этого нужны строки — текст. А чтобы программа умела что-то спрашивать, есть функция input(). В этом уроке мы соединим то и другое и сделаем первый маленький диалог.
Если вы вышли из REPL — снова откройте его командой python3.
Что такое строка
Строка — это текст в кавычках. Кавычки могут быть двойные или одинарные, Python не различает их:
>>> name = "Анна"
>>> greeting = 'Привет'
>>> name
'Анна'
Кавычки нужны именно для того, чтобы отличить текст от кода. Без кавычек Анна Python принял бы за имя переменной и стал бы её искать (и не нашёл бы). А "Анна" в кавычках — это просто буквы, набор символов, с которым Python не пытается ничего делать, кроме как хранить и показывать. Если внутри текста нужны сами кавычки, удобно взять внешние кавычки другого вида: 'Он сказал "привет"'.
У строки есть длина — сколько в ней символов. Узнать её можно функцией len():
>>> len("привет")
6
>>> len("")
0
Пустые кавычки "" — это тоже строка, просто без единого символа, её длина ноль. Такая «пустая строка» часто используется как стартовое значение, к которому потом что-то добавляют.
Строки можно склеивать знаком + — это называется конкатенация:
>>> "Привет, " + "мир"
'Привет, мир'
>>> name = "Анна"
>>> "Привет, " + name
'Привет, Анна'
Важно: складывать можно только строку со строкой. Если попробовать приклеить число к тексту через +, Python остановится с ошибкой:
>>> "Вам лет: " + 25
TypeError: can only concatenate str (not "int") to str
Python говорит прямым текстом: к строке можно приклеить только строку, а не int. Эту ошибку вы будете видеть часто — она означает «ты смешал текст и число». Как это лечится, увидим через минуту.
f-строки — текст со вставками
Склеивать через + неудобно: приходится расставлять пробелы и кавычки вручную, а числа вообще не приклеиваются. Поэтому в Python есть гораздо более удобный инструмент — f-строки. Это обычная строка, перед которой стоит буква f, а внутри в фигурных скобках можно вставлять значения переменных и выражения:
>>> name = "Анна"
>>> age = 25
>>> f"Привет, {name}! Тебе {age} лет."
'Привет, Анна! Тебе 25 лет.'
Python берёт всё, что внутри фигурных скобок, вычисляет и подставляет прямо в текст. Числа подставляются без всяких ошибок — это и есть главное удобство:
>>> price = 100
>>> quantity = 3
>>> print(f"Итого: {price * quantity} рублей")
Итого: 300 рублей
Внутри скобок может быть не только имя переменной, но и любое выражение — например, арифметика price * quantity. Сравните это с громоздким print("Итого:", price * quantity, "рублей") из прошлого урока — f-строка читается куда понятнее. С этого момента для вывода с подстановками мы используем именно f-строки.
Запомнить просто: буква f перед кавычкой — «format», то есть «подставь сюда значения». Без f фигурные скобки останутся обычным текстом и ничего не подставится.
input() — спросить пользователя
Функция input() останавливает программу и ждёт, пока человек что-то наберёт и нажмёт Enter. То, что он ввёл, становится значением, которое можно сохранить в переменную. В скобки input() можно положить подсказку — текст, который покажется перед вводом:
>>> name = input("Как тебя зовут? ")
Как тебя зовут? Анна
>>> print(f"Привет, {name}!")
Привет, Анна!
Здесь Анна — то, что набрал пользователь. Программа сохранила это в name и поздоровалась.
Есть один момент, на котором спотыкаются все новички: input() всегда возвращает строку, даже если вы ввели число. Для Python "25" (текст) и 25 (число) — разные вещи. Посмотрите, что выйдет, если попытаться посчитать на «числе», полученном из input:
>>> age = input("Сколько тебе лет? ")
Сколько тебе лет? 25
>>> age + 1
TypeError: can only concatenate str (not "int") to str
Снова та же ошибка! Python воспринял 25 как текст "25", а к тексту нельзя прибавить число. Чтобы превратить текст в число, его нужно явно сконвертировать функцией int() (для целого) или float() (для дробного):
>>> age = input("Сколько тебе лет? ")
Сколько тебе лет? 25
>>> age = int(age)
>>> age + 1
26
Часто это пишут в одну строку — сразу оборачивают input(...) в int(...):
>>> age = int(input("Сколько тебе лет? "))
Сколько тебе лет? 25
>>> print(f"Через год тебе будет {age + 1}")
Через год тебе будет 26
Правило, которое спасёт вам много нервов: ввели число — не забудьте int() или float(), иначе оно останется текстом.
Как выбрать между int() и float()? Если значение по смыслу целое (возраст, количество, год) — берите int(). Если оно может быть дробным (цена, рост, средний балл) — берите float(). Конвертация сработает только если в строке действительно записано число: int("25") даёт 25, а int("привет") упадёт с ошибкой ValueError — Python не сможет превратить буквы в число. Пока что вводите числа аккуратно, а корректную обработку «кривого» ввода мы разберём позже, когда познакомимся с условиями и исключениями.
Попробуй сам
Откройте REPL и соберите диалог пошагово. Сначала просто имя:
>>> name = input("Имя: ")
Имя: Иван
>>> city = input("Город: ")
Город: Москва
>>> print(f"{name} из города {city}")
Иван из города Москва
Теперь — с числом и арифметикой. Спросите год рождения и посчитайте возраст. Не забудьте int():
>>> year = int(input("Год рождения: "))
Год рождения: 1998
>>> print(f"Тебе примерно {2026 - year} лет")
Тебе примерно 28 лет
Проверка, что вы поняли главное: если убрать int() вокруг input в примере выше — что произойдёт? (Ответ: 2026 - year упадёт с TypeError, потому что year останется строкой, а из числа нельзя вычесть текст.)
В следующем уроке мы возьмём всё это и сложим в настоящий файл-скрипт, который запускается командой python3 и делает что-то полезное.