web-dev-qa-db-ja.com

Python-findメソッドとindexメソッドの動作が異なるのはなぜですか?

Pythonでは、findindexは非常によく似たメソッドであり、シーケンスタイプの値を検索するために使用されます。 findは文字列に使用され、indexはリストとタプルに使用されます。どちらも、指定された引数が見つかった最も低いインデックス(最も左にあるインデックス)を返します。

たとえば、次の両方で1が返されます。

"abc".find("b")
[1,2,3].index(2)

ただし、私が少し混乱していることの1つは、2つの方法が非常に似ており、ほぼ同じ役割を果たしているにもかかわらず、データ型が異なるだけで、シーケンスにないものを見つけようとする反応が非常に異なることです。

"abc".find("d")

-1を返し、「見つかりません」を示します。

[1,2,3].index(4)

例外が発生します。

基本的に、なぜそれらは異なる振る舞いをするのですか?特別な理由がありますか、それとも特別な理由のない奇妙な矛盾ですか?

今、私はこれに対処する方法を尋ねていません–明らかに、try/exceptブロックまたは条件付きinステートメントが機能します。私は単に、その特定の場合の振る舞いを異なるものにするための論理的根拠が何であったかを尋ねています。私にとっては、一貫性を保つために、特定の動作が見つからないと言う方が理にかなっています。

また、理由が正当な理由であるかどうかについて意見を求めているのではありません。理由が何であるかに興味があります。

編集:文字列にもindexメソッドがあり、リストのindexメソッドのように機能するという指摘もありますが、これは私が知らなかったことを認めます。 、しかしそれは、文字列に両方がある場合、リストにindexしかないのはなぜか疑問に思います。

24
Kevin

これは常に厄介です;-) 1つの答えとは反対に、文字列に関して-1について特別なことは何もありません。例えば。、

_>>> "abc"[-1]
'c'
>>> [2, 3, 42][-1]
42
_

実際のfind()の問題は、-1が実際にはnotインデックスとして特別であるということです。したがって、find()を使用するコードは、検索対象のものが見つからない場合に驚く傾向があります-Python 1.0.0がリリースされる前でも、そのようなコードは頻繁に実行されることが指摘されていました間違ったことをする。

代わりにindex()を使用しても、このような驚きは発生しません。例外を黙って無視することはできません。しかし、このような単純な操作に_try/except_を設定することは、煩わしいだけでなく、高速操作の「あるべき姿」に大きなオーバーヘッド(余分な時間)を追加します。そのため、string.find()がPython 0.9.9に追加されました(それ以前は、string.index()しか使用できませんでした)。

だから私たちは両方を持っています、そしてそれはPython 3。あなたの毒を選んでください:-)にも持続します

26
Tim Peters