Exo Python

Identification

Infoforall

14 - Exo Rappel Python


Exercices visant à consolider définitivement les connaissances vues pendant la première période. Nous pourrons à partir de là réaliser des programmes plus utilitaires.

Temps estimé : 10 questions, donc entre 30 et 45 minutes de rédaction au maximum. Si vous avez mis plus, c'est qu'il va falloir rédiger plus vite, ou que vous n'aviez plus assez de connaissances pour résoudre tout cela rapidement.

  • Tous les exercices sont corrigés. Néanmoins, lire une correction ne sert à rien si on ne sait pas le faire.
  • En cas de problèmes de compréhension des corrections proposées, pensez à utiliser le site Python Tutor.
  • Les rappels de cours ne sont pas nécessairement à lire si vous savez encore de quoi ils parlent.

1 - Types construits

✎ 01° Répondre aux questions suivantes liées au programme ci-dessous.

  1. Quel est le type de la variable a ?
  2. Quels sont les caractères permettant de délimiter sa déclaration ?
  3. Comment traduire en français le terme a ?
  4. Comment traduire en français le terme i ?
  5. Comment traduire en français le terme a[i] ?
  6. Que va contenir la variable b ?
1 2 3
a = [10, 15, 12] i = 0 b = a[i]

...CORRECTION...

  1. Quel est le type de la variable a ?
  2. Un tableau, le type list de Python.

  3. Quels sont les caractères permettant de délimiter sa déclaration ?
  4. Les crochets : [ et ].

  5. Comment traduire en français le terme a ?
  6. Le tableau a, ou mieux : l'adresse du tableau a.

  7. Comment traduire en français le terme i ?
  8. L'indice, le numéro de case.

  9. Comment traduire en français le terme a[i] ?
  10. Le contenu de la case i du tableau a.

  11. Que va contenir la variable b ?
  12. Le contenu de la case 0 du tableau a, soit 10.

✎ 02° Répondre aux questions suivantes liées au programme ci-dessous.

  1. Quel est le type de la variable a ?
  2. Quels sont les caractères permettant de délimiter sa déclaration ?
  3. Comment traduire en français le terme a ?
  4. Comment traduire en français le terme i ?
  5. Comment traduire en français le terme a[i] ?
  6. Que va contenir la variable b ?
1 2 3
a = (10, "Bob", 2) i = 1 b = a[i]

...CORRECTION...

  1. Quel est le type de la variable a ?
  2. Un n-uplet, le type tuple de Python.

  3. Quels sont les caractères permettant de délimiter sa déclaration ?
  4. Les parenthèses : ( et ).

  5. Comment traduire en français le terme a ?
  6. Le n-uplet a, ou mieux : l'adresse du n-uplet a.

  7. Comment traduire en français le terme i ?
  8. L'indice, le numéro de case.

  9. Comment traduire en français le terme a[i] ?
  10. Le contenu de la case i du n-uplet a.

  11. Que va contenir la variable b ?
  12. Le contenu de la case 1 du n-uplet a, soit "bob".

✎ 03° Répondre aux questions suivantes liées au programme ci-dessous.

  1. Quel est le type de la variable a ?
  2. Quels sont les caractères permettant de délimiter sa déclaration ?
  3. Comment traduire en français le terme a ?
  4. Comment traduire en français le terme i ?
  5. Comment traduire en français le terme a[i] ?
  6. Que va contenir la variable b ?
1 2 3
a = "Bonjour i = 2 b = a[i]

...CORRECTION...

  1. Quel est le type de la variable a ?
  2. Un string, le type str de Python.

  3. Quels sont les caractères permettant de délimiter sa déclaration ?
  4. Les guillemets : " ".

  5. Comment traduire en français le terme a ?
  6. Le string a, ou mieux : l'adresse du string a.

  7. Comment traduire en français le terme i ?
  8. L'indice, le numéro de case.

  9. Comment traduire en français le terme a[i] ?
  10. Le contenu de la case i du string a.

  11. Que va contenir la variable b ?
  12. Le contenu de la case 2 du string a, soit "n".

✎ 04° Répondre aux questions suivantes liées au programme ci-dessous.

  1. Quel est le type de la variable a ?
  2. Quels sont les caractères permettant de délimiter sa déclaration ?
  3. Comment traduire en français le terme a ?
  4. Comment traduire en français le terme i ?
  5. Comment traduire en français le terme a[i] ?
  6. Que va contenir la variable b ?
1 2 3
a = {"Alice": 13, "Bob": 8, "Charlie": 12} c = "Bob" b = a[c]

...CORRECTION...

  1. Quel est le type de la variable a ?
  2. Un dictionnaire, le type dict de Python.

  3. Quels sont les caractères permettant de délimiter sa déclaration ?
  4. Les accolades : { }.

  5. Comment traduire en français le terme a ?
  6. Le dictionnaire a, ou mieux : l'adresse du dictionnaire a.

  7. Comment traduire en français le terme i ?
  8. L'indice, le numéro de la case.

  9. Comment traduire en français le terme a[i] ?
  10. Le contenu de la case c du dictionnaire a.

  11. Que va contenir la variable b ?
  12. Le contenu de la case "Bob" du dictionnaire a, soit 8.

2 - Instructions conditionnelles

(Rappel) 2.1 Instruction conditionnelle

Idée générale

Une instruction conditionnelle permet d'exécuter un bloc d'instructions uniquement si la condition évaluée est vraie (True en Python).

Ci-dessous, un exemple où on change l'appréciation si la note est bonne (if en anglais)

1 2 3 4 5 6
fatigue = "En forme !" appreciation = "Moyen" note = 20 if note > 15: appreciation = "Très bien" fatigue = "Grosse fatigue"
Signification des lignes en français
  • L3 : note référence 20.
  • L4 : si la note est strictement supérieure à 15
  • (L5 tabulée, appartient au if) : alors appreciation référence "Très bien".
  • L6 (pas tabulée, n'appartient pas au if) : fatigue passe à "Grosse fatigue" (sans condition car pas de tabulation).
Importance de la tabulation

La tabulation (4 espaces) permet de signaler à l'intepréteur Python le début et la fin du bloc de la condition. La ligne 6 n'appartient donc pas au bloc : elle sera exécutée que la condition soit vraie ou fausse.

On peut rendre le code plus clair pour un débutant en utilisant des lignes vides :

1 2 3 4 5 6 7 8
fatigue = "En forme !" appreciation = "Moyen" note = 20 if note > 15: appreciation = "Très bien" fatigue = "Grosse fatigue"
Déroulé pour note = 20

L1 - L2 - L3 - L4 (avec condition vraie) - L5 - L6 - fin

1 2 3 4 5 6
fatigue = "En forme !" appreciation = "Moyen" note = 20 if note > 15: # Vrai pour une note de 20 appreciation = "Très bien" # donc on effectue cette ligne fatigue = "Grosse fatigue"
Déroulé pour note = 10

L1-L2-L3-L4 (avec condition fausse) - L6 - fin

1 2 3 4 5 6
fatigue = "En forme !" appreciation = "Moyen" note = 14 if note > 15: # Faux pour une note de 14 appreciation = "Très bien" # donc on n'effectue pas cette ligne fatigue = "Grosse fatigue"

✎ 05° Fournir les numéros de lignes suivies par l'interpréteur Python pendant ce programme. Donner alors (sans justification écrite, mais il faudra bien entendu suivre l'état du programme mentalement) le contenu d'appreciation, moyenne et t[0].

1 2 3 4 5 6 7
appreciation = "Insuffisant" t = [0, 10, 5] somme = t[1] + t[2] moyenne = somme / 2 if moyenne > 10: appreciation = "Correct" t[0] = moyenne

...CORRECTION...

Succession des lignes suivies par le programme :

  • L1 - L2 - L3 - L4 - L5 - L7
Valeurs finales :

  • appreciation référence "Insuffisant"
  • moyenne référence 7.5.
  • t[0] référence 7.5

Explications non demandées :

  • L1 : création du commentaire
  • L2 : création du tableau
  • L3 : somme référence 15
  • L4 : moyenne référence 7.5
  • L5 : la condition du SI est fausse, on passe donc en L7
  • L7 : on affecte 7.5 à la case d'indice 0

✎ 06° Mêmes questions avec ce programme où un élève a mal indenté la dernière ligne.

1 2 3 4 5 6 7
appreciation = "Insuffisant" t = [0, 10, 5] somme = t[1] + t[2] moyenne = somme / 2 if moyenne > 10: appreciation = "Correct" t[0] = moyenne

...CORRECTION...

La différence vient de la ligne 7 qu'on ne va plus réaliser.

Succession des lignes suivies par le programme :

  • L1 - L2 - L3 - L4 - L5
Valeurs finales :

  • appreciation référence "Insuffisant"
  • moyenne référence 7.5.
  • t[0] référence 0 du début de programme

Explications non demandées :

  • L1 : création du commentaire
  • L2 : création du tableau
  • L3 : somme référence 15
  • L4 : moyenne référence 7.5
  • L5 : la condition du SI est fausse, on passe donc en fin de programme

3 - Fonction

(Rappel) 3.1 FONCTION : définition d'une fonction personnelle
1 2 3 4
def double(x): # Déclaration return 2 * x # Déclaration n = double(12) # Appel

Définir une fonction revient à stocker ses instructions pour les utiliser plus tard.

On voit d'ailleurs que vous ne pourriez pas l'utiliser pour le moment car vous ne savez pas ce que contient réellement la variable x.

Par contre, si vous avez bien compris ce qu'est une variable, vous devriez comprendre qu'on va remplir le double de ce qu'on va recevoir un jour en entrée.

Pour définir une fonction, on utilise le mot-clé def puis

  1. le nom de la fonction
  2. des parenthèses contenant les entrées séparées par des virgules
  3. le caractère : pour finir cette première ligne
  4. le bloc tabulé contenant les instructions à réaliser un jour.
1 2
def double(x): return 2 * x

Le mot-clé return permet d'indiquer la sortie que la fonction devra renvoyer.

Placer des commentaires en français dans le code Python

On peut placer du texte à destination des développeurs qui vont lire le programme en utilisant le caractère #. Voir la partie suivante pour un exemple.

Attention : sur votre ligne, tout ce qui se trouve derrière ce # sera purement ignoré par l'interpréteur.

(Rappel) 3.2 FONCTION : appel de fonction
1 2 3 4
def double(x): # Déclaration return 2 * x # Déclaration n = double(12) # Appel

Lancer un appel de fonction
Lancer un appel veut dire utiliser une fonction en lui fournissant des entrées puis attendre pour récupérer la réponse qu'elle fournira.

Sur le code d'exemple, on lance un appel en ligne 4.

Lors d'un appel, l'interpréteur Python transfère les données envoyées une à une dans les variables visibles sur la définition. Pour comprendre où sont stockées les entrées, il suffit de comparer la ligne de la définition et celle de l'appel.

Avec l'appel de la ligne 5, on a 10 qui est stocké dans a lors de cet appel :

définition appel
def fois2(a): x = fois2(10)
[Déroulé] Lors d'un appel, on part de la ligne d'appel vers la ligne de définition puis la réponse est renvoyée vers la ligne d'appel.

1 2 3 4
def double(x): # Définition return 2 * x # Définition n = double(12) # Appel
  • L1 (déclaration)
  • L4 (appel) - L1 - L2 (envoi de la réponse)
  • L4 (réception de la réponse) - fin car il n'y a rien ensuite

Explications complètes

  • Ligne 1 : déclaration d'une fonction double() qui va recevoir une donnée qu'on placera dans une variable x.
  • Ligne 4 : appel à la fonction double() en lui envoyant 12
  • Ligne 1 : l'interpréteur place 12 dans x.
  • Ligne 2 : la fonction envoie la réponse 24 à la ligne qui a lancé l'appel
  • Ligne 4 : réception de la réponse et n référence 24.
Lancer plusieurs appels

Les fonctions ont deux avantages :

  1. Permettre l'envoi d'une sortie dont la valeur dépend des entrées reçues ;
  2. Permettre plusieurs appels successifs à une même fonction.
1 2 3 4 5
def double(x): return 2 * x a = double(10) b = double(30)

Déroulé

  • L1 (déclaration)
  • L4 (appel) - L1 - L2 (envoi de la réponse)
  • L4 (réception de la réponse et affectation du 20 à a)
  • L5 (appel) - L1 - L2 (envoi de la réponse)
  • L5 (réception de la réponse et affectation du 60 à b) - fin
Bilan

Vous devez donc savoir distinguer ces deux étapes, sous peine de ne pas comprendre correctement ce qui est réalisé :

  1. La définition (mise en mémoire d'un bloc d'instructions pour l'utiliser plus tard)
  2. L'appel (utilisation de ce bloc d'instructions)

✎ 07° Fournir les numéros de lignes suivies par l'interpréteur Python pendant ce programme puis donner le contenu de a et b à la fin de l'exécution du programme (sans justification particulière sur votre feuille, mais il faudra bien entendu suivre l'état du programme mentalement).

1 2 3 4 5
def f(x): return x * x a = f(10) b = f(5)

...CORRECTION...

  • L1 (déclaration)
  • L4 (appel en envoyant 10) - L1 - L2 (envoi de 100) - L4 (réception)
  • L5 (appel en envoyant 5) - L1 - L2 (envoi de 25) - L5 (réception)

✎ 08° Plus compliqué. Il faut être vigilant et rigoureux. Fournir les numéros de lignes suivies par l'interpréteur Python pendant ce programme puis donner le contenu de a et a à la fin de l'exécution du programme (sans justification particulière).

1 2 3 4 5 6 7 8
def h(k): return k * 3 def g(x): r = h(x + 20) return r + 10 n = g(100)

...CORRECTION...

Réponses attendues : L1 - L4 - L8 - L4 - L5 - L1 - L2 - L5 - L6 - L8 et n référence 370.

Avec des explications :

  • L1 (déclaration)
  • L4 (déclaration)
  • L8 (appel à g() en envoyant 10)
  • L4 (x référence 100)
  • L5 (appel à h() en envoyant 120)
  • L1 (k référence 120)
  • L2 (envoi de 360)
  • L5 (réception du 360 et stockage dans la variable r)
  • L6 (envoi de 370)
  • L8 (réception du 370 et stockage dans la variable n)
  • L1 (déclaration)
  • L4 (déclaration)
  • L8 (appel à g() en envoyant 10)
  • L4 (x référence 100)
  • L5 (appel à h() en envoyant 120)
  • L1 (k référence 120) - L2 (envoi de 360)
  • L5 (réception du 360 et stockage dans la variable r)
  • L6 (envoi de 370)
  • L8 (réception du 370 et stockage dans la variable n)

4 - Boucle POUR / FOR

(Rappel) 4.1 Boucle POUR : réaliser plusieurs fois EXACTEMENT la même action

A - Principe

Pour réaliser plusieurs fois exactement la même série d'actions, il suffit d'utiliser une boucle bornée POUR, qu'on déclare à l'aide du mot-clé for en Python.

B - Exemple
1 2 3 4 5 6 7
print("Avant boucle") # Pas tabulée : avant la boucle for _ in range(3): # Déclaration de la boucle print("A") # Tabulée : dans la boucle print("-- B") # Tabulée : dans la boucle print("Après boucle") # Pas tabulée : avant la boucle

Déroulé du programme

L1
L3 - L4 - L5
L3 - L4 - L5
L3 - L4 - L5
L7

Résultat du programme

Avant boucle A -- B A -- B A -- B Après boucle
C - Sémantique
3
for _ in range(3):

Traduction en français : "Réalise 3 fois le bloc d'instructions indentées"

✎ 09° Trois questions :

  1. Traduire les lignes 2 et 3 en français.
  2. Compléter le texte proposé pour justifier le contenu de la variable n à la fin de l'exécution du programme en signalant la succession des lignes suivies par l'interpréteur.
  3. Pourquoi voit-on apparaître un seul affichage ?
1 2 3 4 5
n = 0 for _ in range(4): n = n + 5 n = n + 10 print(n)

Solution à compléter :

  • L1 : n = 0.
  • L2-L3 (1er tour) : n = 5
  • ...

...CORRECTION...

On utilise un underscore, on peut donc traduire de cette façon :

  • L2 : Réaliser 4 fois la boucle (les lignes indentées)
  • L3 : Incrémente n de 5.

Voici le déroulé tel que l'énoncé le demande :

  • L1 : n = 0.
  • L2-L3 (1er tour) : n = 5
  • L2-L3 (2e tour) : n = 10
  • L2-L3 (3e tour) : n = 15
  • L2-L3 (4e tour) : n = 20
  • L4 : n = 30
  • L5 : on affiche n dans la console

L'affichage n'apparaît qu'une fois puisque print() est après la boucle.

4.2 Boucle POUR : réaliser plusieurs fois PRESQUE la même action

A - Valeurs successives de la variable de boucle

On réalise des actions un peu différentes car utilisant une variable de boucle dont le nom se situe derrière le mot clé for.

for k in range(5):

Sur cet exemple, k est la variable de boucle :

  • k commence à 0
  • k est incrémentée de 1 à chaque tour de boucle.
  • Ainsi, k va prendre les valeurs 0 puis 1 puis 2 puis 3 puis 4.

Attention

  • k n'ira pas jusqu'à 5, c'est une borne exclue.
  • 5 correspond néanmoins bien au nombre de tours de boucle effectuées : 0-1-2-3-4.
  • La valeur finale de k est 4, obtenue en calculant (5 - 1).
B - Déroulé d'une boucle avec variable de boucle
1 2 3 4 5 6 7
print("Avant boucle") for k in range(3): # Pour k variant de 0 à 2 print("A") # Affiche le string "A" print(k) # Affiche le contenu de k print("Après boucle")

Déroulé du programme

L1
L3(k=0) - L4 - L5
L3(k=1) - L4 - L5
L3(k=2) - L4 - L5
L7

Résultat du programme

Avant boucle A 0 A 1 A 2 Après
C - Sémantique
3
for k in range(3):

Traduction en français : "Pour chaque valeur de k dans [0, 1, 2], réalise le bloc d'instructions indentées"

✎ 10° Trois questions :

  1. Traduire les lignes 2 et 3 en français.
  2. Compléter le texte proposé pour justifier le contenu de la variable n à la fin de l'exécution du programme en signalant la succession des lignes suivies par l'interpréteur.
  3. Pourquoi voit-on apparaître cinq affichages ?
1 2 3 4 5
n = 50 for k in range(5): n = n + k * 10 print(n) n = n * 10

Solution à compléter :

  • L1 : n = 50
  • L2 (k = 0) - L3 - L4 : n = 50 + 0*10 = 50
  • L2 (k = 1) - L3 - L4 : n = 50 + 1*10 = 60
  • ...

...CORRECTION...

On utilise une vraie variable de boucle, on peut donc traduire de cette façon :

  • L2 : "Réalise la boucle pour k valant 0, 1, 2, 3 puis 4" ou juste "Pour k variant de 0 à 4". ATTENTION : pas 5 !
  • L3 : Incrémente n de k*10.

Voici le déroulé tel que l'énoncé le demande :

  • L1 : n = 50
  • L2 (k = 0) - L3 - L4 : n = 50 + 0*10 = 50
  • L2 (k = 1) - L3 - L4 : n = 50 + 1*10 = 60
  • L2 (k = 2) - L3 - L4 : n = 60 + 2*10 = 80
  • L2 (k = 3) - L3 - L4 : n = 80 + 3*10 = 110
  • L2 (k = 4) - L3 - L4 : n = 110 + 4*10 = 150
  • L5 : n = 150 * 10 = 1500

FIN

Activité publiée le 21 10 2023
Dernière modification : 21 10 2023
Auteur : ows. h.