2012-06-19 136 views
-1

我想删除一个字符串中花括号之间的所有内容,并试图递归地执行该操作。 当递归结束时,我在这里返回x,但不知怎的,函数doit在这里返回None。虽然在def内打印x将打印正确的字符串。 我在做什么错?奇怪的函数返回值?

strs = "i am a string but i've some {text in brackets} braces, and here are some more {i am the second one} braces" 
def doit(x,ind=0): 
    if x.find('{',ind)!=-1 and x.find('}',ind)!=-1: 
    start=x.find('{',ind) 
    end=x.find('}',ind) 
    y=x[start:end+1] 
    x=x[:start]+x[end+1:] 
    #print(x) 
    doit(x,end+1) 
    else: 
     return x 

print(doit(strs)) 

输出:
None

+0

我会注意这是做的一个非常糟糕的方式,但我假定这是一个编程练习,给予“我米试图做递归“声明。 –

+0

@Lattyware是啊!我试图通过这个解决SO问题。 –

回答

3

你永远如果if块成功返回任何东西。 return声明位于else块中,并且只有在其他所有项不是时才执行。你想返回你从递归获得的值。

if x.find('{', ind) != -1 and x.find('}', ind) != -1: 
    ... 
    return doit(x, end+1) 
else: 
    return x 
+1

要添加,当函数结束时没有显式的'return'或显式的'return'没有给出参数,那么它就像使用'return None'一样。 – pepr

1
... 
#print(x) 
doit(x,end+1) 
... 

应该

... 
#print(x) 
return doit(x,end+1) 
... 

你缺少return声明中,如果块。如果函数是递归调用它,它不会返回该调用的返回值。

1

注意,它更容易使用正则表达式:

import re 
strs = "i am a string but i've some {text in brackets} braces, and here are some more {i am the second one} braces" 
strs = re.sub(r'{.*?}', '', strs) 
+0

我知道它可以在一行中完成,我只是尝试与使用'regex'有所不同(递归)的方法。 –