0

所以基本上我很难理解这两个概念。我已经用谷歌搜索了 2 天,并用这 2 天为自己创建了某种图片,但它仍然像我并不真正了解一切。据我了解,如果您需要处理多级列表,则 isinstance 用作递归的基础,它根据元素是否返回 true 或 false?属于上述类型。问题是我知道它的定义,但我根本无法让自己理解它是如何真正工作的,以便实际使用它。我想我会放一个示例代码,也许你们中的一些人可以彻底解释这个函数是如何在每个细节上工作的。这里是:

def first_and_last(a):
    if not (isinstance(a,list)):
        return a
    elif a == []:
        return []
    else:
        return [first_and_last(a[0]), first_and_last(a[-1])]


print(first_and_last([[1, 2, 3, [3, 3, 4, 5]], 6, 7, 7]))

基本上,该代码是老师共享的代码,但代码的想法是返回列表每个级别的第一个和最后一个元素。

4

2 回答 2

3

只需在此处绘制递归:

first_and_last([[1, 2, 3, [3, 3, 4, 5]], 6, 7, 7])
   a is a list and not equal to []
   first_and_last([1, 2, 3, [3, 3, 4, 5]])
       a is a list and not equal to []
       first_and_last(1)
           a is not a list
           return 1
       first_and_last([3, 3, 4, 5])
           a is a list and not equal to []
           first_and_last(3)
               a is not a list
               return 3
           first_and_last(5)
               a is not a list
               return 5
           return [3, 5]
       return [1, [3, 5]]
   first_and_last(7)
       a is not a list
       return 7
   return [[1, [3, 5]], 7]

Soisinstance()仅用于查找该调用中传入的值何时不是列表,以终止递归调用树。

于 2014-01-27T14:26:49.117 回答
0

isinstance用于调用on 和 on ,first_and_last因为您可以更深入地了解嵌套列表。考虑前几次调用:在第一次调用a[0]中是 list: [1,2,3[3,3,4,5]],但在下一次调用中,a[0]是一个 integer 1。您不能嵌套到整数中,并且isinstance是检测您已达到“列表列表列表...”层次结构中的“原始”列表元素级别的条件。由于您总是访问列表的第一个 ( a[0]) 或最后一个 ( a[-1]) 元素,因此它不是列表的事实意味着它是您要返回的内容(列表的第一个或最后一个元素,前提是它不是内部列表)。

第二个条件防止调用a[0]a[-1]空列表。如果输入参数中包含一个空列表,这将立即返回它,而不尝试处理其不存在的元素。

于 2014-01-27T14:33:37.510 回答