diff --git a/snippets/unfold.md b/snippets/unfold.md new file mode 100644 index 000000000..a354cc4a8 --- /dev/null +++ b/snippets/unfold.md @@ -0,0 +1,25 @@ +--- +title: unfold +tags: function,list,advanced +--- + +Builds a list, using an iterator function and an initial seed value. + +The iterator function accepts one argument (`seed`) and must always return a list with two elements ([`value`, `nextSeed`]) or `False` to terminate. +Use a generator function, `fn_generator`, that uses a `while` loop to call the iterator function and `yield` the `value` until it returns `False`. +Use list comprehension to return the list that is produced by the generator, using the iterator function. + +```py +def unfold(fn, seed): + def fn_generator(val): + while True: + val = fn(val[1]) + if val == False: break + yield val[0] + return [i for i in fn_generator([None, seed])] +``` + +```py +f = lambda n: False if n > 50 else [-n, n + 10] +unfold(f, 10) # [-10, -20, -30, -40, -50] +```