español - Python: ¿Por qué los métodos de búsqueda e índice funcionan de manera diferente?
slice object python (1)
En Python, find
e index
son métodos muy similares, utilizados para buscar valores en un tipo de secuencia. find
se usa para cadenas, mientras que index
es para listas y tuplas. Ambos devuelven el índice más bajo (el índice más a la izquierda) en el que se encuentra el argumento proporcionado.
Por ejemplo, ambos de los siguientes devolverían 1
:
"abc".find("b")
[1,2,3].index(2)
Sin embargo, algo de lo que estoy algo confundido es que, aunque los dos métodos son muy similares y cumplen casi el mismo rol, solo para diferentes tipos de datos, tienen reacciones muy diferentes a intentar encontrar algo que no está en la secuencia.
"abc".find("d")
Devuelve -1
, para indicar ''no encontrado'', mientras
[1,2,3].index(4)
plantea una excepción.
Básicamente, ¿por qué tienen diferentes comportamientos? ¿Hay alguna razón en particular, o es solo una incoherencia extraña sin ninguna razón en particular?
Ahora, no estoy preguntando cómo lidiar con esto, obviamente, un bloque try
/ except
o un enditional conditional, funcionaría. Simplemente estoy preguntando cuál fue la razón para hacer que el comportamiento en ese caso particular sea diferente. Para mí, tendría más sentido tener un comportamiento particular para decir que no se encuentra, por consistencia.
Además, no estoy pidiendo opiniones sobre si el motivo es una buena razón o no, simplemente tengo curiosidad sobre cuál es el motivo.
Editar: Algunos han señalado que las cadenas también tienen un método de index
, que funciona como el método de index
para listas, que admitiré que no sabía, pero eso me hace preguntarme por qué, si las cadenas tienen ambas, las listas solo tienen index
.
Esto siempre ha sido molesto ;-) Al contrario de una respuesta, no hay nada especial sobre -1 con respecto a las cadenas; p.ej,
>>> "abc"[-1]
''c''
>>> [2, 3, 42][-1]
42
El problema con find()
en la práctica es que -1, de hecho, no es especial como índice. Así que el código que usa find()
es propenso a las sorpresas cuando no se encuentra lo que se busca - se observó incluso antes de que se lanzara Python 1.0.0 que dicho código a menudo pasaba a hacer algo incorrecto.
No se producen tales sorpresas cuando se usa index()
su lugar; una excepción no se puede ignorar en silencio. Pero configurar try/except
de una operación tan simple no solo es molesto, sino que agrega una sobrecarga importante (tiempo extra) para lo que "debería ser" una operación rápida. Por eso, se agregó string.find()
en Python 0.9.9 (antes de eso, solo se podía usar string.index()
).
Así que tenemos ambos, y eso persiste incluso en Python 3. Elige tu veneno :-)