Python 字符串反转函数的奇怪行为
我正在使用递归来反转字符串。我能够使用以下代码成功地反转字符串Python 字符串反转函数的奇怪行为,python,string,recursion,reverse,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时,它只
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”给出上述错误。要在
Python
中反转字符串/列表
,请使用列表[:-1]
演示
>>> my_str = 'StackOverflow'
>>> my_str[::-1]
'wolfrevOkcatS'
要在
Python
中反转string/list
,请使用list[::-1]
演示
>>> my_str = 'StackOverflow'
>>> my_str[::-1]
'wolfrevOkcatS'
如果将
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])
请注意,在这种情况下,您可能希望基本用例打印换行符,因为否则您将根本无法获得换行符。如果您将
返回值替换为打印
,则函数将不会返回任何内容。在Python中,这与返回None
相同。这将中断递归步骤,将字符串的最后一个字母与递归调用的返回值连接起来。相反,您应该让递归调用在单独语句中打印最后一个字母后自行打印(只需调用它):
else:
print(s[-1], end="") # or print s[-1], (with the comma!) if you're on Python 2
rev(s[:-1])
请注意,在这种情况下,您可能希望基本用例打印换行符,因为否则您将根本无法获得换行符。如果您不从函数返回
,那么函数将隐式返回无
。通过将返回
替换为打印
,您破坏了递归功能;它会递归,但不会返回和使用递归调用中计算的值。如果要打印中间结果以供自己参考,请这样做,但要在每个return
语句之前这样做,而不是代替return
语句。如果不从函数中返回,则函数隐式返回None
。通过将返回
替换为打印
,您破坏了递归功能;它会递归,但不会返回和使用递归调用中计算的值。如果您想打印中间结果以供自己参考,请这样做,但要在每个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')
现在的问题是,您的函数没有返回语句,rev('ab')
不返回任何语句。当您尝试将字符串与None连接时,python会引发一个错误
使用返回语句。rev('ab')返回'ba',加号可用于将'c'
与'ba'
连接起来
另外,如果您试图在生产代码中解决这个问题,您应该使用内置工具
reversed_str = myStr[::-1]
reversed_str_iterator = reversed(myStr)
我怀疑你做了这样的事:
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连接时,python会引发一个错误
使用返回语句。rev('ab')返回'ba',加号可用于将'c'
与'ba'
连接起来
另外,如果您试图在生产代码中解决这个问题,您应该使用内置工具
reversed_str = myStr[::-1]
reversed_str_iterator = reversed(myStr)
简短回答:不要试图在递归函数中打印结果。返回结果并在调用代码中打印。简短回答:不要试图在递归函数中打印结果。返回结果并在调用代码中打印。虽然这是真的,但OP似乎试图理解递归,而不是解决反转字符串的具体问题。您在这里还演示了糟糕的形式,命名了一个变量str
,从而隐藏了内置的str
构造函数。虽然这是真的,但OP似乎试图理解递归,而不是解决反转字符串的具体问题。这里还演示了糟糕的形式,命名了一个变量str
,从而隐藏了内置的str
构造函数。