💻 Примеры перед практикой

← К оглавлению урока

⚡ Шпаргалка практикума

distance = int(input("Расстояние (км): "))
speed = int(input("Скорость (км/ч): "))
total_minutes = int(distance / speed * 60)
hours = total_minutes // 60
minutes = total_minutes % 60
print("Время в пути:", hours, "ч", minutes, "мин")
# Время в пути: 7 ч 39 мин
ЗадачаПриём
Число из вводаint(input(...)) / float(input(...))
Строка + число"..." + str(x) + "...", иначе TypeError
Часы/минуты, недели/дниперевести всё в одну единицу, затем // и %
Цифры числаn // 1000, n % 10, (n % 1000) // 10
Топ-3 ошибки: забыли int()/float() перед арифметикой · потеряли str() при склейке текста с числом через + · превратили n в число раньше времени и потеряли повторение цифры для nn/nnn.

Практикум опирается всего на несколько инструментов из уроков 02 и 04: input()/print(), преобразование типов и четыре арифметических оператора. Примеры ниже собирают эти инструменты в общую картину — от одиночного приёма к комбинациям, которые встречаются в задачах practicum'а. Весь вывод в комментариях получен запуском кода, а не подобран вручную.

Пример 1. input() всегда возвращает строку

Это первый факт, из-за которого «падают» половина задач практикума: даже если пользователь ввёл 22, Python видит текст "22". Арифметика со строкой либо не работает, либо работает не так, как ожидалось.

age_text = "22"
print(type(age_text))   # <class 'str'>
age = int(age_text)
print(type(age))        # <class 'int'>
print(age + 1)           # 23

try:
    print("25" + 5)
except TypeError as error:
    print("TypeError:", error)
    # can only concatenate str (not "int") to str

Что происходит: строку и число нельзя сложить оператором + — Python не угадывает, что имелось в виду: число или ещё один кусок текста. Отсюда правило: если значение из input() участвует в вычислениях — конвертируйте его в число сразу, одной строкой с input().

Пример 2. Склейка строк: + и str(), альтернатива — print с запятыми

Анкета из практикума собирает предложение из кусочков. Если один из кусочков — число, его нужно явно превратить в строку через str(), иначе получится та же ошибка, что в примере 1.

name = "Анна"
age = 22
color = "синий"

message = "Меня зовут " + name + ", мне " + str(age) + " лет, и мой любимый цвет — " + color + "."
print(message)
# Меня зовут Анна, мне 22 лет, и мой любимый цвет — синий.

# print сам расставляет пробелы через sep=" " и умеет печатать числа как есть
print("Меня зовут", name + ",", "мне", age, "лет, и мой любимый цвет —", color + ".")
# Меня зовут Анна, мне 22 лет, и мой любимый цвет — синий.

Почему так: оператор + требует одинаковый тип с обеих сторон, поэтому число оборачивается в str(). У print с запятыми это не нужно — функция сама превращает каждый аргумент в текст и разделяет их пробелом (sep по умолчанию). Здесь запятая после имени и цвета приклеена к слову, чтобы не осталось пробела перед знаком препинания.

Пример 3. Кавычки и escape-последовательности

Кавычки внутри строки — частый источник SyntaxError. Способов избежать конфликта несколько, и каждый уместен в своей ситуации.

print("Она сказала: \"Привет!\"")     # экранирование обратным слэшем
print('Она сказала: "Привет!"')       # внешние кавычки другого вида
print("""Она сказала: "Привет!" """)  # тройные кавычки

print("Список дел:\n\tУчеба\n\tУборка\n\tСпорт")

Вывод программы:

# Она сказала: "Привет!"
# Она сказала: "Привет!"
# Она сказала: "Привет!"
# Список дел:
#     Учеба
#     Уборка
#     Спорт

Что происходит: \n — перенос строки, \t — табуляция, \" — буквальная кавычка вместо конца строки. Проще всего выбрать внешние кавычки так, чтобы внутри строки экранировать было нечего: если в тексте двойные кавычки — берите одинарные снаружи, и наоборот.

Пример 4. Семья операторов деления: /, //, %, divmod()

В практикуме постоянно нужно не просто «поделить», а получить целую часть и остаток отдельно — это и есть // и %. Урок 04 вводит для той же пары значений короткую запись — divmod().

distance = 120
speed = 45

print(distance / speed)        # 2.6666666666666665 — обычное деление, float
print(distance // speed)       # 2                    — целых раз
print(distance % speed)        # 30                   — остаток
print(divmod(distance, speed)) # (2, 30)               — то же самое парой

Как проверить себя: целая часть, умноженная на делитель, плюс остаток всегда равны исходному числу: 2 * 45 + 30 == 120. Если это равенство не выполняется — где-то перепутаны // и %.

Пример 5. Общий приём: перевести в одну единицу, потом разложить // и %

Часы/минуты и недели/дни в практикуме решаются одним и тем же приёмом. Он же работает для любой пары «крупная единица — мелкая единица», если крупная делится на мелкую нацело.

total_minutes = 200
hours = total_minutes // 60
minutes = total_minutes % 60
print("Общее время:", hours, "часа и", minutes, "минут")
# Общее время: 3 часа и 20 минут

total_days = 20
weeks = total_days // 7
days = total_days % 7
print("До события осталось:", weeks, "недель и", days, "дня.")
# До события осталось: 2 недель и 6 дня.

# тот же приём для объёма: сколько бутылок по 250 мл нальётся из 17 литров
liters = 17
milliliters = 250
full_bottles = liters * 1000 // milliliters
leftover = liters * 1000 % milliliters
print(full_bottles, "полных бутылок и", leftover, "мл останется")
# 68 полных бутылок и 0 мл останется

Почему так: вся хитрость — не решать задачу «в лоб» в смешанных единицах, а сначала пересчитать всё в самую мелкую (минуты, дни, миллилитры), а затем одним // получить крупную единицу и одним % — остаток мелкой.

Пример 6. Цифры числа через // и %

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

number = 1234
first_digit = number // 1000
last_digit = number % 10
middle_part = (number % 1000) // 10
new_number = last_digit * 1000 + middle_part * 10 + first_digit
print(new_number)  # 4231

digits_sum = number // 1000 + number // 100 % 10 + number // 10 % 10 + number % 10
print("Сумма цифр:", digits_sum)  # 10

У этой задачи есть и строковый путь — превратить число в текст и брать символы по индексу:

print(str(number)[0], str(number)[-1])  # 1 4
⚠️ Проверить по документации: индексация строк ([0], [-1]) выходит за рамки source этого практикума — тему строк подробно разбирает урок 14. Здесь пример показан только для сравнения подходов; сверьтесь с docs.python.org — str.

Что важно: оба пути дают одинаковый результат. Арифметический работает и без знания строк — но требует аккуратности со скобками, поэтому в задачах практикума используется именно он.

Пример 7. n + nn + nnn: почему нельзя конвертировать n сразу

Задача просит собрать число вида 777 из повторов цифры 7, а не утроить само число 7. Разница — в том, когда именно происходит преобразование str → int.

n = "7"              # намеренно оставляем строкой
nn = n + n            # "77"  — строки складываются как текст
nnn = n + n + n        # "777"
print(nn, nnn)         # 77 777

result = int(n) + int(nn) + int(nnn)
print(result)           # 861

# частая ошибка: конвертировать n в int раньше времени
n_num = 7
wrong_result = n_num + n_num + n_num
print("wrong:", wrong_result)  # 21 — это просто 7+7+7, не то, что просили

Почему так: пока n остаётся строкой, оператор + склеивает текст, и "7" + "7" даёт "77", а не 14. Числами эти три значения становятся только в последний момент, перед сложением. Это тот редкий случай в практикуме, где раннее преобразование в int() — ошибка, а не хорошая привычка.

Пример 8. Плотное выражение в одну строку → разложенные шаги

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

# всё в одной строке — работает, но проверить и объяснить сложно
print("Стоимость:", (int("650") / 100) * int("7") * int("55"))
# Стоимость: 2502.5

# то же самое по шагам — каждое значение можно напечатать отдельно
distance = 650
fuel_consumption = 7
fuel_price = 55

consumption_for_trip = (distance / 100) * fuel_consumption
total_cost = consumption_for_trip * fuel_price

print("Расход на поездку:", consumption_for_trip, "л")  # Расход на поездку: 45.5 л
print("Стоимость бензина для поездки:", total_cost)      # Стоимость бензина для поездки: 2502.5

Что происходит: результат в обоих случаях один — 2502.5. Но у разложенного варианта есть промежуточная переменная consumption_for_trip, которую можно напечатать и сверить с условием задачи отдельно от итоговой стоимости. Это и есть общее правило практикума: одна строка кода — не цель, читаемость и проверяемость важнее.

Пример 9. Подводный камень: float не всегда даёт «круглый» результат

В задачах с деньгами и дробным делением (время пути, стоимость бензина) результат — float. У чисел с плавающей точкой есть известное ограничение точности, которое стоит увидеть заранее, а не в момент, когда программа «внезапно» не сходится с ожидаемым ответом.

print(0.1 + 0.2)          # 0.30000000000000004
print(0.1 + 0.2 == 0.3)   # False

price_per_liter = 54.7
liters = 3
print(price_per_liter * liters)          # 164.10000000000002
print(round(price_per_liter * liters, 2)) # 164.1
⚠️ Проверить по документации: round() не входит в source этого практикума, но пригождается в похожих задачах на деньги. Сверьтесь с docs.python.org — round() и разделом Floating Point Arithmetic: Issues and Limitations.

Почему так: компьютер хранит дробные числа в двоичном виде, а не в десятичном, и некоторые «круглые» десятичные дроби (как 0.1) в двоичном виде круглыми не являются. Для вывода это обычно не страшно — лишний хвост цифр не портит смысл ответа, — но сравнивать два float оператором == нельзя без округления.

Пример 10. Собираем приём целиком: ввод → преобразование → расчёт → вывод

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

distance = int(input("Введите расстояние (в км): "))
speed = int(input("Введите среднюю скорость (в км/ч): "))

total_minutes = int(distance / speed * 60)
hours = total_minutes // 60
minutes = total_minutes % 60

print("Время в пути:", hours, "часа и", minutes, "минут")
# при вводе 613 и 80: Время в пути: 7 часа и 39 минут

Что дальше по теме: в этом уроке ввод считается «правильным» без проверок. Как отловить некорректный ввод (например, отрицательное расстояние), покажут условия в уроке 06 и уроке 08. А склейка строк через + и str() из примеров 2 и 7 уступит место f-строкам в уроке 22 — там же обсуждается округление вывода из примера 9.