Python. Почему методы поиска и индекса работают по-разному?
В Python find
и index
- очень похожие методы, используемые для поиска значений в типе последовательности. find
используется для строк, а index
- для списков и кортежей. Они оба возвращают наименьший индекс (самый дальний слева влево), который найден аргумент, предоставленный.
Например, оба из следующих возвратят 1
:
"abc".find("b")
[1,2,3].index(2)
Однако, одна вещь, о которой я несколько смущаюсь, состоит в том, что, хотя эти два метода очень похожи и заполняют почти ту же роль, только для разных типов данных, они имеют очень разные реакции на попытку найти что-то не в последовательность.
"abc".find("d")
Возвращает -1
, чтобы обозначить "не найден", а
[1,2,3].index(4)
вызывает исключение.
В принципе, почему у них разные виды поведения? Есть ли какая-то конкретная причина, или это просто странная несогласованность без особых причин?
Теперь я не спрашиваю, как бороться с этим – очевидно, будет работать блок try
/except
или условный оператор in
. Я просто спрашиваю, в чем причина, почему поведение в этом конкретном случае различно. Для меня было бы разумнее иметь определенное поведение, чтобы сказать не найденное, для обеспечения последовательности.
Кроме того, я не прошу мнения о том, является ли причина хорошей причиной или нет. Мне просто интересно, в чем причина.
Изменить: Некоторые указали, что строки также имеют метод index
, который работает как метод index
для списков, который я признаю, что я не знал, но это просто заставляет меня задаться вопросом, почему, если строки имеют оба, списки имеют только index
.
Ответы
Ответ 1
Это всегда было неприятно;-) Вопреки одному ответу, нет ничего особенного в отношении -1 по отношению к строкам; например.
>>> "abc"[-1]
'c'
>>> [2, 3, 42][-1]
42
Проблема с find()
на практике заключается в том, что -1 действительно является не специальным как индекс. Поэтому код, использующий find()
, подвержен неожиданностям, когда искомая вещь не найдена - это было отмечено еще до того, как был выпущен Python 1.0.0, что такой код часто делал неправильную вещь.
Никаких таких неожиданностей не возникает при использовании index()
- исключение нельзя игнорировать молча. Но настройка try/except
для такой простой операции не только раздражает, но и добавляет большие накладные расходы (дополнительное время) для "быстрой" работы. Из-за этого в Python 0.9.9 был добавлен string.find()
(до этого можно было использовать только string.index()
).
Итак, у нас есть и то и другое, и это сохраняется даже на Python 3. Выберите свой яд: -)