РАЗБИРАЕМ ПО ШАГАМ
От идеи к работающему коду
Большая программа становится понятнее, если её части решают небольшие задачи. Научимся соединять функции, выбирать параметры и повторно использовать готовые решения.
Сразу к запуску примера ↓
- 1Разделить задачу
- 2Написать маленькие функции
- 3Соединить и проверить
1. Одна функция — понятная ответственность
Название функции должно объяснять её действие: count_vowels считает гласные, а не печатает меню и не сохраняет файл. Чем яснее границы, тем проще найти ошибку.
Сначала определяем вход и выход каждой части, затем реализуем её отдельно. В русскоязычном примере явно перечисляем гласные: правило не должно зависеть от догадок программы.
def count_vowels(text): total = 0 for char in text.casefold(): if char in "аеёиоуыэюя": total += 1 return totalprint(count_vowels("Барсик"))2. Один результат помогает получить другой
Функция может возвращать несколько связанных результатов: например, количества гласных и согласных. Запись return vowels, consonants возвращает пару значений — кортеж. Знаки препинания и цифры не должны становиться согласными.
Договоримся, что в этой задаче текст русский, а ь и ъ не считаем ни гласными, ни согласными. Правило задачи важнее короткой, но неверной формулы.
def letter_counts(text): vowels = 0 consonants = 0 for char in text.casefold(): if char in "аеёиоуыэюя": vowels += 1 elif char in "бвгджзйклмнпрстфхцчшщ": consonants += 1 return vowels, consonantsprint(letter_counts("Барсик!"))3. Параметры по умолчанию
Необязательный параметр задаёт значение для вызовов, где аргумент не передали. message("Анна") использует обычное приветствие, а message("Анна", "Добрый вечер") — переданное.
Значения по умолчанию вычисляются при определении функции. Не используй изменяемый список [] как накопитель по умолчанию: он будет общим для вызовов. Для наших текстовых настроек строки подходят.
def message(name, greeting="Привет"): return f"{greeting}, {name}!"print(message("Анна"))print(message("Анна", "Добрый вечер"))4. Сначала особое правило, затем общее
Склонение «кристалл» зависит от последних цифр. Для 11–14 действует особый вариант, даже когда последняя цифра похожа на 1, 2, 3 или 4. Поэтому эту проверку ставим первой.
Операции % 100 и % 10 выделяют последние две и последнюю цифру. Функция возвращает форму слова, а внешний код соединяет её с числом.
def crystal_word(number): number = abs(number) if 11 <= number % 100 <= 14: return "кристаллов" if number % 10 == 1: return "кристалл" if 2 <= number % 10 <= 4: return "кристалла" return "кристаллов"for number in [1, 2, 11, 21, 114]: print(number, crystal_word(number))Где легко ошибиться
- Смешать чтение ввода с преобразованием данных во всех функциях.
- Проверять последнюю цифру раньше исключения 11–14.
- Считать цифры и знаки согласными буквами.
Проверь понимание: Почему для 11 нельзя сначала проверять последнюю цифру 1?
Получится «11 кристалл». Сначала нужен особый случай 11–14, затем общее правило последней цифры.
