Выбор ответа Junior Исключения и контекстные менеджеры обновлено

EAFP и LBYL

Вопрос

Почему в Python часто предпочитают try: value = d[key] except KeyError: вместо if key in d:?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: EAFP: одна операция вместо двух и нет гонки. EAFP («проще попросить прощения») избавляет от двойного поиска и от состояния гонки, когда между проверкой и действием мир меняется (файл удалили, ключ убрали в другом потоке). in для словаря O(1) и работает для любых хешируемых ключей.

Варианты ответа

  1. Проверка in для словаря работает за O(n), а d[key] за O(1)
  2. if key in d не работает для строковых ключей с юникодом
  3. EAFP: одна операция вместо двух и нет гонкиправильный ответ
  4. Исключения в Python бесплатны в любом случае

Разбор

EAFP («проще попросить прощения») избавляет от двойного поиска и от состояния гонки, когда между проверкой и действием мир меняется (файл удалили, ключ убрали в другом потоке). in для словаря O(1) и работает для любых хешируемых ключей. Исключения не бесплатны: если отсутствие ключа частый сценарий, d.get() или in быстрее.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.