def reduce(function, values):
arg_count = function.func_code.co_argcount
final_values = values
while len(final_values) >= arg_count:
temp_value = eval("function(" + ",".join([str(x) for x in final_values[:arg_count]]) + ")")
final_values = [temp_value] + final_values[arg_count:]
return final_values
print(reduce(lambda a, b, c: a + b * c, [1, 2, 4, 5, 9]))