+ Répondre à la discussion Actualité déjà publiée
  1. #1
    Rédacteur/Modérateur

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    mars 2010
    Messages
    1 651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2010
    Messages : 1 651
    Points : 8 014
    Points
    8 014

    Par défaut [Article] Introduction aux itérateurs et aux générateurs

    Bonjour à tous,

    Je vous propose un article d'introduction aux itérateurs et aux générateurs.

    Bonne lecture
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

  2. #2
    Rédacteur/Modérateur

    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    janvier 2009
    Messages
    8 838
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : janvier 2009
    Messages : 8 838
    Points : 34 704
    Points
    34 704
    Billets dans le blog
    9

    Par défaut

    Salut,

    Je vais encore apprendre des choses, merci

  3. #3
    Membre averti Avatar de cervo
    Homme Profil pro
    Développeur informatique
    Inscrit en
    décembre 2012
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2012
    Messages : 214
    Points : 381
    Points
    381

    Par défaut


    Merci beaucoup !
    Toute chose dépend de la valeur qu'on lui attribue !

  4. #4
    Membre expert
    Avatar de fred1599
    Homme Profil pro
    Enseignant
    Inscrit en
    juillet 2006
    Messages
    2 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2006
    Messages : 2 240
    Points : 3 620
    Points
    3 620

    Par défaut

    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...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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")
    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.

    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.

    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.
    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 ?
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  5. #5
    Rédacteur/Modérateur

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    mars 2010
    Messages
    1 651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2010
    Messages : 1 651
    Points : 8 014
    Points
    8 014

    Par défaut

    Bonjour à tous,

    Heureux que le sujet plaise

    ALors sinon, pour le post un peu plus grand

    Citation Envoyé par fred1599 Voir le message
    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.
    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.

    Citation Envoyé par fred1599 Voir le message
    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 ?
    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
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

  6. #6
    Membre expert
    Avatar de fred1599
    Homme Profil pro
    Enseignant
    Inscrit en
    juillet 2006
    Messages
    2 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2006
    Messages : 2 240
    Points : 3 620
    Points
    3 620

    Par défaut

    Et je suis personnellement un autodidacte et ai peu être une vision différente effectivement.
    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
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  7. #7
    Rédacteur/Modérateur

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    mars 2010
    Messages
    1 651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2010
    Messages : 1 651
    Points : 8 014
    Points
    8 014

    Par défaut

    Citation Envoyé par fred1599 Voir le message
    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
    Effectivement, je ne m'en suis pas soucié pendant longtemps et cela ne m'a pas empêché de monter en compétence . 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
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

  8. #8
    Membre à l'essai Avatar de temabul
    Homme Profil pro
    Informatique de Loisir
    Inscrit en
    février 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Informatique de Loisir

    Informations forums :
    Inscription : février 2015
    Messages : 16
    Points : 19
    Points
    19

    Par défaut

    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)

  9. #9
    Membre expert
    Avatar de fred1599
    Homme Profil pro
    Enseignant
    Inscrit en
    juillet 2006
    Messages
    2 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2006
    Messages : 2 240
    Points : 3 620
    Points
    3 620

    Par défaut

    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...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  10. #10
    Membre à l'essai Avatar de temabul
    Homme Profil pro
    Informatique de Loisir
    Inscrit en
    février 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Informatique de Loisir

    Informations forums :
    Inscription : février 2015
    Messages : 16
    Points : 19
    Points
    19

    Par défaut

    Citation Envoyé par fred1599 Voir le message
    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...
    Merci, cela m'a éclairé, mais je suis encore loin d'être en plein jour.

  11. #11
    Membre expert
    Avatar de fred1599
    Homme Profil pro
    Enseignant
    Inscrit en
    juillet 2006
    Messages
    2 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2006
    Messages : 2 240
    Points : 3 620
    Points
    3 620

    Par défaut

    python3

    Nom : cap1.png
Affichages : 211
Taille : 6,2 Ko

    python2

    Nom : cap2.png
Affichages : 184
Taille : 7,9 Ko
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  12. #12
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    10 351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 10 351
    Points : 16 937
    Points
    16 937

    Par défaut

    Salut,

    En Python2, on peut aussi utiliser le builtins "next":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Et si on regarde de plus près:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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>
    >>>
    autrement dit, "next" appelle la méthode .next qui devient __next__ en Python3 (comme les autres méthodes spéciales de Python)

    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
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo