Давайте посмотрим на пример кода ниже, как вы думаете, есть ли в нем какая-то проблема?
Предположим, у нас есть список оценок, и мы хотим присвоить им буквенные оценки на основе следующей шкалы:
- 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
.