We build numbers from scratch using nothing except functions of one argument returning other functions of one argument. Those numbers, together with a similar implementation of booleans, allow us to remove all Python dependencies from the factorial function. When we're finished, it doesn't even look like code any more, but it still performs the same computation that the original Python function did. The final code is available on GitHub, but it won't make sense unless you've watched the screencast!
Note 1 (for after you've watched this screencast): When converting from Church numerals into Python numbers, there's nothing special about
(lambda x: x + 1)(0). We could also use
(lambda x: x + "A")(""), for example. In that case, the Church numeral 1 would be converted into "A"; 2 would be converted into "AA" etc.
Note 2: MULT can be written a bit more more simply as
lambda n: lambda m: n(ADD(m))(ZERO), but the more complex version shown in the screencast is still correct.