Jose : Bonjour et bienvenue.
Dans cette conférence, nous parlons de filtre.
Maintenant que nous connaissons
nos générateurs, itérateurs et itérables, nous pouvons
commencer à utiliser des fonctions intégrées amusantes.
La fonction de filtrage est une fonction intégrée
de Python que vous pouvez appeler à partir de n'importe quel fichier ou programme,
c'est ce que signifie l'expression "intégrée",
et elle prend deux arguments.
Le premier argument de la fonction de
filtrage est une autre
fonction qui prend également un itérable.
Voici comment cela se passe
: trouvons une liste d'amis
comme Rolf, Jose, Randy, Anna et Mary, et je sais que j'en ai oublié
une.
Nous allons maintenant
utiliser la fonction de filtrage pour ne retenir que les
amis commençant par la lettre R.
Donc, on commence avec R, qui va être
filter, c'est la fonction, maintenant elle prend
une fonction comme premier argument,
arg 1, une fonction qui renvoie true ou false.
Le premier argument de cette fonction de filtrage
doit donc être une autre fonction qui renvoie true ou false
en fonction de ce que nous voulons filtrer.
Je vais donc définir une fonction ici.
Commence par R.
Le point de retour des amis commence par R.
Ami point commence par R sera vrai si cet
argument commence par un R, il sera faux s'il
ne commence pas.
Le premier argument de la fonction de filtrage doit
être cette fonction commence
par R et le second argument doit
être un itérable, nous savons ce que c'est, donc
friends est un itérable parce que nous pouvons itérer
dessus, c'est une liste et c'est tout,
voilà à quoi ressemble la fonction de filtrage et ce qu'elle
fait, c'est qu'elle ne garde que les éléments pour
lesquels this renvoie true.
Ainsi, la première fois que la fonction
de filtrage s'exécute, elle va vous donner Rolf, Rolf allant
vers les amis, l'ami commence par R,
il va être vrai, donc Rolf sera conservé
par la fonction de filtrage.
Puis il recommencera, et cette fois avec Jose, Jose
commence par R est faux, donc le filtre le supprimera
et l'ignorera et ainsi de suite pour chaque
ami ici présent.
Ce qui est intéressant, c'est que
filter renvoie en fait un générateur,
ce qui est un peu plus efficace. Au lieu de copier
votre liste avec seulement les éléments
que vous voulez garder, vous devez appeler l'élément next, start with R pour
obtenir le prochain élément disponible qui, dans ce cas, sera Rolf.
Et si vous faites cela encore et encore, vous obtiendrez
Randy et finalement
vous obtiendrez cette exception d'arrêt d'itération dont nous avons parlé
plus tôt, c'est ce qui
signale la fin d'une séquence ou d'un générateur
ou d'un itérateur lorsque
vous en atteignez la fin, ok ?
Lorsque vous faites une boucle for,
ce que la boucle for fait en arrière-plan
est d'appeler next et dès que vous atteignez cette itération
stop, la boucle for s'arrête et ne vous
donne pas cette erreur parce
que l'itération stop a été conçue pour
signifier cela et que la boucle for est une construction
qui utilise l'itération stop pour savoir quand elle
a atteint la fin, d'accord ?
Bien sûr, si vous faites la liste de commencer par R, vous obtiendrez une liste
de tous les éléments du générateur,
vous passerez en revue chaque
élément et vous le placerez dans une nouvelle
liste.
Si vous recommencez, que pensez-vous
qu'il va se passer ?
Eh bien, vous obtiendrez une liste vide,
l'objet liste ici ne lève pas un stop itération mais il voit que le stop itération
est levé et il ne vous donne rien, il vous
donne juste une liste vide
maintenant parce que le générateur
a déjà été utilisé et il se souvient qu'il
a atteint la fin donc il ne peut rien vous
donner d'autre.
C'est pourquoi j'explique les générateurs, les itérateurs
et les itérables avant d'aborder cette fonction de filtrage, d'accord ?
Bien sûr, au lieu de définir une fonction qui prend un
paramètre et renvoie le
paramètre commençant par R, nous pourrions
simplement utiliser un lamda.
Cette fonction lamda est exactement
la même, elle prend un paramètre et après
les deux points, nous définissons ce qu'elle renvoie.
Ce qu'elle renvoie est x dot commence par R, donc c'est
soit vrai soit faux selon que
x commence par R ou non.
Si cela vous rassure, vous pouvez appeler
le paramètre friend et de cette façon, il est peut-être
un peu plus clair que cette
fonction va opérer sur ces friends
ici, alors vous n'avez plus
besoin de cette fonction là.
De plus, nous n'avons plus besoin de ce commentaire
puisque nous savons maintenant ce qu'il signifie.
Cette fonction de filtrage est
identique à cette
expression génératrice, cette compréhension
génératrice qui dit, F pour F dans
amis, si F point commence par R.
Ces deux-là sont donc identiques, d'accord ?
Ici, nous avons une expression de générateur,
une compréhension de générateur qui place chaque
ami dans un nouveau générateur, mais seulement si F commence par R, donc ces
deux-là sont les mêmes, d'accord ?
Lequel est le plus rapide ?
Lequel est le plus performant ?
Celui-ci, la compréhension du générateur, est plus
performant dans ce cas, du moins.
La raison en est que vous devez
créer cette fonction lamda dans ce filtre et que vous n'avez pas
besoin de créer une fonction lamda
dans l'expression du générateur.
Si votre fonction est déjà définie ailleurs
dans votre programme, la fonction
de filtrage peut être plus performante et, dans certains
cas, je pense que la fonction
de filtrage peut être plus lisible, bien que dans de nombreux autres cas,
je pense que la compréhension
de la liste est plus lisible.
C'est donc à vous de voir lequel
vous utilisez, j'opte normalement pour les compréhensions,
c'est aussi un peu plus Pythonique.
D'ailleurs, par souci d'exhaustivité,
pour que l'on comprenne bien ce qui se passe,
ces deux filtres et ce générateur de compréhension
sont identiques à cette autre fonction
que je vais définir.
Il s'agit d'une autre
fonction de filtrage,
très semblable à celle-ci, qui
prend une fonction et un itérable et qui va itérer
sur l'itérable, vérifier si la fonction
retourne vrai ou non et produire I à la fin si la fonction est vraie.
Imaginons que nous appelions mon filtre personnalisé ici.
Lamda friend starts with R est cette fonction,
l'itérable est notre liste d'amis.
Nous itérons sur la table itérative, nous obtenons le premier élément
qui est Rolf.
Si func I that is, friend starts with R is true, ce qui
est le cas, alors nous allons obtenir
I, that's Rolf.
Lorsque nous appellerons next sur cette fonction, nous
obtiendrons Rolf et nous nous arrêterons
juste après la ligne 9.
Quand nous appelons next à
nouveau, nous allons revenir au début, c'est
I, nous allons, c'est Jose d'ailleurs, la chaîne
Jose, nous allons vérifier
si la fonction correspond, ce sera false donc nous
n'allons rien céder, nous ne nous arrêtons pas, nous passons à
l'élément suivant de la boucle, nous vérifions si Randy
commence par R et c'est le cas, c'est le cas, donc
nous cédons Randy et nous nous arrêtons.
La prochaine fois que nous appelons next, nous
allons ici et c'est Anna, c'est faux, donc nous ne cédons pas, nous
continuons, I is Mary, c'est faux donc nous ne cédons
pas, nous continuons, nous atteignons la fin, c'est un stop
itération donc nous atteignons la fin de l'objet générateur
et c'est un autre stop itération qui nous dit que nous
avons atteint la fin.
J'espère que cela a du sens, cela commence
à se rapprocher un peu plus de ce qu'est Python,
à savoir la gestion des données et l'envoi de données
d'un endroit à un autre, et le rendement est
extrêmement puissant
parce qu'il vous permet d'arrêter
et de générer les valeurs une par une sans avoir à les
stocker toutes en même temps dans la mémoire.
Bref, c'est tout pour cette
vidéo, je voulais juste vous montrer cette fonction de filtre
et comment elle est utilisée.
La fonction de filtrage est également
présente dans de nombreux autres langages
de programmation. Vous la verrez donc partout au fur et
à mesure que vous développerez vos compétences en programmation
et que vous poursuivrez votre parcours dans ce domaine.
Et donc, oui, c'est tout et je vous
verrai dans la prochaine vidéo.