Для чего мы используем isinstance(x, list):

Пример из учебника по питону:

def sumtree(L):
    tot = 0
    for x in L:   # Обход элементов одного уровня     
        if not isinstance(x, list):
            tot += x           # Числа суммируются непосредственно
        else:
            tot += sumtree(x)  # Списки обрабатываются рекурсивными вызовами
    return tot

Далее:

 print(sumtree([1, [2, [3, [4, [5]]]]]))  #получаем 15 на выходе

Вопрос: Почему нам так важно включить в условие:

if not isinstance(x, list): tot += x

Я хочу понять логику работы. Пожалуйста объясните почему мы должны написать код именно таким образом?


Ответы (1 шт):

Автор решения: gil9red

В вашей задачи происходит сложение простых значений в списках с вложенными списками, поэтому нужна проверка типа значения, чтобы понять чем является значение и что с ним нужно делать.

Такой проверкой if not isinstance(x, list) проверяется, что x не является списком, чтобы можно было без ошибок сложить значение x с счетчиком tot. А если x является списком, то отправить его в рекурсию, чтобы внутри нее перебрать этот список и вернуть сумму по счетчику


Например, у вас среди значений есть наглядный [4, [5]]. При переборе в цикле в x сначала будет 4, а на следующей итерации будет [5]:

  • при x = 4, проверка isinstance(x, list) будет False, и значение 4 будет прибавлено к tot
  • при x = [5], проверка isinstance(x, list) будет True, и значение [5] будет отправлено в sumtree. В функции оно в цикле будет перебираться и там x = 5 будет прибавлено в tot, цикл закончится и функция вернет 5, оно прибавится к tot в текущей функции для [4, [5]] и снова завершится функция и вернется 9 (т.к. 4 + 5 в [4, [5]])

Попробуйте:

print(sumtree([4, [5]]))
→ Ссылка