2013-08-28 71 views
1

下面的方法查找字符串以查找它是否有任何python方法。return語句在python遞歸中不返回任何東西

def there_is_a_call(string): 
    return string.find('(') > -1 

def find_and_remove_functions(string , found_functions): 
    if not there_is_a_call(string): 
     print(found_functions) 
     return found_functions 
    else: 
     function_end = string.find('(') 
     function_string = string[:function_end][::-1] 
     if function_string.find('.') > -1 : 
      index = function_string.find('.') 
     elif function_string.find(' ') > -1: 
      index = function_string.find(' ') 
     else: 
      index = len(function_string) - 1 
     func_name  = function_string[ : index + 1 ][::-1] + '()' 
     new_list = found_functions 
     new_list.append(func_name) 
     find_and_remove_functions(string[ function_end + 1: ], found_functions) 

所以我試着看看它是否有效,然後發生這種情況;

>>>> a = find_and_remove_functions('func() and some more()' , []) 
['func()', ' more()'] 
>>>> print(a) 
None 

爲什麼return語句不返回任何東西,而found_functions做得到印刷?

+0

的'return'聲明_is_返回的東西......但如果'if'不錯,唯一的執行。否則,你正在運行其他代碼,它不會返回任何東西。它遞歸地調用該函數,但它對遞歸調用的結果不起作用。通常情況下,遞歸情況下的最後一行是一個返回值,它返回遞歸調用的值或者圍繞它構建的表達式。 – abarnert

回答

2

這裏:

find_and_remove_functions(string[ function_end + 1: ], found_functions) 

應該

return find_and_remove_functions(string[ function_end + 1: ], found_functions) 
1

一些更多的解釋在這裏。

a = find_and_remove_functions('func() and some more()' , [])打印一個列表,因爲有一行print(found_functions)正在執行。

a被分配到find_and_remove_functions結果,並且由於功能設置的遞歸調用(看你else部分沒有return)後沒有返回,就被分配到None

這裏是正在發生的事情的一個簡單的例子:

>>> def test(): 
...  print "test" 
... 
>>> a = test() 
test 
>>> print(a) 
None 
>>> a is None 
True 
+0

你需要解釋爲什麼調用'find_and_remove_functions'爲什麼不返回。畢竟,基地裏有一個「回報」。這只是遞歸的情況下不返回從基本情況返回的東西。所以OP需要做karthikr的回答。 – abarnert

+0

@abarnert肯定,更新了答案。完全同意OP應該做karthikr建議的事情。謝謝! – alecxe