Как объяснить в терминах непрофессионала для этой функции (функция, список, в и isinstance)? - PullRequest
0 голосов
/ 29 января 2020

Я сталкивался с этой функцией:

 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 1 и isinstance(e, list), интересно, кто-нибудь из профессионалов может объяснить? Только что начали изучать функции list, in и isinstance

Ответы [ 2 ]

2 голосов
/ 29 января 2020

Python переменные являются «Dynami c», это означает, что входящий аргумент l (это строчная буква L) не обязательно имеет определенный тип c. Это может быть int, или строка, или список et c.

В этом случае, если это окажется список, for l oop будет выполнять итерацию по каждому элементу этого списка. L oop проверяет, является ли каждый из элементов списка, загруженных в переменную e, также экземпляром списка. Если true, он будет увеличивать переменную count на 1 и вызывать функцию count_list, чтобы вычислить размер этого списка, а также добавить к count.

Вызов функции, внутри которой вы находитесь, - это то, что называется рекурсивной функцией, вот что у вас здесь есть.

Общая идея, по-видимому, заключается в том, что эта функция пытается вычислить общее значение. количество элементов во вложенных списках.

Вы можете попробовать его в отладчике (PyCharm - отличная IDE), чтобы увидеть, как именно он работает. Попробуйте вызвать вашу функцию так:

count_list([1,2,3,[1,2,3,[1,2],4],4,5,6])
1 голос
/ 29 января 2020

Давайте прочитаем это:

# 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 не изменяется. Этот метод увеличивает count на единицу только тогда, когда список находится внутри l.
  • Он также увеличивается на номер списка в этом списке в списке.
  • Наконец, он возвращает номер вложенного списка в l. Для каждого встречающегося списка добавляется 1+number of list in that list с использованием рекурсивных вызовов.

Пример:

Вот представление содержимого l:

  • Элемент
  • Элемент ListA
    • Элемент
    • Элемент
    • СписокB
      • Элемент
      • Элемент
    • ListC
      • Элемент
  • Элемент

Что происходит, когда мы вызываем count_list(l):

  • count_list вызывается с параметром l (вызов 1).
  • Элемент l повторяется.
  • Элемент ListA представляет собой список. count (в вызове 1) увеличивается на 1, и результат вызова count_list с параметром ListA.
  • count_list вызывается с параметром ListA (вызов 2) ,
    • Элемент ListA повторяется.
    • Элемент ListB является списком. count (в вызове 2) увеличивается на 1, а результат вызова на count_list с параметром ListB.
      • count_list вызывается с параметром ListB (вызов 3).
      • Итерируется элемент ListB.
      • Список не найден 0 возвращается (вызов 3)
    • count (в вызове 2) значение является результатом 0+1+0. Это 1.
    • Элемент ListC является списком. count (в вызове 2) увеличивается на 1, а результат вызова на count_list с параметром ListC.
      • count_list вызывается с параметром ListC (вызов 4).
      • Итерируется элемент ListC.
      • Список не найден 0 возвращается (вызов 4)
    • count (в вызове 2) значение является результатом 1+1+0. Это 2.
    • В ListA не осталось списка.
    • 2 возвращается (вызов 2)
  • count (в вызове 1) значение является результатом 0+1+2. Это 3.
  • В l не осталось ни одного списка.
  • 3 возвращается (вызов 1)
...