На самом деле вы можете! Надеюсь, этот пример с объяснением проиллюстрирует, как это сделать.
определите рекурсивный пример, чтобы получить число, только если оно равно 5 или более, а если это не так, увеличьте его и снова вызовите функцию «проверить». Повторяйте этот процесс, пока не достигнет 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
}
Вам нужно сделать это, потому что вы не можете получить доступ к самой анонимной функции после ее выполнения.
i.e
(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]
>>>
person
Henry Hollingworth
schedule
11.08.2012
list(set(num))
. В противном случае отметьтеunique_everseen
в docs.python.org/library/itertools.html. - person kennytm   schedule 14.04.2010