Bonjour à tous,
Je vous propose un article d'introduction aux itérateurs et aux générateurs.
Bonne lecture :)
Version imprimable
Bonjour à tous,
Je vous propose un article d'introduction aux itérateurs et aux générateurs.
Bonne lecture :)
Salut,
Je vais encore apprendre des choses, merci:ccool:
:salut:
Merci beaucoup ! ;)
Bonsoir et bravo tout d'abord pour ce tutoriel,
J'ai apprécié la partie itérateurs, mais je dois avouer que je suis un peu rester sur ma fin quand aux générateurs...
Je m'explique,
Dans la partie itérateur, tu exprimes la façon dont on crée un itérateur à l'aide de la méthode __iter__, très bien ! Cependant tu ne le fais pas pour la création d'un générateur sur cette même méthode en utilisant le mot clé yield, c'est dommage car ça permet au lecteur de comparer les deux codes ;)
Pour rester cohérent avec ce que tu as écris j'aurais fait cela...
Autre chose, j'ai remarqué une faible indentation (2 espaces), dans le fond ce n'est pas grave, mais si je l'ai remarqué ça en choquera sans doute d'autres, même si je sais très bien que c'est une convention, ça me gêne un peu.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 class MonGenerateur(object): def __init__(self, obj): self.obj = obj self.length = len(obj) self.count = 0 def __iter__(self): ind = 0 while True: try: current = self.obj[ind] yield current ind += 2 except IndexError: raise StopIteration if __name__ == "__main__": chaine = "hello_world" ma_classe_generateur = MonGenerateur(chaine) generateur = ma_classe_generateur.__iter__() try: for idx in range(len(chaine)): print(next(generateur)) except StopIteration: print("fin d'iteration")
J'ai apprécié la partie où tu parles du module itertools, ça me semble incontournable car le meilleur exemple d'utilisation des générateurs...
On peut aussi spécifier qu'un générateur est un itérateur, ce qui n'est pas forcément réciproque pour l'inverse.
Tu pourrais aussi lire la PEP 3114 ;) Je pense clairement que maintenant la version 3.x est aboutie et quelle doit devenir la version à enseigner par défaut.
Je ne suis pas d'accord, débutant ou pas, c'est un incontournable, que fait-on avec une boucle for ? On parle bien d'itérer une séquence, c'est une base algorithmique. Quand tu dis débutant, nous ne prenons pas en compte que des autodidactes, nous sommes bien d'accord ?Citation:
En revanche, si un débutant peut très bien se passer de les connaître, ce n'est pas le cas des développeurs confirmés.
Bonjour à tous,
Heureux que le sujet plaise :)
ALors sinon, pour le post un peu plus grand ;)
Effectivement, j'ai l'habitude de respecter la convention a 4 espaces. C'est un petit soucis que je vais résoudre rapidement. Sûrement un problème de copier/coller.
Je me doutais que cela prêterai à confusion. Je veux sous entendre que l'on peut très bien utiliser justement des boucles FOR en Python sans savoir comment cela fonctionne derrière. Et je suis personnellement un autodidacte et ai peu être une vision différente effectivement.
En tout cas je te remercie pour tes retours que je tâcherais de prendre en compte pour une mise à jour :)
J'y suis aussi :) Mais c'est vrai que sur les forums, les débutants en python travaillant avec les listes par exemple retrouvent assez rapidement la notion d'itérer et d'itérable... Maintenant je comprend où tu veux en venir, mais si ça prête à confusion, peut-être que le tourner autrement serait souhaitable pour lever l'ambiguïté, en indiquant que son utilisation est assez naturelle sans avoir vraiment de notions d'algorithmie. À toi de voir ;)Citation:
Et je suis personnellement un autodidacte et ai peu être une vision différente effectivement.
Effectivement, je ne m'en suis pas soucié pendant longtemps et cela ne m'a pas empêché de monter en compétence :mrgreen:. Cependant, il est vrai qu'expliqué tel que tu le fait, cela peut permettre de lever des ambiguité. Et comme déjà dit, je savais que ce point avait besoin d'être amélioré.
J'espère avoir le temps de faire une vague de mise à jour de mes tutos debut 2016. Je n'en oublierais aucuns :) Merci beaucoup :ccool:
Bonjour et merci pour ce document qui m'a beaucoup intéressé et éclairé sur les générateurs.
Mais, il y a quelque chose que je ne comprends pas:
Il est dit "L'ensemble des objets de type « iterator »possède une fonction « next() », qui permet de se déplacer dans l'objet itérable."
Or en version 3.3 de python : 'str_iterator' object has no attribute 'next'
ou, plus loin : 'Les objets itertools.repeat n'ont pas d'attribut next'
Je me doute bien que la 'next' existe bien en version 3 mais je ne vois pas comment le visualiser.
(pas de problème en version 2.7)
As-tu lu la PEP 3114, que je propose à l'auteur du tutoriel de lire ? Cette PEP concerne la méthode next, je te laisse le soin de la lire...
python3
Pièce jointe 195475
python2
Pièce jointe 195476
Salut,
En Python2, on peut aussi utiliser le builtins "next":
Et si on regarde de plus près:Code:
1
2
3
4
5
6
7
8
9
10
11
12 >>> liste = [1, 2, 3] >>> iterator = iter(liste) >>> next(iterator) 1 >>> next(iterator) 2 >>> next(iterator) 3 >>> next(iterator) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
autrement dit, "next" appelle la méthode .next qui devient __next__ en Python3 (comme les autres méthodes spéciales de Python)Code:
1
2
3
4
5
6
7 >>> iterator.__next__ Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'listiterator' object has no attribute '__next__' >>> iterator.next <method-wrapper 'next' of listiterator object at 0x01F16F70> >>>
Cela ne change pas grand chose au fonctionnement des "iterators", on a juste un Python plus cohérent côté nommage de la méthode __next__.
- W