python3字符串"abcd"打印:aababcabcd?

AL1*_*L12 4 python string

如果有一个像abcd1234等字符串我怎么能一起打印,第一个字符,然后前两个字符,然后前三个等一起打印?

例如,string = 1234我想打印/返回1121231234aababcabcd

到目前为止我有这个代码:

def string_splosion(str):
    i = 0
    while i <= len(str):
        i += 1
        print(str[:i])
print(string_splosion('abcd'))
Run Code Online (Sandbox Code Playgroud)

但它以单独的行打印/返回它.我可以手动编写它,print(str[0:1], str[1:2] <...>)但是如何让python做它因为我不知道字符串将会有多长?

vau*_*tah 6

您不应该使用str变量名称,因为它会影响内置str类型.您可以在循环中将切片的字符串连接在一起:

def string_splosion(string):
    i, result = 0, ''
    while i < len(string): # < instead of <=
        i += 1
        result += string[:i]
    return result
Run Code Online (Sandbox Code Playgroud)

可以使用str.join和缩短代码一点点range:

def string_splosion(string):
    return ''.join(string[:i] for i in range(1, len(string) + 1))
Run Code Online (Sandbox Code Playgroud)

或使用itertools.accumulate(Python 3.2+):

import itertools
def string_splosion(string):
    return ''.join(itertools.accumulate(string))
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我用来计算函数的代码是

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():
    # str.join performs faster when the argument is a list
    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)))
Run Code Online (Sandbox Code Playgroud)