This Stack Overflow answer[1] presents an interesting way to do tail call optimization in Python using the Y combinator.
Small correction: this answer does not use the Y combinator to optimise tail recursion in Python (and this would be impossible). Instead, it modifies the Y combinator to do this, by using an iterative loop in its implementation.