在python

时间:2015-08-17 02:28:59

标签: python exception

在except中包含函数时有什么问题? 在我的情况下,我有以下功能:

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

运行发明功能(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]]

但它没有返回任何东西。如果我包括返回list2除外它返回[[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

2 个答案:

答案 0 :(得分:4)

你递归调用函数 - 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. 现在,您再次访问ai1,现在您转到if部分,这将返回"Hello"

    main -> a(0)         #Returned back to a(0)
    
  3. 现在返回后你不会直接返回main(),你调用a(0)的地方,没有它返回到调用函数a(1)的时候,那是来自内部a(0),所以你返回a(0),继续执行,但由于a(0)没有返回任何内容,你得到main中的默认返回值,即'无

  4. 再次为您的示例,您需要添加return inventedfunction(list2),以便正确返回递归调用的结果,否则递归调用的返回值将被丢弃而不会返回。示例 -

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

答案 1 :(得分:2)

您的函数return子句中有except,因此如果没有异常,它不会返回任何内容。也许你打算在return inventedfunction(list2)内做try