EPFL CS-121 DevLog

Course Website

Cours : Jeudi 8h15–9h00, CM 1 4

Exercices : Jeudi 9h15–11h, INF 3, BC 07-08

Accueil

Site Moodle

Tutoriels

Références

Séries

Projet

Série 11 : Itérateurs et générateurs

Solutions

Cette série a pour objectif de pratiquer l’usage des itérateurs et générateurs.

Avant de commencer cette série, il est prévu que vous ayez suivi le tutoriel de cette semaine :

Nous vous recommandons de créer un nouveau projet Python pour chaque série d’exercices. Cela vous permettra d’isoler plus facilement le contenu des différentes semaines.

Cette série contient deux exercices :

Itérateur avec indices

Écrivez une classe StrIterator qui soit un Iterator[tuple[int, str]]. Elle reçoit en argument du constructeur une chaîne s: str. Itérer sur un tel itérateur doit donner successivement des paires (i, c)i est un index dans la chaîne, et c est le caractère à cet index.

Exemple d’utilisation :

it = StrIterator("foobar")
for i, c in it:
    print(f"{i}: {c}")

affichera

0: f
1: o
2: o
3: b
4: a
5: r

Une str est un Iterable[str]. Généralisez votre StrIterator en IndexIterator[T] pour fonctionner sur n’importe quel Iterable[T], produisant des tuple[int, T].

Écrivez maintenant une fonction index_iterator[T] qui accepte un Iterable[T] et renvoie un Iterator[tuple[int, T]]. L’itérateur renvoyé doit itérer de la même façon que IndexIterator. Une implémentation valable de cette fonction serait de renvoyer un IndexIterator. Écrivez-en une autre version, qui soit écrite sous forme de fonction génératrice, avec yield.

Générateur de positions

Supposons qu’on ait une carte de largeur width et hauteur height. On souhaite itérer sur toutes les positions (x, y) valides de cette carte.

Écrivez une fonction qui accepte width et height, et qui renvoie un Iterator[tuple[int, int]]. Faites-en 3 versions :

Assurez-vous qu’elles renvoient des résultats équivalents.

Laquelle préférez-vous ?