Jose : Bonjour et bienvenue.
Dans cette vidéo, nous nous intéressons aux itérables en Python.
Dans la dernière vidéo, nous avons étudié
les itérateurs, mais qu'est-ce qu'un itérable ?
Un itérable est un objet qui possède
une méthode __iter__() ou une méthode __iter__().
Donc, quelque chose qui ressemble à ceci.
Une fois que vous avez défini cette méthode dans un objet, celui-ci
est désormais un itérable.
Définissons donc quelque chose.
Définissons un FirstHundredIterable.
Ce FirstHundredIterable va juste
définir cette méthode __iter__(), ou __iter(), et cette méthode
__iter__() indique à Python que vous voulez pouvoir itérer sur
cet itérable, comme dans une boucle for, ou que vous voulez
en faire une partie, ou que vous voulez
le transformer en liste.
Qu'est-ce qu'il doit rendre ?
Il doit renvoyer un itérateur.
Donc return FirstHundredGenerator().
Maintenant, vous pouvez faire quelque
chose comme imprimer la somme de FirstHundredIterable,
et cela vous plaira, et vous dira 4950.
Vous pouvez également l'itérer à l'aide
d'une boucle for et tout se passera bien.
Vous y trouverez également tous les numéros.
C'est ce qui fait un itérable.
Rien de magique, rien d'artificiel.
Pour Python, pour devenir un itérable, il suffit de définir
cette méthode, et cette méthode doit renvoyer quelque chose
sur lequel vous pouvez appeler
__next__().
Il doit renvoyer un itérateur.
Tous les générateurs sont des itérateurs,
et il est donc évident qu'il peut s'agir d'un générateur.
Maintenant, si vous voulez rendre cela un peu plus simple, ce
que vous pouvez faire, au
lieu d'avoir une classe séparée retournant le
FirstHundredIterator, vous pouvez vous demander ...
Il y a cette méthode
__iter__() qui renvoie un objet de ce type.
Qu'est-ce que FirstHundredGenerator()
dans le contexte de cette classe ?
C'est une question assez vague, mais je dirais qu'il s'agit de soi.
Self est toujours l'objet courant, et
ce que vous faites ici, c'est que vous renvoyez un objet,
donc vous pouvez certainement
le faire.
Maintenant, vous n'avez plus besoin de ce FirstHundredIterable,
et vous pouvez simplement retourner FirstHundredGenerator() ici,
et cela restera ainsi.
Maintenant, votre générateur est un peu plus déroutant
parce qu'il est à la fois un itérateur et un itérable, et cela peut être déroutant
dans certains cas, mais cela peut être vraiment
pratique dans d'autres parce
que c'est beaucoup plus court que d'avoir une classe séparée
pour faire cela pour vous.
Une fois encore, l'itérable a renvoyé un itérateur à l'aide
de la méthode __iter__().
Vous pouvez donc le faire à partir de l'itérateur
lui-même, puisque self est toujours un itérateur, parce
que self est l'objet qui a cette méthode __next__().
J'ai mentionné plus tôt dans le cours
quelque chose à propos des boucles for et comment nous avions
besoin d'un objet qui avait dunder __len__() et dunder __getitem__() définis.
De quoi s'agit-il ?
Définissons un autre
itérable, qui aura une fonction __len__(),
len(self. ), et je vais initialiser les voitures ici.
Supposons que nous ayons une personne. cars est égal à cette
liste à deux éléments, nous définissons une méthode dunder __len__(), qui renvoie
la longueur de la liste, et nous définissons également
une méthode __getitem__() qui prend l'index que nous voulons récupérer,
et renvoie simplement self.
voitures[i].
Plus tôt dans le cours, nous avons étudié cette question et j'ai dit que lorsque
vous avez un objet qui ressemble à celui-ci
et qui possède les méthodes __len__() et __getitem__(), vous pouvez
utiliser la boucle for sur cet objet.
Et en effet, si nous faisons for car dans AnotherIterable(), vous
verrez que cela imprime les voitures Fiesta et Focus.
S'agit-il donc aussi d'un itérable ?
Il n'a pas de méthode __iter__().
Il ne renvoie aucun générateur.
Et la réponse est oui.
En Python, vous pouvez définir vos itérables soit avec une
méthode __iter__() qui renvoie un itérable,
soit avec un objet qui a une longueur et un getitem.
Ce sont tous deux des itérables et vous pouvez utiliser des boucles for, vous pouvez utiliser
__sum__(), vous pouvez utiliser __len__() dans ces itérables ...
Désolé, pas __len__(), vous pouvez utiliser __list__().
Ces deux éléments sont donc des itérables.
Maintenant, d'accord ?
Nous en avons appris un peu plus sur les itérables,
sur leur différence avec les itérateurs,
mais ils vont normalement ensemble, main dans la main.
Un itérateur est utilisé pour obtenir la valeur suivante, et un itérable
est utilisé pour passer en revue toutes les valeurs
d'un itérateur.
Un itérateur vous permet en quelque sorte d'avancer pas
à pas, au cas où vous souhaiteriez le faire, en appelant __next__(),
et l'itérable vous permet de passer en revue tous les éléments.
Voilà pour cette vidéo.
Si cela n'a pas beaucoup de sens et que vous vous
demandez "Pourquoi diable vais-je avoir besoin de cela ? Ne vous inquiétez
pas.
Dans quelques sections, vous vous direz
: " Oh mon Dieu, c'est tellement logique ", alors que nous
apprenons ce qu'est le Python asynchrone.
Je vous donne juste quelques conseils.
De plus, lorsque vous souhaitez utiliser ou passer en revue une
liste un peu plus longue, vous pouvez utiliser des générateurs pour le faire.
Maintenant que nous en sommes là, permettez-moi
de préciser qu'au lieu d'avoir my_numbers = [x for x
in [1, 2, 3, 4, 5]] par exemple, il s'agit
d'une compréhension de liste.
my_numbers_gen(), vous pouvez effectuer une compréhension du générateur.
Cette instance n'est pas très utile, mais il s'agit
maintenant d'un objet générateur.
Ce qui est juste une abréviation pour itérer sur une séquence.
Vous pouvez faire next(my_numbers_gen).
Vous pouvez l'imprimer.
La compréhension des générateurs est donc une
chose assez populaire, tout comme l'est celle qui est imprimée.
Je tenais donc à le mentionner.
Il ne s'agit pas d'une compréhension de tuple,
mais d'une compréhension de générateur.
Et nous pouvons l'utiliser pour créer un objet générateur à la volée,
ce qui nous permet d'appeler __next__() dans cette syntaxe également.
Encore une fois, tout ce qu'il fait est de parcourir
cette liste et de produire chaque numéro lorsque vous appelez __next__().
Il ne copie donc pas la liste entière, ce que fait ce programme.
Cela permet de copier la liste et de vous donner une autre copie.
Cela vous permet de les passer en revue une
par une sans avoir à copier l'ensemble de la liste.
Bien sûr, cet exemple n'est pas très bon.
Vous pourriez simplement itérer
sur cette liste puisque vous l'avez déjà là, mais
cela peut être utile dans d'autres cas, par exemple
lorsque vous itérez sur un autre générateur et que
vous voulez y apporter des modifications à la volée.
Il peut donc être utile dans certains cas.
Nous en verrons d'autres exemples plus loin.
Je voulais juste vous donner un aperçu de la syntaxe.
Quoi qu'il en soit, c'est tout pour cette vidéo.
Je ne veux pas vous retenir plus longtemps.
Je vous donne rendez-vous pour le prochain.