字符串反转函数的奇怪行为

Strange behaviour with String reversal function

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

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: cannot concatenate 'str' and 'NoneType' objects"

例子。当给 'Whosebug' 函数并 returned 一个值时 returns 'wolfrevOkcatS' corrrectly 但是当我试图在函数本身中打印答案时,它只打印“tS”给出上面的错误。

要在 Python 中反转 string/list 使用 list[::-1]

演示

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

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

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

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

如果您不从一个函数 return,那么该函数将隐式 returns None。通过将 return 替换为 print,您破坏了递归功能;它会递归,但不会返回和使用在递归调用中计算的值。如果你想 print 中间结果来启发你自己,那么就这样做吧,但只是在 每个 return 语句之前这样做,而不是 到位return 语句。

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

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')

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

用return语句。 rev('ab') returns 'ba' 和加号可以用来连接 'c''ba'.

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

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