Potrzebuję funkcji Python iterate(f, x)
, która tworzy iterator zwracający wartości x, f (x), f (f (x)), f (f (f (x))) itp (jak np. Clojure's iterate
). Przede wszystkim zastanawiałem się: czy to już istnieje w standardowej bibliotece i brakuje mi jej tylko? Oczywiście jest to dość łatwe do wdrożenia z generatorem:Używanie itertools do aplikacji funkcji rekursywnej
def iterate(f, x):
while True:
yield x
x = f(x)
Tak z ciekawości: Czy jest bardziej funkcjonalny sposób to zrobić w Pythonie, np z niektórymi magicznymi narzędziami lub magicznymi funkcjami?
W Pythonie 3.3 to będzie działać
def iterate(f, x):
return accumulate(repeat(x), lambda acc, _ : f(acc))
ale wygląda nadużycia do mnie. Czy mogę to zrobić ładniej?
Powiedziałbym, że 'Akumuluj()' wersja jest po prostu w porządku. * Obie wersje * są w porządku. –
To, co naprawdę dziwne jest w wersji 'accumulate()', to potrzeba 'repeat (x)' lub czegoś podobnego, ponieważ x jest naprawdę potrzebna * raz * jako nasienie do obliczeń. – embee
@embee Teraz, kiedy o tym wspomniałeś, uważam to za dziwne. Najlepiej jako pierwsze rozwiązanie – jamylak