在 Python 中有什么理由更喜欢 startswith 而不是字符串切片?

Is there any reason to prefer startswith over string slicing in Python?

如果foo="apple",那么下面的语句是等价的:

foo.startswith("app")
foo[0:3] == "app"

从某种意义上说,两者都会return“真”。

有什么理由比另一种更喜欢一种方法吗?我的意思是:

  1. 一种方法明显比另一种快吗?
  2. 一种方法被认为比另一种方法 'Pythonic' 多还是少?

切片是通用功能的特例。如果您必须检查任何其他切片,而不是从字符串的开头或结尾,那么切片就可以了。但是对于这两种情况,startswithendswith 提供了更好的可读性。

正如 Zen Of Python 所说“简单胜于复杂”和“可读性很重要”。所以 foo.startswith("app") 是一个更好的选择,除了效率非常重要的情况。

UPD:我进行了快速研究。看起来,这两种方法之间几乎没有时间差异。计算时间相差5%,基本可以忽略不计。

这是研究本身:

import random
import string

def get_random_string(length):
    letters = string.ascii_lowercase
    result_str = ''.join(random.choice(letters) for i in range(length))
    return result_str
    
txt = [get_random_string(random.randint(5, 20)) for i in range(1000)]

def time_slice():
    s = datetime.now()
    for i in txt:
        check = i[0:5]
        if i[0:5] == check:
            pass
    return (datetime.now() - s).microseconds

def time_func():
    s = datetime.now()
    for i in txt:
        check = i[0:5]
        if i.startswith(check):
            pass
    return (datetime.now() - s).microseconds

>>> sum(time_slice() for i in range(100)) / 100
... 316.15

>>> sum(time_func() for i in range(100)) / 100
... 303.08

是的...有。一个更清楚地表明了意图。 第一个更动态。您所要做的就是传递参数字符串。而第二个不仅需要您更改字符串,还需要更改范围 0:3 以补偿新字符串的长度。第一个更干净。