Глава 12 · Множество увлекательных мини-проектов!
Проекты: журнал оценок и корзина покупок
Одна и та же модель данных — список словарей — и один и тот же приём — накопитель, применённый в двух разных задачах.
Используем
listdictциклынакопительУровень
★★★ интеграционный
Результат
отчёт / чек
Два проекта на одной странице специально: у обоих одна и та же модель данных — " список словарей — и один и тот же приём — накопитель (глава 10), только применённый по-разному.
Проект: журнал оценок
students (список)
[0]
name → "Anna"
score → 95
[1]
name → "Bob"
score → 82
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 — это не про реальные школьные критерии, а про тренировку алгоритма классификации.Проект: корзина покупок
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, без установки