find和index之间的区别

Soh*_*amC 56 python string python-2.7

我是python的新手,并不能完全理解find和index之间的区别.

>>> line
'hi, this is ABC oh my god!!'
>>> line.find("o")
16
>>> line.index("o")
16
Run Code Online (Sandbox Code Playgroud)

他们总是返回相同的结果.谢谢!!

fal*_*tru 87

str.find-1在找不到子字符串时返回.

>>> line = 'hi, this is ABC oh my god!!'
>>> line.find('?')
-1
Run Code Online (Sandbox Code Playgroud)

虽然str.index加薪ValueError:

>>> line.index('?')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: substring not found
Run Code Online (Sandbox Code Playgroud)

如果找到子字符串,这两个函数的行为方式相同.

  • python 应该删除这两种方法之一。其中之一很好地达到了目的。另外,我认为“index”返回“-1”和“find”返回“ValueError”更合适,以防找不到“sub”。 (2认同)
  • “index” 是一种[序列方法](https://docs.python.org/3/library/stdtypes.html#common-sequence-operations),具有明确的行为,包括引发“ValueError”如果未找到匹配项:“当在 s 中找不到 x 时,index 会引发 ValueError 。” 对于“str.index”必须保持一致的大局来说,特定的“str.find”方法所做的事情完全无关紧要。 (2认同)

Ree*_*eep 18

find也仅适用于索引可用于列表,元组和字符串的字符串

>>> somelist
['Ok', "let's", 'try', 'this', 'out']
>>> type(somelist)
<class 'list'>

>>> somelist.index("try")
2

>>> somelist.find("try")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'find'

>>> sometuple
('Ok', "let's", 'try', 'this', 'out')
>>> type(sometuple)
<class 'tuple'>

>>> sometuple.index("try")
2

>>> sometuple.find("try")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'find'

>>> somelist2
"Ok let's try this"
>>> type(somelist2)
<class 'str'>

>>> somelist2.index("try")
9
>>> somelist2.find("try")
9

>>> somelist2.find("t")
5
>>> somelist2.index("t")
5
Run Code Online (Sandbox Code Playgroud)


Vla*_*den 7

@falsetru 提供了关于函数之间差异的解释,我在它们之间进行了性能测试。

"""Performance tests of 'find' and 'index' functions.

Results:
using_index t = 0.0259 sec
using_index t = 0.0290 sec
using_index t = 0.6851 sec

using_find t = 0.0301 sec
using_find t = 0.0282 sec
using_find t = 0.6875 sec

Summary:
    Both (find and index) functions have the same performance.
"""


def using_index(text: str, find: str) -> str:
    """Returns index position if found otherwise raises ValueError."""
    return text.index(find)


def using_find(text: str, find: str) -> str:
    """Returns index position if found otherwise -1."""
    return text.find(find)


if __name__ == "__main__":
    from timeit import timeit

    texts = [
        "short text to search" * 10,
        "long text to search" * 10000,
        "long_text_with_find_at_the_end" * 10000 + " to long",
    ]

    for f in [using_index, using_find]:
        for text in texts:
            t = timeit(stmt="f(text, ' ')", number=10000, globals=globals())
            print(f"{f.__name__} {t = :.4f} sec")
        print()
Run Code Online (Sandbox Code Playgroud)