This is the power of mathematics

```
def middle(s):
return s[(len(s) - 1) // 2 : len(s) // 2 + 1]
```

Let’s call the length of the string N, some integer greater than zero.

(The empty string case, when N = 0, also works, but the analysis is a bit more complicated.)

If N is even (2, 4, 6, …) then N-1 is the *odd* number just before it, and then the floor division halves it (throwing away the remainder). If N is odd (1, 3, 5, …) then N-1 is the *even* number just before it, then the floor division halves it with no remainder.

So let’s do a table of values (let’s hope I get the markup right).

```
N | (N-1)//2 | N//2
1 | 0 | 0
2 | 0 | 1
3 | 1 | 1
4 | 1 | 2
5 | 2 | 2
6 | 2 | 3
7 | 3 | 3
8 | 3 | 4
```

and so on. So you can see that each second and third columns advance every second row. When N is odd, the second and third columns point to the same index. When N is even, the second and third columns point to two positions exactly one place apart.

So when N is odd, the two values both point to the middle index.

When N is even, the two values point to the middle two indices.

Finally we need to add 1 to the third column (N//2 + 1) because of the way Python specifies slices. The start position is included, but the end position is not, so to include it you need to add one.