# Python Partial

A short note on Python partials and why it's awsome.

This is a short note on the Python function `partial`

.

Partials are very common in functional languages such as Haskell and Elm.

## Functional language

Suppose you need a function to color a line, it would map the position on the line (ranging from 0 to 1) to a RGB color like so
*(for convenience I noted the tuple as RGB instead of (Int, Int, Int)*):

```
color :: Position -> RGB
```

But we do not want to define a function for, say, all gradients:

```
blue_green :: Position -> RGB
blue_green p = (0, p * 255, (1 - p) * 255) + (0, (1 - p) * 255, p * 255)
```

We can now define a function:

```
gradient :: RGB -> RGB -> Position -> RGB
gradient l r p = (1 - p) * l + p * r
```

However we’re in a bit of a pickle since our line coloring expects a function that maps positions to RGB. Functional languages allow is to simply only pass the first two arguments:

```
color_function = gradient (0, 255, 50) (50, 0, 100)
```

This yields a function that maps positions to RGB and the functionality does not need to know how it was constructed.

## Python

Python has the `partial`

function to do this.

```
# Target signature and behaviour:
def color (position):
return (R, G, B)
# Gradient coloring function
def gradient(p, left=(0, 0, 0), right=(255, 255, 255)):
return tuple((1 - p) * left[i] + p * right[i] for i in range(3))
# Now get a blue-green coloring function
blue_green = partial(gradient, left=(0, 0, 255), right=(0, 255, 0))
```

Alternatively:

```
# Target signature and behaviour:
def color (position):
return (R, G, B)
# Gradient coloring function
def gradient(left, right, p):
return tuple((1 - p) * left[i] + p * right[i] for i in range(3))
# Now get a blue-green coloring function
blue_green = partial(gradient, (0, 0, 255), (0, 255, 0))
```