1

我需要编写一个函数来返回字符串的副本,其中最右边的 2 个字符移到前面。这是我的代码:

def go_right(mystr):
    if mystr >= 2:
        for i in range(len(mystr)):
                 a = mystr[-2:] + mystr[:-2]
        return a

上面的代码工作正常,但我似乎无法理解为什么我不能这样做:

def go_right(mystr):
        if mystr >= 2:
            for i in range(len(mystr)-2):
                     a = mystr[-2:] + mystr
            return a

如果我使用上面的函数,如果我传入 hello,它只会返回“lohello”。为什么 -2 似乎不影响 mystr?我认为它应该遍历除最后 2 个字符之外的每个字符?如果有人可以帮助我澄清这一点,我将不胜感激。

4

4 回答 4

2

def go_right(mystr):
    if mystr >= 2:
        for i in range(len(mystr)):
                 a = mystr[-2:] + mystr[:-2]
        return a

该变量i从不使用,并且 mystr 从不修改。执行 len(mystr) 次也是如此a = mystr[-2:] + mystr[:-2],一遍又一遍地做同样的事情。

因此,改变 for 循环的长度不会改变任何事情也就不足为奇了,因为 for 循环的存在并没有做任何事情。

你的方法相当于

def go_right(mystr):
    if mystr >= 2:
        a = mystr[-2:] + mystr[:-2]
    return a

并且这段代码仍然存在错误。您的意思不是 mystr >= 2,而是 len(mystr) >= 2,如下所示:

def go_right(mystr):
    if len(mystr) >= 2:
        a = mystr[-2:] + mystr[:-2]
    return a

(比较字符串和数字的语义是始终将它们比较为假,例如"a" >= 2is True

但是,现在当 mystr 的长度为 0 或 1 时,这会报错:'UnboundLocalError: local variable 'a' referenced before assignment'。解决此问题的一种方法是:

def go_right(mystr):
    if len(mystr) >= 2:
        return mystr[-2:] + mystr[:-2]
    return mystr
于 2013-04-19T00:21:11.373 回答
0

您还可以将代码大大简化为:

def go_right(mystr):
    return mystr[-2:] + mystr[:-2]

长度为 0、1 或 2 的输入将原样返回。

于 2013-04-19T01:03:47.160 回答
0

我对您为什么为此使用循环感到有些困惑……在这两种情况下,循环都没有真正为您做任何事情。不过,要回答您的问题,这是因为您将所有 mystr 添加到 mystr[-2:]。这是有道理的,因为通过循环运行, mystr 不会改变。

于 2013-04-19T00:22:12.570 回答
0

这里有一个逻辑错误:

for i in range(len(mystr)):
    a = mystr[-2:] + mystr[:-2]

a您正在为时间分配新值len(mystr)。您实际上需要做的就是打电话

return mystr[:-2] + mystr[:-2]

请注意您的i索引,您没有使用它来访问列表元素,因为您使用的是切片表示法。

请参阅此问题以获取更多参考。

于 2013-04-19T00:26:10.227 回答