【问题标题】:How to explain in layman's terms for this function (function, list, in and isinstance)?这个函数(function、list、in和isinstance)如何通俗地解释?
【发布时间】:2020-01-29 14:42:37
【问题描述】:

我遇到了这个功能:

 def count_list(l):          
      count = 0          
      for e in l:               
           if isinstance(e, list):                    
                count = count + 1 + count_list(e)                    
      return count

特别是for e in 1isinstance(e, list) 看不懂,不知道有没有专业人士可以解释一下?刚开始学习功能,listinisinstance

【问题讨论】:

  • 我不是专业人士,但这绝对是较低的L 而不是 1。
  • 是的,你是对的。我只知道这个函数假设计算一个嵌套列表并告诉一个列表中有多少个嵌套列表。但我无法理解这段代码在逻辑上的含义。
  • 这是一个很好的学习时刻。我建议你在几个例子上运行它,并在函数的重要部分添加一些prints 以检查发生了什么。也就是说 - 这个函数是递归的,这可能是一个有点高级的话题,直到你掌握了其余的基本知识(但只要你了解函数,你就可以理解递归)
  • the official Python Tutorial 中阅读此内容并自己运行其中的示例。
  • 嘿,感谢@Adam.Er8 和@usr2564301 的建议。我做了一些打印并快速阅读,并且可以猜测该函数意味着....对于列表 (l) 中的每个元素 (e),如果 (e) 匹配/在列表 (l) 中找到,则 + 1 计数直到找不到任何东西,然后退出该函数。我有一个问题,所以我可以将“l”或“L”表示为 List 的简写形式吗?至于(e),似乎我可以随意命名它并且仍然可以正常运行。但是对于 (l),我无法更改为任何字母,否则会显示错误。

标签: python-3.x list function isinstance


【解决方案1】:

Python 变量是“动态的”,这意味着传入参数l(即小写 L)不一定具有特定类型。它可以是一个 int,或一个字符串,或一个列表等。

在这种情况下,如果它恰好是一个列表,for 循环将遍历该列表的每个元素。循环检查加载到变量e 的列表中的每个元素是否也是列表的一个实例。如果为真,它将变量count 增加1 并回调函数count_list 以计算该列表的大小并添加到count

调用你所在的函数就是所谓的递归函数,这就是你在这里所拥有的。

一般的想法似乎是这个函数试图计算嵌套列表中的元素总数。

您可以在调试器中试用它(PyCharm 是一个很棒的 IDE),看看它是如何工作的。尝试像这样调用你的函数:

count_list([1,2,3,[1,2,3,[1,2],4],4,5,6])

【讨论】:

  • 非常感谢您的帮助。我还尝试使用变量来猜测它将如何影响结果的变化。我有一个问题,所以我可以将“l”或“L”表示为 List 的简写形式吗?至于(e),似乎我可以随意命名它并且仍然可以正常运行。但是对于 (l),我不能更改为任何字母,否则会显示错误,但大写 L 很好。那么List在python中可以用L或l来表示吧?
  • 不,您可以为变量命名的内容没有任何限制。变量的类型也与变量的命名无关。在这种情况下,唯一的事情是,如果您将 l 重命名为其他名称,那么您必须将传入变量 l 也重命名为相同的新名称。这也适用于所有其他变量。您可以重命名e,但您必须在使用它的任何地方重命名它,否则它会给您一个错误,或者您的方法将无法正常工作
  • 哦。我想我明白了...是的...我忘记注意到 count_list(l) 中有一个“l”,因此当我只更改底部的“l”时,会显示错误。好的,我现在明白了,“i”和“e”只是函数内部用于检查和计数的变量。非常感谢。
【解决方案2】:

让我们读一下吧:

# define the method count_list that take one argument l (lower L)
def count_list(l):
    # define count to be a int with value 0
    count = 0
    # for each item e in l (we supose that l can be itered)
    for e in l:
        # if e is a list
        if isinstance(e, list):
            # add one to count and the result of count_list called on e (recursive call)
            count = count + 1 + count_list(e)                    
    return count

备注:

  • 如果e 不是列表,count 不会改变。仅当在 l 中找到列表时,此方法才会将 count 加一。
  • 它还会增加列表中该列表中的列表数量。
  • 最后返回l中嵌套列表的个数。对于遇到的每个列表,它会使用递归调用添加1+number of list in that list

示例:

这里表示l的内容:

  • 元素
  • 列表A
    • 元素
    • 元素
    • 列表B
      • 元素
      • 元素
    • 列表C
      • 元素
  • 元素

当我们调用count_list(l)时会发生什么:

  • 使用参数l 调用count_list(调用1)。
  • l 的元素被迭代。
  • 元素ListA 是一个列表。 count(在调用 1 中)递增 1,并使用参数 ListA 调用 count_list 的结果。
  • 使用参数ListA 调用count_list(调用2)。
    • ListA 的元素被迭代。
    • 元素ListB 是一个列表。 count(在调用 2 中)递增 1,并使用参数 ListB 调用 count_list 的结果。
      • 使用参数ListB 调用count_list(调用3)。
      • ListB 的元素被迭代。
      • 未找到列表 0 返回(调用 3)
    • count(在调用 2 中)值是 0+1+0 的结果。我是1
    • 元素ListC 是一个列表。 count(在调用 2 中)递增 1,并使用参数 ListC 调用 count_list 的结果。
      • 使用参数ListC 调用count_list(调用4)。
      • ListC 的元素被迭代。
      • 未找到列表 0 返回(调用 4)
    • count(在调用 2 中)值是 1+1+0 的结果。我是2
    • ListA 中没有列表。
    • 2 返回(调用 2)
  • count(在调用 1 中)值是 0+1+2 的结果。我是3
  • l 中没有列表。
  • 3 返回(调用 1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 2012-06-29
    • 1970-01-01
    • 2022-01-05
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多