I got into a debate about Python’s support for functional programming (FP) with a friend. One of the challenging parts was listening to him say, “Python is broken” a number of times.
Python is not broken. It’s just not a great language for writing pure functional programs. Python seemed broken to my friend in exactly the same way that a hammer seems broken to someone trying to turn a screw with it.
I understand his frustration. Once you have fully embraced the FP mindset, it is difficult to understand why people would write programs any other way.
I have not fully embraced the FP mindset. But that doesn’t mean that I can’t apply some FP lessons to my Python programs.
In discussions about how FP and Python relate, I think too much attention is paid to the tactics. For example, some people say, “no need for map/filter/lambda, use list comprehensions.” Not only does this put off FP people because they’re being told to abandon the tools they are used to, but it gives the impression that list comprehensions are somehow at odds with FP constructs, or are exact replacements.
Rather than focus on the tactics, the important ideas to take from FP are strategies, including:
- Write small functions with no side-effects
- Don’t change existing data, make new data
- Combine functions to make larger functions
These strategies all lead to modularized code, free from mysterious action at a distance. The code is easier to reason about, debug, and extend.
Of course, languages that are built from the ground up with these ideas in mind will have great tools to support them. They have tactics like:
- Immutable data structures
- Rich libraries of higher-order functions
- Good support for recursion
Functional languages like Scheme, Clojure, Haskell, and Scala have these tools built-in. They are of course going to be way better for writing Functional programs than Python is.
FP people look at Python, see none of these tools, and conclude that Python can’t be used for functional programming. As I said before, Python is not a great language for writing purely function programs. But it’s not a lost cause.
Even without those FP tools in Python, we can keep the FP strategies in mind. Although list comprehensions are presented as the alternative to FP tools, they help with the FP strategies, because they force you to make new data instead of mutating existing data.
If other FP professionals are like my friend, they are probably saying to themselves, “Ned, you just don’t get it.” Perhaps that is true, how would I know? That doesn’t mean I can’t improve my Python programs by thinking Functionally. I’m only just dipping my toes in the water so far, but I want to do more.
For more thoughts about this: