式としてのループはあるけど、変数スコープが1周限りなのが、複雑になってる原因。
これでもっと単純になる。
def my_reduce(f, xs, init):
 a = [init]
 return [a.append(f(a[i], x)) or a[-1] for i,x in enumerate(xs)][-1]