Python. Задача с Codewars

Есть задача https://www.codewars.com/kata/556deca17c58da83c00002db/python

Вкратце, каждый следующий элемент последовательности являет сумму трех предыдущих. Среди входных данных есть число N, передающее сколько элементов последовательности надо вернуть (последовательность возможно надо сократить).

И есть рабочее решение:

def tribonacci(signature, n):
    return [ signature.append(sum(signature)) or signature.pop(0) for i in range(n) ]

Вопросов у меня три:

Как sum понимает что нужно суммировать не все элементы списка а только последние 3?

Почему pop(0) удаляя первый элемент списка, дает правильное решение? По логике, при наличии списка длинной больше N, нужно удалять последние элементы.

Как or вообще что-то тут делает что оно все работает?


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

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

потому что происходит следующее

  1. добавляется новый элемент равный сумме всех элементов через signature.append
  2. удаляется первый элемент из списка через signature.pop(0)

поскольку signature.append не возвращает значение (возвращает None), то обязательно будет выполнено signature.pop(0)

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

P.S. но решение оригинальное, интересное :)

P.P.S. можно использовать и такое решение:

def tribonacci(signature, n):
  for i in range(n):
    signature.append(sum(signature[-3:]))

  return signature[:n]

тут явно видно

→ Ссылка