是
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上表现更快.
您(和您的团队)发现哪些更具可读性?
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²)算法.这是一个字符串比较.
startswith由于可读性,PEP 8明确告诉使用:
Run Code Online (Sandbox Code Playgroud)- 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':
质疑的股票短语是:"过早优化是所有邪恶的根源".