Нашли ошибку?

Кэш цен на билеты

СредняяНайти ошибку2 ошибкиГлава 5

#хеш-таблицы#кэшированиеid: ga-trip-cost-cache

Маршрут — список городов, в том числе повторяющихся. Цену билета в город возвращает fetch_price(city), но каждый вызов — медленный запрос к серверу. Функция trip_cost(route, fetch_price) считает полную стоимость маршрута и должна запрашивать цену каждого города не больше одного раза, храня ответы в кэше. В функции две ошибки — найдите и исправьте их.

Пример

prices = {"Казань": 3000, "Сочи": 5000}
trip_cost(["Казань", "Сочи", "Казань"], prices.__getitem__)  # 11000, два запроса

Решение

from collections.abc import Callable


def trip_cost(route: list[str], fetch_price: Callable[[str], int]) -> int:
    """Сумма цен по маршруту; цена каждого города запрашивается один раз."""
    total = 0
    for city in route:
        cache: dict[str, int] = {}
        if city not in cache:
            cache[city] = fetch_price(city)
        total += fetch_price(city)
    return total

Можно решать и в своём редакторе: «Скопировать с тестами» и запустите python3 trip_cost_cache.py — тесты те же, результат покажет ✓ / ✗ и итог.