有什么理由比Python中的字符串切片更喜欢使用startwith?

问题描述

如果foo="apple",则以下语句是等效的:

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

从某种意义上说,两者都将返回“ True”。

有没有理由更喜欢一种方法?而且,我的意思是:

  1. 一种方法明显快于另一种方法吗?
  2. 一种方法被认为比另一种方法或多或少是“ Pythonic”的吗?

解决方法

切片是通用功能的一种特殊情况。如果您必须检查其他任何切片,则从字符串的开头或结尾进行其他检查,则切片将起作用。但是对于这两种情况,startswithendswith提供了更好的可读性。

正如Python的Zen所说,“简单胜于复杂”和“可读性很重要”。因此,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以补偿新字符串的长度。首先是更清洁。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...