<p>你要的已经存在:<a href="http://docs.python.org/3/library/stdtypes.html#str.join" rel="nofollow">^{<cd1>}</a>。<code>join</code>只是在做难的部分;我们仍然需要一些东西来处理简单的部分……但这就是最简单的部分。在</p>
<p>另外,正如其他人所指出的那样,您可以在字符串上使用<code>*</code>运算符来实现大部分目标。但是,尽管你自己差点就写好了,但我觉得你不明白为什么这是最重要的方式。在</p>
<p>你甚至可以把两者结合起来:<code>delim.join([string] * n)</code>。(这里,我重复一个<em>列表</em>而不是字符串本身,因为否则我只会得到一个大字符串<code>"spamspamspamspamspam"</code>而不是五个单独的<code>"spam"</code>向上<code>join</code>)</p>
<hr/>
<p>但是,我假设这是一个家庭作业或自学尝试,你想知道如何从头开始写。在</p>
<p>通常,当你想重复某事时,你需要一个循环。在</p>
<p>如果要对列表<code>spam</code>中的每个元素重复某些操作,则需要编写循环<code>for element in spam:</code>。在</p>
<p>但是如果你想重复5次呢?没有“数字5中的每个元素”。你需要找到有5个元素的东西。而<a href="http://docs.python.org/3/library/functions.html#range" rel="nofollow">^{<cd10>}</a>正适合于此。所以:</p>
<pre><code>def repeat(string, n, delim):
for i in range(n):
# something
</code></pre>
<p>接下来,您已经知道如何使用<code>+</code>运算符连接字符串。所以,让我们从一个空字符串开始,然后连接到它的末尾:</p>
^{pr2}$
<hr/>
<p>但这有一个问题:</p>
<pre><code>>>> repeat("spam", 5, ", ")
'spam, spam, spam, spam, spam, '
</code></pre>
<p>垃圾邮件的数量正好,但是逗号太多了。在</p>
<p>如果你回到<code>*</code>的解决方案,你会发现这和<code>(string + delim) * n</code>是一样的,我们已经走了很长的路。不管怎样,你都会遇到同样的问题。在</p>
<hr/>
<p>你怎么避免呢?在</p>
<p>你得有点棘手。您可以对最后一个值进行特殊处理,也可以对第一个值进行特殊处理。或者您可以查看目前为止的<code>result</code>,看看您是否已经开始了。或者你可以让它添加额外的分隔符,然后在末尾去掉它。我将向您展示其中一个选项,但您应该尝试自己编写另一个选项。(一旦您找到了如何调整算法使之成为可能,那么查看<code>result</code>可能是最简单、最干净的方法。)</p>
<pre><code>def repeat(string, n, delim):
result = ""
for i in range(n):
result = result + string + delim
return result[:-len(delim)]
</code></pre>
<p>我在末尾去掉多余的分隔符的方法是使用带负索引的切片。你可能还没有学会,这就是为什么你应该为自己写一个解决方案。(另外,这可能是最老套的解决方案。)</p>
<p>一直回到顶部,如果您使用<code>join</code>,您将看到它为您解决了这个问题。它显然没有使用魔术,所以你可以考虑看看它是如何实现的。不幸的是,它可能是<a href="http://hg.python.org/cpython/file/263001204b96/Objects/unicodeobject.c" rel="nofollow">this</a>文件中的一大堆C代码,不是很清晰的Python,所以您可能不会学到太多。在</p>