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 шт):
потому что происходит следующее
- добавляется новый элемент равный сумме всех элементов через
signature.append - удаляется первый элемент из списка через
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]
тут явно видно