【问题标题】:Understanding isinstance in recursion理解递归中的isinstance
【发布时间】:2014-01-27 14:21:04
【问题描述】:

所以基本上我无法理解这两个概念。我已经用谷歌搜索了 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]))

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

【问题讨论】:

    标签: python recursion python-3.x isinstance


    【解决方案1】:

    只需在此处绘制递归:

    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]
    

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

    【讨论】:

    • 非常爱你,伙计!这个问题困扰了我一段时间,现在我终于明白它是如何工作的了。我最终看了你的解释,并运行了该函数应该手动执行的每个命令,以查看它是如何构建整个事情的。
    【解决方案2】:

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

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

    【讨论】:

    • 也感谢您!在将其解释为代码之前,您在作品中和那个人中对其进行了解释。完美解决我的问题!
    猜你喜欢
    • 2016-12-29
    • 2012-07-26
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    相关资源
    最近更新 更多