Vous êtes sur la page 1sur 15

Correction du TD 2: LES OBJETS ET LES FONCTIONS EN PYTHON

 Les conteneurs sous Python

Exercice 1:

Définir la liste: liste = [68, 999, 18, 38, 17], puis effectuez les actions suivantes:
Correction:

1) Triez et affichez la liste.


Correction de la question 1:

2) Ajoutez l’élément 12 à la liste et affichez cette dernière.


Correction de la question 2:

3) Renversez et affichez la liste.


Correction de la question 3:

4) Affichez l’indice de l’élément 17.


Correction de la question 4:

5) Enlevez l’élément 38 et affichez la liste.


Correction de la question 5:

1
6) Affichez la sous-liste du 2é𝑚𝑒 au 3é𝑚𝑒 élément.
Correction de la question 6:

7) Affichez la sous-liste du début au 2é𝑚𝑒 élément.


Correction de la question 7:

8) Affichez la sous-liste du 3é𝑚𝑒 élément à la fin de la liste.


Correction de la question 8:

9) Affichez la sous-liste complète de la liste.


Correction de la question 9:

10) Affichez le dernier élément en utilisant un indice négatif.


Correction de la question 10:

Exercice 2:

Écrire un code Python permettant d’obtenir la liste ['ad', 'ae', 'bd', 'be', 'cd', 'ce'] à partir
des chaînes "abc" et "de".
Indication: utilisez deux boucles « for » imbriquées.

Correction:
Dans cet exercice, nous allons procéder à deux alternatives, où chacune utilise une syntaxe
différente lors de l’utilisation de deux boucles « for » imbriquées.
La première solution est la plus commune et qui est utilisée parmi les autres langages, à savoir:

2
La deuxième alternative propose une syntaxe inhabituelle, prouvant la bonne flexibilité du
langage Python:

Très important et à retenir: Nous remarquons qu’au niveau des deux solutions, dans la
déclaration de la boucle « for », les compteurs i et j ont été attribués à des chaînes de
caractères (que nous pouvons aussi appeler une liste de caractères, et c’est ce que considère
Python vis-à-vis des chaînes de caractères), et d’habitude, les compteurs des boucles « for »
dans les langages de programmation sont toujours assignés à la taille d’un tableau ou toute chose
similaire et qui fait référence à une taille d’un tableau. Si les compteurs pointent vers les tailles
des tableaux; chose que font tous les langages de programmation, y compris Python, donc les
compteurs pointeront vers les indices des tableaux/listes. Or, dans les solutions proposées dans
cet exercice, nous n’avons pas pointé sur les tailles des listes, mais sur les listes elles-mêmes, et
dans ce cas les compteurs i et j ne représenteront pas les indices des listes mais ils
représenteront les éléments des listes. Donc faites attention à ne pas confondre entre les indices
et les éléments dans les boucles « for ».

Exercice 3:
Définir deux ensembles (sets): X = {'a', 'b', 'c', 'd'} et Y = {'s', 'b', 'd'}, puis affichez les
résultats suivants:
Correction:

À retenir: La fonction set est utilisée pour initialiser des ensembles, et lors de leurs
affichages, il seront exposés entre des accolades - { } -, donc si vous arrivez à une déduction
où vous assumerez que nous pouvons initialiser les ensembles avec des accolades, tout comme
les listes avec des crochets – [ ] -, vous vous trompez, car si vous le faites, vous n’allez pas
initialiser un ensemble, mais vous allez initialiser un dictionnaire. Si nous prenons un exemple
de comparaison avec les listes pour mieux comprendre l’explication. En voici un:
a) Dans la déclaration des listes:
liste1 = liste() est équivalente à liste1 = []
b) Mais dans la déclaration des ensembles:
ensemble1 = set() n’est pas équivalente à ensemble1 = {}

3
ensemble1 = {} signifie que vous avez déclaré ensemble1 en tant que dictionnaire, non-
pas en tant qu’ensemble, car les dictionnaires utilisent également les accolades - { } - pour être
manipulés, affichés, etc.. Nous verrons un premier exemple sur les dictionnaires dans le prochain
exercice de ce TD.

1) Les ensembles initiaux.


Correction de la question 1:

2) Le test d’appartenance de l’élément 'c' à X.


Correction de la question 2:

Dans cette instruction, « 'c' in X » est une opération logique qui a utilisé un opérateur logique « in ».

3) Le test d’appartenance de l’élément 'a' à Y.


Correction de la question 3:

Cette instruction est similaire à celle qui la précède où nous avons utilisé à nouveau l’opérateur logique « in ».

4) Les ensembles X − Y et Y – X.
Correction de la question 4:

Comme le message l’indique, tout ce qui est en commun entre X et Y sera enlevé de l’ensemble X

et le reste est affiché.

Dans le deuxième cas, nous aurons l’inverse du résultat où, tout ce qui est en commun entre Y et X

sera enlevé de l’ensemble Y et le reste est affiché. Voici le résultat:

4
5) L’ensemble X ∪ Y (l’union).
Correction de la question 5:
Ici, nous pouvons procéder à deux alternatives. La première est l’utilisation de l’opérateur
d’union « | », et la deuxième et l’appel à la fonction prédéfinie union. Nous pouvons voir un
exemple qui est ci-dessous:

Vous pouvez remarquer, pour la première fois, que les éléments qui sont affichés ne sont pas toujours dans

la même position, ce qui signifie que, contrairement aux listes, les ensembles ainsi que les dictionnaires ne

prennent pas en considération l’ordre des éléments.

Nous pouvons avoir une deuxième preuve de cette remarque au niveau de la question 6 de cet exercice.

6) L’ensemble X ∩ Y (l’intersection).
Correction de la question 6:
Tout comme l’union, l’intersection a son propre opérateur qui est « & », ainsi que sa propre
fonction qui est intersection. À titre de rappel, à partir de deux ensemble, l’intersection
n’affiche que ce qui est en commun entre ces deux ensembles. En voici un exemple ci-dessous:

 Les fonctions sous Python

Exercice 4:
Écrire une fonction compterMots ayant, comme argument, une chaîne de caractères et
qui renvoie un dictionnaire contenant la fréquence de tous les mots de la chaîne entrée.

5
Correction:
La définition de la fonction compterMots:

Nous avons utilisé la fonction split dont le rôle est de prendre une chaîne de caractère et de la
sectionner en des sous-chaînes pour ensuite mettre ces dernières dans une liste qui est listeMots
dans notre exemple. Elle prend un paramètre qui est un caractère ou une chaîne de caractère. À
chaque fois que ce caractère ou chaîne de caractère est trouvée dans une chaîne, le sectionnement se
produira, et si aucun paramètre n’est spécifié, le sectionnement aura lieu à chaque fois qu’un
espace est rencontré.
Les dictionnaires ont des éléments qui prennent le format suivant:
<key> : <value>
où <key> est la clé de l’élément dont la valeur est <value>. Autrement dit, <key> est
« l’identifiant unique » d’un élément et <value> est la « donnée principale » du problème ou de
l’étude de cas sur lequel nous travaillons, et dont la source d’information principale est le
dictionnaire dont nous avons besoin pour obtenir des résultats à interpréter plus tard.

Dans notre cas ici, la clé, que nous avons appelé aussi « l’identifiant unique » (<key>), est le mot,
et la « donnée principale » (<value>) est le nombre d’occurrences de ce mot. La valeur <value>
peut ne pas être unique car, par exemple, deux mots différents peuvent apparaître à un même
nombre de fois.

L’instruction dict[mot] = dict [mot] + 1 augmente la redondance du mot, dont la clé


<key> est stocké dans mot, à 1.

L’instruction dict[mot] = 1 assume que, au cas où le mot dont la clé <key> qui est stocké
dans mot n’existe pas dans le dictionnaire dict, elle (c’est-à-dire l’instruction dict[mot] = 1)
va faire deux choses: la première chose est qu’elle va ajouter le mot, dont la clé est mot, à dict, et
la deuxième chose est qu’elle va initialiser son occurrence <value> à 1.
Voici l’exécution de cette fonction au sein du programme principal, où nous avons utilisé un texte
aléatoire, fait appel à la fonction, et affiché l’occurrence de chaque mot:

6
L’appel à la fonction compterMots et le résultat de son exécution:

Dans l’exécution, nous avons utilisé la fonction keys de façon à ce que le compteur key ne pointe
pas vers les valeurs <value>, -autrement dit, les nombres d’occurrences- mais vers les clés <key>
des éléments du dictionnaire. Si nous faisons une analogie par rapport aux listes, le compteur key
représentera les « indices ».

Exercice 5:

On désire sécuriser un réacteur à eau pressurisée.


Écrire une fonction etat qui prend comme paramètres, les seuils de pression, pSeuil, et de
volume du réacteur, vSeuil. Cette fonction demandera à l’utilisateur de donner le volume et
la pression courants du réacteur et elle simule le comportement suivant:

1. Si le volume et la pression sont supérieurs aux seuils, un message indiquant l’ordre


d’arrêter immédiatement le réacteur sera affiché.
2. Si seule la pression est supérieure au seuil de la pression, un message
demandant d’augmenter le volume du réacteur sera affiché.
3. Si seul le volume est supérieur au seuil du volume, un message demandant de
diminuer le volume du réacteur sera affiché.
4. Sinon, déclarez que le réacteur est en « bon état, et fonctionnel ».

Dans le programme principal, nous allons fixer un seuil de pression pSeuil = 2.3 et un seuil
de volume, vSeuil = 7.41, et par la suite nous appellerons la fonction etat.

7
Correction:

La définition de la fonction etat:

L’appel à la fonction etat dans le programme principal:

Le résultat de l’exécution avec la première condition:

Le résultat de l’exécution avec la deuxième condition:

Le résultat de l’exécution avec la troisième condition:

Le résultat de l’exécution avec la quatrième et dernière condition:

8
Exercice 6:

Écrire une fonction ellipsoïde qui retourne le volume et la masse d’un ellipsoïde grâce
à un tuple. Les paramètres sont les trois demi-axes et la masse volumique.

1. Nous donnerons à ces quatre paramètres des valeurs par défaut.


4
2. Nous donnerons un volume = 3 ∗ 𝜋 ∗ 𝑎 ∗ 𝑏 ∗ 𝑐

3. Testez cette fonction avec différents paramètres.

Correction:

La définition de la fonction ellipsoide:

Au niveau de la fonction, nous avons directement attribué des valeurs par défaut aux paramètres
dans la partie entre parenthèses; chose que Python peut faire contrairement à d’autres langages de
programmation.
Dans le programme principal nous allons appeler la fonction ellipsoide de 3 façons
différentes: D’abord, en spécifiant tous les paramètres, ensuite en spécifiant quelques-uns, et
enfin en ne spécifiant aucun d’entre eux. Remarquez que vous pouvez ne pas spécifier les
paramètres lors de l’appel d’une fonction, uniquement dans le cas où cette dernière a des
paramètres qui ont été initialisés à des valeurs par défaut durant sa définition, comme nous
pouvons parfaitement le voir au niveau de cet exercice.

9
L’appel à la fonction ellispoide dans le programme principal et son exécution 3 fois:

La deuxième fois où la fonction a été appelée, nous remarquons qu’aucun paramètre n’a été
spécifié. Cela signifie que nous allons garder les valeurs par défaut. Dans le troisième cas où
nous avons appelé la fonction, le premier paramètre qui a été spécifie est rho est le dernier
paramètre défini dans la fonction. Cela explique qu’avec Python, vous pouvez changer l’ordre
des paramètres lors de l’appel de la fonction, mais faites-en sorte de mettre le nom du paramètre
qui a été mis lors de la définition de la fonction, suivi de l’opérateur d’affectation « = » pour
attribuer la nouvelle valeur de façon à ce que Python puisse savoir à quel paramètre vous voulez
affecter cette valeur. Si vous ne pas mettez le nom original du paramètre, Python affectera les
valeurs aux paramètres selon l’ordre respectif, comme nous pouvons le voir dans le cas où la
fonction a été appelé pour la première fois dans le programme principal ci-dessus.
Dans la fonction print, nous avons utilisé une fonction de la classe string et qui est appelée
format. Cette fonction utilise des accolades - { } - dans la chaîne de caractères ou la variable
contenant une chaîne de caractères et le nombre de paramètres dans la fonction format est, au
moins, proportionnelle par rapport au nombre d’accolades - { } -. Autrement dit, s’il y a 2 paires
d’accolades il y aura, au moins, 2 paramètres dans la fonction, s’il y a 5 paires d’accolades, il y
aura, au moins, 5 paramètres dans la fonction, etc.. Chaque donnée stocké dans chaque
paramètre sera affichée dans la partie entre les accolades selon son ordre respectif par rapport à
l’ordre des accolades. Par exemple, si nous prenons le cas de la première fonction print:
print("Le volume est égale à {:.2f} et la masse est égale à {:.2f}".format(x, y))

𝛼 𝛽

10
La donnée du paramètre x sera mise dans la partie entre accolades 𝛼 et la donnée du paramètre
y sera mise dans la partie entre accolades 𝛽 et ce qui se trouve entre les accolades, à savoir,
« :.2f » est une écriture qui respecte la syntaxe suivante:

{<
indice du
paramètre >:< Nombre d’espaces avant
la valeur >.< Nombre de chiffre dans
la partie décimale > type
}
1 2 3 4

Avec:
1: L’indice du paramètre. C’est-à-dire, nous allons indiquer à travers l’indice, le paramètre dont
nous allons mettre la donnée.

2: Elle répond à la question: combien d’espaces allons-nous mettre avant la valeur? Par
exemple, si nous spécifions 10 pour la valeur 2.5, le programme affichera « 2.5 ».

3: Elle répond à la question: combien de chiffres, avec arrondissement, allons-nous afficher dans la partie
décimale? Par exemple, si nous spécifions 2 pour la valeur 0.45878, le programme affichera 0.46.

4: Elle spécifie le type de donnée à afficher. Par exemple, f pour les flottants, g pour les données
génériques, etc..

Exercice 7:

Écrire une fonction somme avec, comme argument, un tuple de longueur variable qui
calcule la somme des nombres contenus dans le tuple.
Testez cette fonction par des appels avec différents tuples d’entiers ou de flottants.
Correction:
La définition de la fonction somme:

L’appel à la fonction somme dans le programme principal et son exécution:

11
Dans la définition de la fonction somme, nous remarquons au niveau du paramètre args,
l’opérateur « * ». Cela signifie que le nombre de paramètres peut changer. Autrement dit il s’agit
d’une définition dynamique du nombre de paramètres. La preuve se trouve au niveau du
programme principal ainsi que son exécution. Le premier appel qui est le plus simple n’a pris
qu’un seule valeur, donc dans la boucle nous aurons une seule itération. Dans le deuxième appel,
nous avons initialisé deux valeurs, à savoir deux paramètres, donc dans notre boucle, au sein de
la fonction, nous aurons deux itérations. La troisième a pris trois valeurs comme paramètre, ce
qui insinue trois itérations au niveau de la boucle. Le dernier appel a pris deux valeurs
différentes: le premier est de type flottant (float) et le deuxième est de type entier (integer),
ce qui est possible dans Python.
Pour la trace d’exécution nous aurons dans l’exemple ci-dessus:
a) Un seul nombre qui est 23 et qui sera le résultat final.
b) Deux nombres dont, si nous faisons la somme, nous obtiendrons 3.
c) Trois nombres dont, si nous faisons la somme, nous obtiendrons 78.
d) La somme d’une valeur flottante à une valeur entière, ce qui nous donnera, comme
résultat, un valeur flottante égalé à 2.0.

Exercice 8:
Écrire une fonction conversion qui reçoit deux paramètres, une température t et un
entier u, et qui retourne la conversion:
« Celsius » → « Fahrenheit » signifie (u = 1), ou « Fahrenheit » → « Celsius » signifie (u = 2)
Rappel: 𝑇𝑒𝑚𝑝é𝑟𝑎𝑡𝑢𝑟𝑒 𝐹𝑎ℎ𝑟𝑒𝑛ℎ𝑒𝑖𝑡 = 32 + 1.8 × 𝑇𝑒𝑚𝑝é𝑟𝑎𝑡𝑢𝑟𝑒 𝐶𝑒𝑙𝑠𝑖𝑢𝑠
Remarque: Utilisez un dictionnaire pour les unités de mesures.
Correction:
La définition de la fonction conversion:

L’appel à la fonction conversion dans le programme principal:

12
Un résultat de contrôle de saisie de la fonction conversion et d’une conversion de C° à F°:

Un résultat de la fonction conversion de F° à C°:

Dans le programme principal, nous avons fait un contrôle de saisie de l’unité de température de façon à
ce que la conversion puisse se produire de façon correcte. Ensuite, nous avons créé un dictionnaire des
unités de température pour les utiliser dans le message qui nous affichera le résultat. Enfin nous nous
sommes servi de l’opérateur de division pour obtenir le reste, à savoir le modulo « % » et ce dans le but
d’éviter d’écrire toute une structure conditionnelle dont l’objectif principal est d’afficher correctement
les unités de mesures.

Exercice 9:
Écrire une fonction div_euclid qui prend en arguments deux entiers n ⩾ 0 et d > 0, et
qui renvoie un couple formé du quotient q et du reste r de la division euclidienne de n par d.
Le quotient et le reste seront calculés par des soustractions successives.

Correction:
La définition de la fonction div_euclid:

Dans la définition, nous avons fait un contrôle de saisie; un contrôle dans lequel si les nombres
ne sont pas entrés correctement, la fonction retournera simplement un message d’erreur et rien
d’autre.

13
Deux résultats d’erreur de saisie où la fonction div_euclid affichera un message d’erreur:

Deux résultats d’exécution correcte de la fonction div_euclid:

Exercice 10 (À rendre)

Écrire un script principal Python permettant de saisir une chaîne d’ADN valide et une
séquence d’ADN valide (« valide » signifie qu’elles ne sont pas vides et sont formées
exclusivement d’une combinaison arbitraire de "a", "t", "g" ou "c").
1. Écrire une fonction valide qui renvoie True si la saisie est valide, et False si elle
ne l’est pas.
2. Écrire une fonction saisie qui effectue une saisie valide et renvoie la valeur saisie
sous forme d’une chaîne de caractères.
3. Écrire une fonction proportion qui reçoit deux arguments, la chaîne et la
séquence et qui retourne la proportion de la séquence dans la chaîne (c’est-à-dire
son nombre d’occurrences).
Dans le programme principal, vous allez appeler la fonction saisie pour la chaîne
et pour la séquence et le résultat de la proportion sera affiché.

Un exemple d’affichage:
« Il y a 33.3 % de 'gt' dans 'gtagtagta' »

14
Correction:
La définition des fonctions valide, proportion, et saisie:

L’appel des fonctions valide, proportion, et saisie, et leurs exécutions avec des
erreurs de contrôle de saisie de saisie et des résultats de proportion:

Dans la fonction saisie, nous avons utilisé la fonction format pour la simple raison que,
étant donné que l’exercice nous a demandé d’écrire une fonction saisie, nous allons saisir
deux choses: la chaîne et la séquence. Si c’est le cas, il faut donc généraliser la fonction saisie
de façon à ce qu’elle puisse référencer toute donnée demandant à être écrite par l’utilisateur au
niveau d’un exercice.
L’objectif de la fonction proportion est de calculer le « pourcentage » de la séquence seq,
en terme de nombre d’occurrence dans la chaîne adn. Autrement dit, si nous prenons l’exemple
qui a été mentionné au niveau de l’énoncé, à savoir seq = "gt" et adn = "gtagtagta", la
séquence "gt" apparaît 3 fois dans la chaine "gtagtagta", ce qui signifie que le nombre
d’occurrences est de 3. D’un autre côté, la taille de la chaîne est égalé à 9, ce qui nous donne
comme résultat la proportion suivante:
3
𝑝𝑟𝑜𝑝𝑜𝑟𝑡𝑖𝑜𝑛 = 100 ∗ ≅ 𝟑𝟑. 𝟑 %
9

15

Vous aimerez peut-être aussi