Это интересно, но я бы не предлагал вам делать то, что я напишу ниже, потому что это будет нечитабельно.
Во-первых, вы не хотите явно создавать функцию. Для этого вам нужно иметь представление списка, подобное выражению. Это правило.
Итак, как я могу выполнять вложенную функцию? В математике это называется композицией функций (например, f(g(h(x))
для функций f(x)
, g(x)
, h(x)
). Единственное, что я могу придумать достаточно близко к этому в Python, - это reduce
. Вы можете сократить список функций до одной «сокращенной» функции. Мое решение таково:
import functools
a=[[[[[1,2,3,4,5]]]]]
five = functools.reduce(
lambda f,g: lambda x: f(g(x)),
[lambda x: x.pop() for _ in range(5)],
lambda x:x
)(a)
Вы получите five == 5
выше. Что выталкивает последний элемент из самого внутреннего списка.
Позвольте мне немного пояснить вышесказанное:
functools.reduce()
- это создание функции f(f(f(f(f(a)))))
, которая определяется f(x)
как x.pop()
. Он вложен пять раз, поэтому я использую range(5)
во втором аргументе functools.reduce()
- Первый аргумент - выполнить вложенность
- Третий аргумент - создать функцию, которая возвращает сам. Идея для самого внутреннего
f(a)
, нам нужно express как вложенную функцию. Итак, это f(g(a))
, которое g(a)=a
и f(a)=a.pop()
- Все это возвращает вызываемый объект. Поэтому мы вызываем его с аргументом
a
для его выполнения - По сути, это эквивалентно запуску
a.pop().pop().pop().pop().pop()
с a
, доступ к которому осуществляется через лямбда-функцию идентификации lambda x: x
Да, сложно и трудно читать. Но это можно сделать в Python.