Первое, что нужно запомнить, это то, что lambda
- это обычные функции, которые:
- Не иметь автоматически имена
- Может использоваться как выражение
- Должен состоять из одного выражения
- Неявно
return
результаты этого выражения
Так что вы всегда можете переписать их как обычные def
функции с именами, если вы запутались. Например, foo
может стать:
def foo(f):
def foo_inner(x):
return f(x + 1) * 2
return foo_inner
Таким образом, вызов foo
с любой функцией (f
) возвращает новую функцию, которая принимает числовой тип, добавляет к нему один, вызывает f
со значением и удваивает результат.
Все остальное это просто отслеживание нескольких слоев обертки здесь, которые я оставлю вам; это не интересная проблема в целом. В реальном коде, который использует фабричные функции, подобные этим, намерение и поведение, как правило, гораздо более понятны (потому что это делается для какой-то цели, а не для решения задач).