В документации реализация этих функций записана в императивном стиле видимо для наглядности (ИМХО, наглядность довольно спорная). Можно попробовать записать их в функциональном стиле - это не сложно (напомню, что
all
- это конъюнкция всех элементов списка/итератора, приведенных к логическому типу, а
any
- соответственно, дизъюнкция).
import operator
all = lambda xs: reduce(operator.__and__, map(bool, xs), True)
any = lambda xs: reduce(operator.__or__, map(bool, xs), False)
При такой записи сразу становятся очевидны причины соответствующего поведения на пустых списках.