字符串反转函数的奇怪行为
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)
我正在使用递归来反转字符串。我可以使用以下代码成功反转字符串。
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)