2015-08-17 61 views
0

在except函數中包含函數時會出現什麼問題? 在我的情況,我有以下功能:return python內部除外

def inventedfunction(list1): 
    print "initial list %r" %list1 

    SOMETHING THAT CREATES list2 based on list1 

    try: 
     list2[1] 
     print "inside try %r" %list2 
     inventedfunction(list2) 
    except: 
     print "inside except %r" %list2 
     return list2 

運行inventedfunction(somelist)後,似乎一切工作:

initial list [3, 562, 7, 2, 7, 2, 3, 62, 6] 
inside try [[3, 562], [2, 7], [2, 7], [3, 62], [6]] 
initial list [[3, 562], [2, 7], [2, 7], [3, 62], [6]] 
inside try [[2, 3, 7, 562], [2, 3, 7, 62], [6]] 
initial list [[2, 3, 7, 562], [2, 3, 7, 62], [6]] 
inside try [[2, 2, 3, 3, 7, 7, 62, 562], [6]] 
initial list [[2, 2, 3, 3, 7, 7, 62, 562], [6]] 
inside except [[2, 2, 3, 3, 6, 7, 7, 62, 562]] 

但它不返回任何東西。如果我將返回列表2包含在除返回列表外的其他列表之外,[[3,562],[2,7],[2,7],[3,62],[6]],但不返回[[2,2,3,3 ,6,7,7,62,562]]這是我想要的。

另外,如果我改變了代碼如下:

if len(list2)!=1: 
    inventedfunction(list2) 
else: 
    return list2 

有一個在功能上沒有回報。

另一個簡單的例子,也不會返回任何東西:

def inventedfunction(list1): 
    list2=list1[:-1] 
    if len(list2)!=1: 
     inventedfunction(list2) 
    else: 
     return list2 
+0

inventedfunction()可能會調用自身,因此是遞歸的。什麼應該是它的遞歸的終止條件,並且總是出現異常?因爲它僅在異常情況下返回某些內容。 –

+0

我試圖在列表2中只有一個子列表時結束遞歸,這就是爲什麼我在列表中包含list2 [1]的原因。 – user2246905

回答

3

您遞歸調用的函數 - inventendfunction() - 但再也不會回到你的遞歸調用得到的結果,因此它不會返回任何東西,你就需要返回由遞歸調用返回以及結果 -

try: 
    list2[1] 
    print "inside try %r" %list2 
    return inventedfunction(list2) 

另外,如果有一個空的except也不好,您應該考慮調用inventedfunction()時會發生什麼異常,並且只有這些異常除外。


由於在評論你說 -

我想我的問題不具有功能,而且理解遞歸是如何工作要做。

讓我們的功能a(),做遞歸,類似於你一個簡單的例子 -

>>> def a(i): 
...  if i == 1: 
...    return "Hello" 
...  else: 
...    a(i+1) 
... 
>>> print(a(0)) 
None 

正如你可以看到上面簡單的例子返回0,爲什麼呢?讓我們一步跨出這一步 -

main -> a(0) 
  1. 你調用函數a(0),這裏i是0,所以你去別的部分,並調用a(1)

    main -> a(0) -> a(1) 
    
  2. 現在,你是在a再次,與i1,現在你去if一部分,這將返回"Hello"

    main -> a(0)   #Returned back to a(0) 
    
  3. 現在回來以後你不直接返回main(),你叫a(0),沒有它返回等。無論功能a(1)叫,那是從內a(0),讓你回到a(0),和執行仍在繼續,但由於a(0)不返回任何內容,因此您將在main中得到默認返回值,即None。


爲了您的例子再次,你需要添加return inventedfunction(list2),才能正常返回從遞歸調用的結果,否則遞歸調用的返回值被丟棄,而不是返回。示例 -

def inventedfunction(list1): 
    list2=list1[:-1] 
    if len(list2)!=1: 
     return inventedfunction(list2) 
    else: 
     return list2 
+0

我需要每次調用編輯list2的函數,直到它只有一個子列表。那麼在這種情況下我該如何處理呢? – user2246905

+0

您是否想將列表列表放到一個列表中? –

+0

只是一個使用遞歸排序列表的例子。爲此我創建了一個list2,每次通過合併子列表來修改列表。但最後,當沒有更多的子列表時,我需要返回該列表2。 – user2246905

2

你的功能except子句中return,因此,如果沒有什麼異常不返回任何東西。也許你打算在try內部做return inventedfunction(list2)

+0

我不確定,但似乎有一個例外,因爲你可以看到在除了[[2,2,3,3,6,7,7,62,562]]之外的印刷品「 – user2246905

+0

@ user2246905:有在深度嵌套調用中是一個例外,但當它向上調用遞歸時,這些調用不會返回任何內容,因爲最深的調用會吞服該異常,並且在較高調用中不會有例外。 – BrenBarn