Почему возникает ошибка в коде?

Здравствуйте. В поисках ускорения вычисления экспоненциального скользящего среднего решил написать под это рекурсивный алгоритм. Люблю рекурсию и стараюсь чаще ее применять.
Вот, собственно код:
def get_ema(array, N: int, prev_ema: float = None):
    alpha = 2 / (1 + N)
    if len(array) == 1:
        ema = []
        ema.append(array[0] * alpha + (1 - alpha) * prev_ema)
        return ema

    if not prev_ema:
        for_sma = array[:N]
        sma = sum(for_sma) / len(for_sma)
        return get_ema(array[N:], N, prev_ema=sma).append(sma)
    else:
        new_ema = array[0] * alpha + (1 - alpha) * prev_ema
        return get_ema(array[1:], N, prev_ema=new_ema).append(new_ema)

При запуске возникает ошибка AttributeError: 'NoneType' object has no attribute 'append', указывающая на последнюю строку. Мне не понятно почему. Вроде должен вернуться список, значит append работать должен. Где я ошибся?
  • Вопрос задан
  • 93 просмотра
Решения вопроса 1
SoreMix
@SoreMix Куратор тега Python
yellow
append() возвращает None. Так что любой return (кроме return ema) вернет None. Ну и на следующей итерации код посыпется.

Можно быстро проверить, заменив первый блок if
tmp = get_ema(array[N:], N, prev_ema=sma)
print(type(tmp))
return tmp.append(sma)

и второй
tmp = get_ema(array[1:], N, prev_ema=new_ema)
print(type(tmp))
return tmp.append(new_ema)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы