您不应该将 str
作为变量名,因为它会掩盖 内置的str
类型。您可以在循环中将切片后的字符串连接起来:
def string_splosion(string):
i, result = 0, ''
while i < len(string):
i += 1
result += string[:i]
return result
使用 str.join
和 range
可以稍微缩短您的代码:
def string_splosion(string):
return ''.join(string[:i] for i in range(1, len(string) + 1))
或者使用itertools.accumulate
(Python 3.2+):
import itertools
def string_splosion(string):
return ''.join(itertools.accumulate(string))
itertools.accumulate
方法比 str.join
方法快约 2 倍,比基于循环的原始解决方案快约 1.5 倍:
string_splosion_loop(abcdef): 2.3944241080715223
string_splosion_join_gen(abcdef): 2.757582983268288
string_splosion_join_lc(abcdef): 2.2879220573578865
string_splosion_itertools(abcdef): 1.1873638161591886
我用来计时函数的代码是:
import itertools
from timeit import timeit
string = 'abcdef'
def string_splosion_loop():
i, result = 0, ''
while i < len(string):
i += 1
result += string[:i]
return result
def string_splosion_join_gen():
return ''.join(string[:i] for i in range(1, len(string) + 1))
def string_splosion_join_lc():
return ''.join([string[:i] for i in range(1, len(string) + 1)])
def string_splosion_itertools():
return ''.join(itertools.accumulate(string))
funcs = (string_splosion_loop, string_splosion_join_gen,
string_splosion_join_lc, string_splosion_itertools)
for f in funcs:
print('{.__name__}({}): {}'.format(f, string, timeit(f)))
range(1,len(string)+1)
可以在列表推导式中去除循环(建议解决方案2),但这可能是无用的。 - gboffii, result = 1, ''
将空字符串赋值给result
变量,将整数值1赋值给i
变量。这被称为序列解包赋值。 - vaultah