How do you make a higher order function in Python?
Functions and methods are first-class objects in Python, so if you want to pass a function to another function, you can just treat it as any other object.
To bind a function object to a specific context, you can use either nested scopes or callable objects. For example, suppose you wanted to define linear(a,b) which returns a function f(x) that computes the value a*x+b. Using nested scopes:
def linear(a, b): def result(x): return a*x + b return result
Or using a callable object:
class linear: def __init__(self, a, b): self.a, self.b = a,b def __call__(self, x): return self.a * x + self.b
In both cases:
taxes = linear(0.3, 2)
gives a callable object where taxes(10e6) == 0.3 * 10e6 + 2.
The callable object approach has the disadvantage that it is a bit slower and results in slightly longer code. It can be a bit easier to understand, though, especially if you’re used to OO design. It also allows a collection of callables to share their signature via inheritance:
class exponential(linear): # __init__ inherited def __call__(self, x): return self.a * (x ** self.b)
And the object can encapsulate state for several methods:
class counter: value = 0 def set(self, x): self.value = x def up(self): self.value=self.value+1 def down(self): self.value=self.value-1 count = counter() inc, dec, reset = count.up, count.down, count.set
Here inc(), dec() and reset() act like functions which share the same counting variable.