Глава 13 · Автоматизация с помощью функций
Рефакторим проекты главы 12
Возьмём три готовых проекта прошлой главы и превратим их из одного длинного скрипта в набор понятных функций — поведение снаружи останется тем же.
Рефакторинг: меняем структуру, не меняем поведение
Рефакторинг
Рефакторинг — улучшение внутренней структуры программы без намеренного изменения того, что она должна делать снаружи. Мы уже видели этот термин в главе 12 (§12.9, Викторина) — здесь применим его к нескольким проектам подряд.
Викторина
viktorina_do.py
# ДО — один длинный скрипт (глава 12, §12.9)
score = 0
for q in questions:
user_answer = input(q["question"] + " ").strip().lower()
if user_answer == q["answer"]:
score += 1
viktorina_posle.py
def ask_question(question):
return input(question["question"] + " ").strip().lower()
def check_answer(user_answer, question):
return user_answer == question["answer"]
def run_quiz(questions):
score = 0
for q in questions:
user_answer = ask_question(q)
if check_answer(user_answer, q):
score += 1
return score
Анализатор текста
analizator_posle.py
def normalize_text(text):
return text.lower().split()
def count_words(words):
return len(words)
def count_unique(words):
return len(set(words))
Записная книжка
zapisnaya_knizhka_posle.py
def add_contact(contacts, name, phone):
contacts[name] = phone
def find_contact(contacts, name):
return contacts.get(name)
def remove_contact(contacts, name):
del contacts[name]
Главная программа становится читаемым описанием алгоритма
do_glavnaya.py
text = input("Текст: ")
text = text.lower()
words = text.split()
count = len(words)
unique = set(words)
unique_count = len(unique)
counts = {}
for word in words:
counts[word] = counts.get(word, 0) + 1
# ... ещё 40 строк ...
posle_glavnaya.py
text = input("Текст: ")
clean = normalize_text(text)
stats = analyze_text(clean)
show_report(stats)
Главный выигрыш рефакторинга — читаемость верхнего уровня
Правая версия читается почти как обычное предложение: «получить текст, нормализовать, проанализировать, показать отчёт». Вся сложность спрятана внутри отдельных функций — и каждую из них можно понять, протестировать и исправить независимо.
★★★ Задача повышенной сложности
Turtle тоже рефакторится
Возьмите код ёлки или мандалы из главы 12 и выделите отдельную функцию для одного яруса/луча — точно так же, как студия многоугольников в §13.26 выделяет draw_polygon().
Практика: рефакторинг проекта из главы 12
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки