String反转函数的奇怪行为

时间:2016-02-23 04:25:37

标签: python string recursion reverse

我正在使用递归来反转字符串。我可以使用以下代码成功反转字符串。

def rev(string):
    if len(string)==0:
        return string
    if len(string)==1:
        return string
    else:
        s=string

        string = s[-1]+rev(s[:-1])

    return string       

但是当我用print替换return时,它只打印了答案的前两个字符然后抛出一个错误

  

“TypeError:无法连接'str'和'NoneType'对象”

实施例。当' StackOverflow '运行并返回一个值时,它会正确地返回' wolfrevOkcatS ' 但是当我尝试在函数本身中打印答案时,只打印“ tS ”并给出上述错误。

4 个答案:

答案 0 :(得分:2)

我怀疑你做了这样的事情:

def rev(string):
    if len(string)==0:
        print string
    if len(string)==1:
        print string
    else:
        s=string

        string = s[-1]+rev(s[:-1])

    print string 

让我们解决问题吧。假设你试图反转的字符串是abc。在第一次调用中,您将点击else子句并尝试评估:

'c' + rev('ab')

现在的问题是你的函数没有返回语句,rev('ab')返回None。当您尝试将字符串与None连接时,python会引发错误。

使用return语句。 rev(' ab')返回' ba'加号可用于将'c''ba'连接起来。

顺便说一句,如果您曾尝试在生产代码中解决此问题,则应使用内置工具。

reversed_str = myStr[::-1]
reversed_str_iterator = reversed(myStr) 

答案 1 :(得分:1)

要撤消string/list使用Python

中的list[::-1]

<强>演示

>>> my_str = 'StackOverflow'
>>> my_str[::-1]
'wolfrevOkcatS'

答案 2 :(得分:1)

如果您用return替换print,您的功能将不会返回任何内容。在Python中,这与返回None相同。这会破坏递归步骤,您可以将字符串的最后一个字母与递归调用的返回值连接起来。相反,你应该让递归调用自己打印(只是调用它),在一个单独的语句中打印最后一个字母后:

else:
    print(s[-1], end="") # or print s[-1], (with the comma!) if you're on Python 2
    rev(s[:-1])

请注意,您可能希望基本案例在这种情况下打印换行符,否则您根本就不会获得换行符。

答案 3 :(得分:1)

如果您不是return来自某个函数,那么该函数会隐式返回None。通过用return替换print,可以打破递归功能;它是递归的,但递归调用中计算的值不会被返回和使用。如果您想要print中间结果进行自己的修改,请执行此操作,但只需 每个return语句,而不是代替 return陈述。