Давайте посмотрим на пример кода ниже, как вы думаете, есть ли в нем какая-то проблема?

Предположим, у нас есть список оценок, и мы хотим присвоить им буквенные оценки на основе следующей шкалы:

  • A: 90–100
  • B: 80–89
  • C: 70–79
  • D: 60–69
  • Ж: ниже 60

Через несколько секунд вы можете подумать, что все в порядке, но почему-то код просто пахнет.

Ваше шесть чувств сказали, что вы должны оптимизировать его, потому что в нем слишком много ветвей if/else.

Наличие слишком большого количества ветвей if/else в вашем коде может затруднить его чтение, понимание и поддержку. Это также может сделать его более подверженным ошибкам и ошибкам, поскольку оно становится более сложным и трудным для тестирования.

Когда блок кода имеет слишком много ветвей if/else, это часто означает, что существует слишком много условий для проверки и слишком много возможных путей для кода. Это может затруднить прогнозирование того, что будет делать код и какие входные данные приведут к каким результатам. Это также усложняет рефакторинг кода или добавление новых функций, поскольку необходимо учитывать и тестировать каждую ветвь.

В общем, лучше попытаться упростить логику вашего кода и разбить его на более мелкие, более управляемые части. Это может облегчить понимание, тестирование и поддержку, а также может помочь снизить риск ошибок и багов. Вы можете использовать такие методы, как извлечение повторяющегося кода в функции, использование полиморфизма для обработки различных случаев или использование структур данных для упрощения условной логики.

Как оптимизировать?

В Python модуль bisect можно использовать для упрощения кода, включающего множество ветвей if/else. Модуль bisect предоставляет функции для поиска точки вставки значения в отсортированном списке, которые можно использовать для замены длинных блоков if/else.

Мы можем использовать модуль bisect для упрощения кода следующим образом:

Здесь мы сначала определяем пороговые значения для каждой буквенной оценки и соответствующих букв. Затем мы перебираем каждую оценку и используем bisect_right, чтобы найти точку вставки оценки в списке cutoffs. Точка вставки сообщает нам, к какой буквенной оценке относится оценка. Затем мы используем список letters, чтобы получить соответствующую буквенную оценку, и распечатываем ее.

Этот код более лаконичен и легче читается по сравнению с использованием множества блоков if/else. Это также позволяет легко настроить шкалу оценок, просто изменив списки cutoffs и letters.