Формирование списка итераций на собственном выходе в 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]