Python: 为什么列表没有find方法?
Python中的列表(lists)没有find方法的原因是因为它们有一个名为index的方法。我认为string.find
和list.index
之间的不一致性是不幸的,无论是在名称还是行为上:string.find
在找不到匹配项时返回-1,而list.index
会引发ValueError错误。这个设计可以更加一致。这两个操作之间唯一无法调和的区别是string.find
搜索一串项目,而list.index
只搜索一个项目(这本身不能证明使用不同的名称是合理的)。
下次在REPL中尝试"asdfasdf".index('z')
,这将突出显示这种常被重复说的"一种明显的方法"的荒谬之处,因为它们甚至不能在核心字符串方法中保持一致。
但是我这个示例的重点在于,它们确实保持了一致。列表和字符串都有一个行为完全相同的index方法。只是字符串额外添加了一个find方法。我不确定为什么它们不也为列表添加这个方法,但是list.index
和string.find
之间没有等价关系。
不一致只是在一点点转移,其根本原因是冗余的搜索函数。(getattr
可以正确处理这个问题,根据需要可以返回一个标志值或异常。)
虽然字符串和列表都有一个.index()
方法,但它们的功能并不完全相同。对于字符串,它会找到子字符串,而对于列表,它会找到子列表,这对我来说是另一个不一致的例子。
这是个很好的观点。我想我错了,这并不是我第一次犯错。
你是如何在我点击“添加评论”按钮之前就看到并回复我的评论的呢?这真的让我困惑,现在我无法更正其中的拼写错误了。
Python中的列表(Lists)没有提供find方法的原因是,该方法与index方法的区别不够明显。当待查找的元素存在于列表中时,find和index方法都会返回相同的结果;它们的区别在于当待查找的元素不在列表中时的处理方式。然而,可以通过简单地从一个方法构建另一个方法来解决这个问题。在其他编程语言中,通过引发和捕获异常来处理非错误条件可能会被认为是不好的做法,因为你可以很容易地进行测试来避免异常的发生。但在Python中,使用异常处理而不是像这样的测试通常被认为更符合Pythonic(Python风格)的做法。所以,我们可以通过使用try/except来构建find方法,如下所示:
try: foo_index = my_list.index(foo) catch ValueError: foo_index = -1 # 或者进行其他处理
至于为什么列表(list)只提供了index方法,而字符串(string)则提供了独立的index和find方法,我无法给出确切的答案。