startwith有多好?

dug*_*res 17 python

text.startswith('a')  
Run Code Online (Sandbox Code Playgroud)

比...更好

text[0]=='a'  
Run Code Online (Sandbox Code Playgroud)

知道文本不是空的,我们只对它的第一个字符感兴趣.

Jon*_*eet 30

text[0]如果text是空字符串则失败:

IronPython 2.6 Alpha (2.6.0.1) on .NET 4.0.20506.1
Type "help", "copyright", "credits" or "license" for more information.
>>> text = ""
>>> print(text.startswith("a"))
False
>>> print(text[0]=='a')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: index out of range: 0
Run Code Online (Sandbox Code Playgroud)

编辑:你说你"知道" text不是空的......你对此有多自信,如果它在现实中空的,你会想要发生什么?如果失败是合适的(例如,这意味着您的代码中存在错误),则会鼓励使用text[0]=='a'.

其他问题:

  • 您对此的表现有多关注?如果这对性能至关重要,那么在特定的Python运行时对其进行基准测试.我不会完全惊讶地发现(比如)一个表格在IronPython上更快,而在CPython上表现更快.

  • (和您的团队)发现哪些更具可读性?

  • @Jon Skeet:是的,但是可以用'text [:1]`来代替. (5认同)

Bri*_*ian 25

我同意其他开头更具可读性,你应该使用它.也就是说,如果性能是这种特殊情况的一个大问题,那么对它进行基准测试:

$ python -m timeit -s 'text="foo"' 'text.startswith("a")'
1000000 loops, best of 3: 0.537 usec per loop

$ python -m timeit -s 'text="foo"' 'text[0]=="a"'
1000000 loops, best of 3: 0.22 usec per loop
Run Code Online (Sandbox Code Playgroud)

所以text[0]速度提高了2.5倍 - 但这是一个非常快速的操作; 根据系统的不同,每次比较可节省约0.3微秒.除非你在时间紧迫的情况下进行数百万次比较,否则我仍然会使用更具可读性的开头.


Dav*_*ebb 10

就个人而言,我会说startswith更具可读性.

此外,从Python 2.5 startwith可以获取前缀元组来查找:

>>> "hello world".startswith(("hello","goodbye"))
True
Run Code Online (Sandbox Code Playgroud)


Nat*_*ate 10

是的:它更易于使用且更易于阅读.当您测试多个字母时,使用切片时,您必须知道目标文本的长度:

haystack = 'Hello, World!'
needle = 'Hello'

# The easy way
result = haystack.startswith(needle)

# The slightly harder way
result = haystack[:len(needle)] == needle
Run Code Online (Sandbox Code Playgroud)

编辑:问题似乎已经改变.它现在说,"知道文本不是空的,我们只对它的第一个字符感兴趣."这使它成为一个相当无意义的假设情境.

我怀疑提问者正试图"优化"他/她的代码执行速度.如果是这样的话,我的回答是:不要.使用哪种形式更具可读性,因此,当您必须在一年后回来工作时,可以更加可维护.只有在分析显示该代码行成为瓶颈时才进行优化.这不是一些O(n²)算法.这是一个字符串比较.

  • 我在一个非假设的用例中遇到了这个问题; 实际上,如果你请求一个以〜开头的密钥,而另一个字典用于其他每个字符,我有一个代理到一个字典的映射.它被称为数万到数百万次,特别是当鼠标移过它时(GTK +虚拟列表模型列),需要重新绘制窗口的脏部分,所以它需要非常高效.由于我不知道字符串是非空的,我使用[:1]; 如下所示,它仍然是startsWith的两倍. (3认同)

rob*_*rob 8

startswith由于可读性,PEP 8明确告诉使用:

- Use ''.startswith() and ''.endswith() instead of string
Run Code Online (Sandbox Code Playgroud)

切片以检查前缀或后缀.

  startswith() and endswith() are cleaner and less error prone.  For
  example:

    Yes: if foo.startswith('bar'):

    No:  if foo[:3] == 'bar':
Run Code Online (Sandbox Code Playgroud)


Zed*_*Zed 5

质疑的股票短语是:"过早优化是所有邪恶的根源".

  • 那么,你会使用哪一个? (3认同)
  • text.startswith( 'A').它清楚地说明了你想要达到的目标.我只能将text [0] =='a'视为一种替代方案,作为节省一些cpu周期的方法. (3认同)
  • 选择性报价。阅读嵌入该子句的整个段落。它甚至不是原文中的完整句子。 (2认同)

Nic*_*kis 5

text[0]text[:1]如果字符串为空,则等效是安全的.

如果你想比较多个角色,我相信.startswith()会更好.