Parcourir des itérables
A partir de ce cours, nous allons pouvoir commencer à résoudre des problèmes plus réalistes.
Qu'est-ce qu'un itérable ?
Itérable
Un itérable est un ensemble duquel on peut énumérer un par un les éléments.
Par exemple, la classe est un itérable. Je peux PARCOURIR la liste des élèves pour faire l'appel, et appliquer à chaque élève la même procédure.
Pour "chaque élève X" dans "la classe": -> Définition du parcours
- Appeler X
- Attendre la réponse de X
- Si X ne répond pas:
- Enregistrer X dans la liste des absents
TOUTE SEQUENCE EST ITERABLE
- Chaine de caractères (str)
- Listes (list)
- Tuples (tuple)
Parcourir un itérable
Parcourir un itérable veut dire récupérer chacun de ses éléments, un par un.
for est un mot clé qui permet de parcourir un itérable. C'est son job.
Par exemple, pour dire:
Pour tous les éléments `elt` du tuple (3, (8, 'a'), 9), afficher `elt`
On écrit:
Ici on parcourt le tuple (3, (8, 'a'), 9).
A chaque répétition, la variable e prendra les valeurs 3, PUIS (8, 'a') PUIS 9.
Itérer sur des entiers
Parcourir un intervalle d'entiers
Intervalle se dit \(range\) en anglais.
Un range et un itérable.
range(a, b) représente l'intervalle des entiers de \(a\) à \(b\) exclus.
Si a est supérieur à b, alors range(a, b) est vide.
La logique d'itérable s'y applique tout simplement:
Le code ci-dessus signifie:Propriété remarquable:
Vu que b est exclu, b - a représente le nombre d'entiers dans l'intervalle.
Parcours de séquence
Il existe 2 manières de parcourir une séquence. Il faut les connaître.
Parcours par élément
C'est celui qui est présenté au début du cours: Pour chaque élément
Parcours par indice
Rappels hyper importants:
- Une séquence
sa pour taillelen(s). - Ses indices vont de
0àlen(s) - 1.
Ici, on va parcourir LES INDICES de la séquence. Donc les entiers de 0 à len(s) - 1 INCLU. Ce qui revient à dire qu'on va parcourir les entiers de 0 à len(s) EXCLU.
s = ["coucou", "les", "gens"]
for i in range(0, len(s)): # Pour chaque entier i de 0 à len(s)-1
print(s[i]) # Faire quelque chose avec l'élément de s à l'indice i
Précautions
Un algorithme ne sera pas correct "au hasard". Lorsqu'on aborde le parcours par indice, il faut passer un temps à se demander à quel indice ça finit.
Choix du parcours
On essaiera de privilégier le parcours par élément lorsque c'est possible. Parce que le code produit est plus léger à lire, donc plus compréhensible.
Parfois, le parcours par élément ne permettra pas de résoudre le problème. Il faudra alors utiliser le parcours par indice.
Lorsqu'on aborde un exercice, on doit savoir avant tout:
- Ce qu'on parcourt
- Comment on le parcourt
ACCUMULATION -> FONDAMENTAL
Une fois que vous avez bien compris comment fonctionne le parcours des itérables, nous pouvons enfin commencer à parler de techniques de résolution de problèmes. Les exercices commencent très vite sur cette technique, car c'est le minimum.
La technique présentée ici s'appelle l'ACCUMULATION:
- Elle est omniprésente
- On ne peut rien faire sans la maîtriser
Elle sert à construire progressivement un résultat dans une variable qu'on appelle l'accumulateur.
Exemple, pas à pas, pour le calcul de la somme des entiers de 1 à \(n\) dans une liste:
- Tout d'abord, il nous faut un accumulateur qui représente notre résultat. On va l'appeler
rescomme résultat. Une somme d'entier est un entier, donc le type du résultat c'estint. Il vaut 0 car on n'a encore rien ajouté. - On va parcourir les entiers de \(1\) à \(n\), donc on est sur l'intervalle \([1, n+1)\)
- A chaque fois qu'on rencontre un nouvel entier, on va l'ajouter au résultat. C'est le comportement d'accumulation pour obtenir une somme.
- Lorsque la boucle se terminera, nous aurons bien parcouru tous les entiers, et ils auront tous été ajoutés à 0.
Méthodologie
- Je réfléchis au type de mon résultat. J'initialise correctement mon résultat.
- Qu'est-ce que je dois parcourir? J'acris correctement mon parcours
- Dasn mon parcours, j'applique à chaque élément le comportement d'accumulation voulu par le problème.
Exercices
Parcours
2 - Affichage
On peut typer n'importe queel séquence (n'apprenez pas ça)
3 - 1 sur 2
Ecrire une fonction qui prend une chaîne de caractère en paramètre. Elle renvoie une chaîne de caractères où seulement 1 caractère sur 2 est présent.
3 - Nombre de voyelles
Complétez la fonction qui lit une chaîne de caractères et affiche le nombre de voyelles présentes dans cette chaîne. (complétez le type de retour)
On sait qu'on veut COMPTER le nombre de voyelles. Que vaut le résultat au début de la fonction?
Renverser
Ecrire une fonction qui renvoie les caractères d'une chaîne de caractères dans l'autre sens.
contient
Ecrire la fonction suivante. On n'utilisera pas l'opérateur in.
Take
Ecrire une fonction qui renvoie les n premiers caractères d'une chaîne de caractères de telle manière que les tests suivants soient passants.
Drop
Ecrire une fonction qui renvoie les n premiers caractères d'une chaîne de caractères de telle manière que les tests suivants soient passants.
Somme
Ecrire et tester une fonction somme qui prend en paramètres une liste d'entiers et qui renvoie leur somme.
Produit
Ecrire et tester une fonction produit qui prend en paramètres une liste d'entiers et qui renvoie leur produit.
Factorielle
- Ecrire et tester une fonction qui calcule \(1 \times 2 \times 3 \times ... \times n\), pour un \(n\) entier. On appelle cette opération la factorielle de n. On la note \(n!\) (qui se lit "n factorielle")
- Calculez \(0!\) avec votre fonction. que trouvez-vous?
Problème
ici, il s'agit de créer une fonction bin2dec qui prend en paramètre une chaîne de caractères constituée de 0 et de 1, et qui convertit cette écriture binaire en entier décimal.
Par exemple:
- Dans la fonction, on commencera par renverser la chaîne de caractères, afin que l'indice de chaque chiffre corresponde à sa puissance de 2 dans la décomposition.
- On s'appuiera sur un parcours par indice pour calculer la somme de puissances de 2 par accumulation.
Algo 1
Les exercices suivants seront repris comme base pour le cours d'algorithmique. Il faut donc bien comprendre ce qu'il se passe là dedans.
Minimum
- Sans utiliser la fonction min, écrire la fonction suivante:
- Peut-il y avoir pusieurs valeurs différentes pour le minimum?
Indice minimum
- Ecrire la fonction suivante
- Peut-il y avoir des valeurs différentes pour l'indice du minimum?
def i_minimum(lst: list[int]) -> int:
"""
Calcule le minimum d'une liste d'entier
>>> minimum([8, 1, 10, 2)
3
>>> minimum([])
"""
assert len(lst) > 0, "Erreur, la liste ne doit pas être vide"
...
- Testez votre fonction sur cette liste: [ 2, 5, 1, 6, 1, 9, 1, 7]
- Changez l'inégalité au sens strict pour une inégalité au sens large (ou inversement)
- Expliquez plus précisément la description de ce que fait la fonction pour chacun des 2 cas (strict ou large).
- Bonus: Ecrivez une fonction qui renvoie la liste des indices minimum (appelé l'ensemble des minorants)