En fait, vous pouvez! Cet exemple avec une explication nous l'espérons illustrera comment.
Définir un exemple récursif pour obtenir un nombre seulement quand il est 5 ou plus et si ce n'est pas, l'incrémenter et appeler à nouveau la fonction 'vérifier'. Répétez ce processus jusqu'à ce qu'il atteigne 5 à quel point le retour 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] ]
Résultat:
[5, 5, 5, 5, 5, 6]
>>>
essentiellement les deux fonctions anonymes interagissent ainsi:
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
}
make g, f la même fonction sauf que dans l'un ou les deux ajouter une clause où le paramètre est modifié de manière à provoquer l'atteinte de la condition terminale, puis aller f (g, x) de cette façon g devenir est une copie de f ce qui en fait comme:
f(g,x) = {
expression, terminal condition
{
expression, terminal condition,
g(g,x), non-terminal codition
}, non-terminal condition
}
Vous devez faire cela parce que vous ne pouvez pas accéder à la fonction anonyme lui-même après avoir été exécutée.
i.e.
(lambda f,v: somehow call the function again inside itself)(_,_)
donc dans cet exemple, soit A = la première fonction et la deuxième chambre. Nous appelons A passant B comme f et i comme v. Maintenant que B est essentiellement une copie de A et c'est un paramètre qui a été passé, vous pouvez maintenant appeler B qui est comme appelant A.
Ceci génère les factorielles dans un liste
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]
>>>
Si l'ordre n'est pas un problème, 'list (set (num))'. Sinon, vérifiez 'unique_everseen' dans http://docs.python.org/library/itertools.html. – kennytm
alerte fuite d'abstraction. À mon avis, les compréhensions ne doivent pas être considérées comme des boucles, même si elles peuvent être implémentées comme des boucles dans cpython. – wim