Глава 12 · Множество увлекательных мини-проектов!

Проекты: журнал оценок и корзина покупок

Одна и та же модель данных — список словарей — и один и тот же приём — накопитель, применённый в двух разных задачах.

Используем
listdictциклынакопитель
Уровень
★★★ интеграционный
Результат
отчёт / чек

Два проекта на одной странице специально: у обоих одна и та же модель данных — " список словарей — и один и тот же приём — накопитель (глава 10), только применённый по-разному.

Проект: журнал оценок

students (список)
[0]
name → "Anna"
score → 95
[1]
name → "Bob"
score → 82
Список словарей — почему list? Потому что ученики образуют упорядоченную последовательность записей
zhurnal_ocenok.py
students = [
    {"name": "Anna", "score": 95},
    {"name": "Bob", "score": 82},
    {"name": "Maria", "score": 91},
    {"name": "Leo", "score": 58},
]

for student in students:
    print(f"{student['name']}: {student['score']}")

scores = [student["score"] for student in students]
average = sum(scores) / len(scores)
print(f"Средний балл: {average:.1f}")
print("Максимум:", max(scores))
print("Минимум:", min(scores))

otlichniki = [s for s in students if s["score"] >= 90]
print("Отличников:", len(otlichniki))
Классификация через if/elif
Если нужна не просто фильтрация, а оценка «отлично/хорошо/пересдача», к каждому студенту можно применить цепочку if/elif/else из главы 9 — это не про реальные школьные критерии, а про тренировку алгоритма классификации.

Проект: корзина покупок

товарцена × количествосумма по строкеline totalнакопительcart total
Каждый товар даёт свою сумму, накопитель складывает их все вместе
korzina_pokupok.py
cart = [
    {"name": "Молоко", "price": 4.50, "qty": 2},
    {"name": "Хлеб", "price": 2.20, "qty": 1},
    {"name": "Сыр", "price": 9.90, "qty": 1},
]

total = 0
for item in cart:
    line_total = item["price"] * item["qty"]
    total += line_total
    print(f"{item['name']:<10} {item['qty']} x {item['price']:.2f} = {line_total:.2f}")

print(f"Итого: {total:.2f}")
Молоко     2 x 4.50 = 9.00
Хлеб       1 x 2.20 = 2.20
Сыр        1 x 9.90 = 9.90
Итого: 21.10
Чек — детерминированный пример выполнения
Это учебная арифметика, не Decimal
Для настоящих денежных расчётов используют более точные типы (например decimal.Decimal), чтобы избежать неточностей float (глава 5). Здесь используется обычная арифметика — целей главы 12 это не меняет: фокус на структуре программы, а не на денежной точности.

Debug Lab

Почему в этом коде total в конце равен сумме только ПОСЛЕДНЕГО товара?

debug_lab_korzina.py
for item in cart:
    total = 0
    total += item["price"] * item["qty"]
Накопитель обнуляется внутри цикла
Та же ошибка, что уже встречалась в §12.2 и §12.5: total = 0 стоит внутри тела цикла, поэтому пересоздаётся на каждой итерации. Инициализация накопителя должна быть ОДИН раз, до цикла.
Практика: журнал оценок — среднее, максимум, минимум, отличники
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →
Практика: корзина покупок — чек и итоговая сумма
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →