0
def main() :
    n = 5
    def repeat(string, n, delim) :

        name = "string" + "delim"
    nametwo = name * n
    print(nametwo)

我需要编写一个def repeat(string, n, delim)返回string "string"重复 n 次的函数,由字符串 deli 分隔。exampleLrepeat("ho", 3, ", ") "ho, ho, ho"有人可以给我提示我应该如何写这个吗?

4

6 回答 6

3

看这个:

>>> ", ".join("ho" for _ in range(3))
'ho, ho, ho'
>>> def repeat(string, n, delim):
...     return delim.join(string for _ in range(n))
...
>>> repeat("ho", 3, ", ")
'ho, ho, ho'
>>>

主要是利用join了字符串和range内置的方法。

于 2013-10-09T00:32:03.080 回答
3

您要求的已经存在: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 代码,而不是清晰的 Py​​thon,因此您可能不会学到太多东西。

于 2013-10-09T00:48:54.693 回答
1

你那么近。。

def repeat(string, n, delim):
      name = string + delim
      nametwo = name*n
      print(nametwo)

你不需要那里的引号。使用引号,值name将是“stringdelim”,而不是“string”和“delim”的值。

于 2013-10-09T00:48:23.100 回答
0
>>> def repeat(s, n, d):
...     return d.join([s]*n)
... 
>>> repeat("ho", 3, ", ")
'ho, ho, ho'

您可以通过使用避免临时列表(n可能非常大)itertools.repeat

>>> import itertools as it
>>> def repeat(s, n, d):
...     return d.join(it.repeat(s, n))
... 
>>> repeat("ho", 3, ", ")
'ho, ho, ho'
于 2013-10-09T01:37:16.210 回答
0
def repeat(string, n, delim):
    print((string + delim)*(n-1) + string*(n>0))

>>> repeat('ho', 5, ", ")
ho, ho, ho, ho, ho
于 2013-10-09T01:38:13.643 回答
0

这是一个递归版本

def repeat(s, n, d):
    if n == 0:
        return ""
    if n == 1:
        return s
    return repeat(s, n/2, d) + d + repeat(s, n - n/2, d)
于 2013-10-09T02:04:10.427 回答