Формирование списка итераций на собственном выходе в Python

Извините за то, что кажется базовым вопросом, но я нигде не смог его найти. В Python 2 я хотел бы применить функцию с 1 переменной к ее собственному выводу, хранящему список всех шагов, то есть, если f(x) возвращает x*x, тогда итерируя от 2, мне нужно получить

[2, 4, 16, 256, 65536, ...]

В идеале мне нужно было бы передать свою функцию f, первый вход 1и количество итераций, которые я хотел бы сохранить.

Я думаю, это в некотором смысле противоположность reduce и чем-то похожим на unfold из функционального программирования.

Наивный способ сделать это - написать

out = [2] for x in xrange(5): out.append(f(out[-1]))

Какой хороший Pythonic способ сделать это? Большое спасибо.

2 ответа

Решение

Что вам нужно, это " Генератор". Например,

def f(x, n):
    for _ in range(n):
        yield x
        x = x * x

l = list(f(2, 5))

print(l)             # [2, 4, 16, 256, 65536]

Или же

def f(x):
    while True:
        yield x
        x = x * x

for v in f(2):
    if v > 100000:
        break
    print(v),        # 2 4 16 256 65536

В идеале мне нужно было бы передать в моей функции f первый вход 1 и количество итераций, которые я хотел бы сохранить.

Вот развернутая функция, которая принимает функцию, начальное значение и счетчик итераций.

def unfold(function, start, iterations):
    results = []
    for _ in range(iterations):
        results.append(start)
        start = function(start)

    return results

Который вы можете использовать, как ожидалось:

>>> print unfold(lambda x: x*x, 2, 5)
[2, 4, 16, 256, 65536]
Другие вопросы по тегам