您要求的已经存在:str.join
. join
只做最难的部分;我们仍然需要一些简单的部分……但那是简单的部分。
此外,正如其他人指出的那样,您可以*
在字符串上使用运算符来让您大部分时间到达那里。但是,尽管你自己几乎已经写了,但我觉得你不明白为什么大部分都是这样。
您甚至可以将两者结合起来:delim.join([string] * n)
. (在这里,我重复的是一个列表而不是字符串本身,因为否则我只会得到一个大字符串"spamspamspamspamspam"
而不是五个单独"spam"
的 s join
。)
但是,我将假设这是一个家庭作业或自学尝试,并且您想知道如何从头开始自己编写它。
通常,当您想要重复某些内容时,您需要一个循环。
如果您想为列表中的每个元素重复某些内容spam
,请编写循环for element in spam:
。
但是如果你想重复 5 次呢?没有“数字 5 中的每个元素”。你需要找到有 5 个元素的东西。并且range(5)
非常适合。所以:
def repeat(string, n, delim):
for i in range(n):
# something
接下来,您已经知道如何使用+
运算符连接字符串。所以,让我们从一个空字符串开始,并连接到它的末尾:
def repeat(string, n, delim):
result = ""
for i in range(n):
result = result + string + delim
return result
但这有一个问题:
>>> repeat("spam", 5, ", ")
'spam, spam, spam, spam, spam, '
垃圾邮件的数量恰到好处,但逗号太多。
如果你回到*
解决方案,你会发现这和 是一样的(string + delim) * n
,我们只是走了很长的路。无论哪种方式,你都会遇到同样的问题。
你如何避免这种情况?
在这里你必须有点棘手。您可以将最后一个值或第一个值视为特殊值。或者你可以看看result
到目前为止,看看你是否在开始。或者您可以让它添加额外的分隔符,然后在最后将其删除。我将向您展示其中一个选项,但您应该尝试自己编写另一个选项。(result
一旦你弄清楚如何调整算法以使其成为可能,查看可能是最简单、最清晰的。)
def repeat(string, n, delim):
result = ""
for i in range(n):
result = result + string + delim
return result[:-len(delim)]
我在最后去掉额外分隔符的方法是使用切片,带有一个负索引。您可能还没有学到这一点,这就是为什么您应该为自己编写一个解决方案。(另外,这可能是最骇人听闻的解决方案。)
一直回到顶部,如果你玩弄join
,你会发现它为你解决了这个问题。它显然没有使用魔法,所以你可能会考虑看看它是如何实现的。不幸的是,这个文件中的某个地方可能有一大堆 C 代码,而不是清晰的 Python,因此您可能不会学到太多东西。