# Functioning Properly

So as part of my grand plan to get back into coding, I’ve been helping out a friend with some assignments for school.  I thought at first that it would be easy, you know, basic algorithm type of work, object-oriented design, data structures, etc.  Much to my surprise, the homeworks have been really challenging.  Maybe my software foundation could be stronger, but it turns out that this intro-level programming class is teaching functional programming.  No wonder my friend was having so much trouble.  It would be frustratingly difficult to be taught this introduction to programming.  Maybe it speaks to my age, but object-oriented design and functions returning values just made more intuitive sense, or at least came to me more quickly.

In summary, I’ve had to keep up with the readings and homework just to stay afloat.  I didn’t think I was that out of practice … In any case, this class is studying Python.  An interesting first choice.  Once I figured out why my friend was having so much trouble, I started to delve into the language myself.  And serendipitously, I’ve begun to understand why functional programming and the greater potential for abstraction is so powerful.  Take a look at this for instance:

```def accumulate(combiner, start, n, term):
"""Return the result of combining the first n terms in a sequence."""
""" Combiner = a function
term = a function
start = base value to use to start the accumulation
n = n terms to accumulate
"""
k, result = 1, start
while (k <= n):
result = combiner(result, term(k))
k = next(k)
return result

def summation_using_accumulate(n, term):
"""An implementation of summation using accumulate."""

def product_using_accumulate(n, term):
"""An implementation of product using accumulate."""
return accumulate(mul, 1, n, term)
```

This is pretty sick. You can define a universe of summation functions or product summation functions just by passing in type of function you want to execute. For example:

```def identity(x):
"""
>>> summation_using_accumulate(5, identity)
15

>>> product_using_accumulate(4, identity)
24
"""
return x

```

By making either of these calls, you can add add the first n integers together, or multiply the first n integers together (i.e. factorial) and return the result. Really cool. I didn’t expect when I agreed to help out my friend that I would actually learn something new. I thought that at best, I would get a rough rehashing of my software fundamentals which would just help me remember some of the things I had forgotten. It turns out that I’m learning a new programming paradigm altogether. /mind blown.