Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 字符串反转函数的奇怪行为_Python_String_Recursion_Reverse - Fatal编程技术网

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
构造函数。