functional programming folding
Python reduce explained