Для чего мы используем 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 шт):
В вашей задачи происходит сложение простых значений в списках с вложенными списками, поэтому нужна проверка типа значения, чтобы понять чем является значение и что с ним нужно делать.
Такой проверкой 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]]))