from functools import cache def make_generator(f): n = 1 while True: yield f(n) n += 1 def make_generator_mem(f): @cache def cached_f(n): return f(n) return make_generator(f) def fibonacci(n): if n <= 1: return n return fibonacci(n-1) + fibonacci(n-2) if __name__ == "__main__": print("fibonacci 10 next terms") fib_generator = make_generator_mem(fibonacci) for x in range(10): print(next(fib_generator)) print("square generator") square_generator = make_generator_mem(lambda x : x**2) for x in range(10): print(next(square_generator)) print("ones generator") one_generator = make_generator_mem(lambda x : 1) for x in range(10): print(next(one_generator))