На самом деле вы можете! Этот пример с объяснением, надеюсь, проиллюстрирует, как.
определить рекурсивный пример, чтобы получить число только в том случае, если оно равно 5 или более, а если это не так, увеличьте его и снова вызовите функцию check. Повторяйте этот процесс, пока он не достигнет 5, и в этот момент верните 5.
print [ (lambda f,v: v >= 5 and v or f(f,v+1))(lambda g,i: i >= 5 and i or g(g,i+1),i) for i in [1,2,3,4,5,6] ]
результат:
[5, 5, 5, 5, 5, 6]
>>>
по сути, две анонимные функции взаимодействуют следующим образом:
let f(g,x) = {
expression, terminal condition
g(g,x), non-terminal condition
}
let g(f,x) = {
expression, terminal condition
f(f,x), non-terminal condition
}
сделать g, f «той же» функцией, за исключением того, что в один или оба добавьте предложение, в котором параметр изменяется, чтобы вызвать достижение терминального условия, а затем выполните
f (g, x), таким образом, g становится копией f, делая его следующим образом:
f(g,x) = {
expression, terminal condition
{
expression, terminal condition,
g(g,x), non-terminal codition
}, non-terminal condition
}
Вам нужно сделать это, потому что вы не можете получить доступ к самой анонимной функции после выполнения.
т.е. 1017 *
(lambda f,v: somehow call the function again inside itself )(_,_)
, поэтому в этом примере пусть A = первая функция, а B вторая. Мы называем A передачей B как f, а i как v. Теперь, поскольку B, по сути, является копией A и это переданный параметр, теперь вы можете вызвать B, что похоже на вызов A.
Генерирует факториалы в списке
print [ (lambda f,v: v == 0 and 1 or v*f(f,v-1))(lambda g,i: i == 0 and 1 or i*g(g,i-1),i) for i in [1,2,3,5,6,7] ]
[1, 2, 6, 120, 720, 5040]
>>>