Глава 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, без установки
Открыть практику →