Вот рецепт, использующий reduce
:
def power(f, p, myapply = lambda init, g:g(init)):
ff = (f,)*p # tuple of length p containing only f in each slot
return lambda x:reduce(myapply, ff, x)
def square(x):
return x * x
power(square, 2)(3)
#=> 81
Я называю это power
, потому что это буквально то, что делает функция мощности, с композицией, заменяющей умножение.
(f,)*p
создает кортеж длины p
, заполненный f
в каждом индексе.Если вы хотите получить фантазию, вы должны использовать генератор для генерации такой последовательности (см. itertools
) - но обратите внимание, что она должна быть создана внутри лямбды.
myapply
определяется в списке параметров, поэтому он создается только один раз.