2012-06-19 182 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'有所不同(遞歸)的方法。 –