我正在使用递归来反转字符串。我可以使用以下代码成功反转字符串。
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 ”并给出上述错误。
答案 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
陈述。