Подтвердить что ты не робот

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.

4b9b3361

Ответ 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. Выберите свой яд: -)