25 - Fiche de révision sur Python
Cette page permet de réviser les notions de Python vues en 1er.
Si vous voulez les versions papier :
1 - Les exercices
01° Expliquer la signification des 3 opérateurs suivants en Python :
- ==
- !=
- =
...CORRECTION...
- ==
- !=
- =
Il s'agit de l'opérateur d'égalité : il renvoie un booléen valant True si les termes de gauche et de droite sont identiques.
Il s'agit de l'opérateur de différence ou d'inégalité : il renvoie un booléen valant True si les termes de gauche et de droite sont différents.
Il s'agit de l'opérateur d'affectation : il ne renvoie rien mais affecte la valeur évaluée à droite à une variable dont le nom se trouve à gauche. L'affectation se fait donc de la droite vers la gauche.
02° Que contiennent a, b et c au fur et à mesure de ce programme ?
1
2
3
4
5
6 |
|
...CORRECTION...
1
2 |
|
Facile : a référence 19 et b référence 20.
Pour la suivante, il faut savoir que l'opérateur d'affectation = est celui qui a la priorité la plus basse : on finit toujours par lui. On voit alors que c référence le résulat de l'opérateur d'égalité :
3 |
|
Puisque 19 et 20 ne sont pas égaux, c référence False.
c référence le résulat de l'opérateur de différence / inégalité :
4 |
|
Puisque 19 et 20 sont bien différents, c référence True.
Plus complexe : cette fois, il faut savoir que l'opération + est prioritaire sur == qui est prioritaire sur =.
5 |
|
Puisque 19+1 et 20 sont bien égaux, c référence True.
On commence par l'opérateur + :
6 |
|
C'est une incrémentation : on commence par évaluer à droite a + 1 qui donne 20 et on fait ensuite l'affectation vers a.
03° Quels sont les types des différentes valeurs ci-dessous ? Quelle ligne fonctionne en Python mais risquerait de poser problème dans d’autres langages de programmation ?
1
2
3
4
5
6 |
|
...CORRECTION...
1
2
3
4
5
6 |
|
On notera que les cases des types str, tuple et list sont accessibles en utilisant des indices (les numéros de cases).
On notera que les cases du type dict sont accessibles en utilisant des indices (les numéros de cases).
Tableau statique
On notera que le type list permet de représenter des tableaux (statiques et dynamiques) mais qu'ils ont une particularité en Python : on peut mettre des données de type différents dans les différentes cases. Ici int en case d'indice 0 et float en case d'indice 1.
Normalement, un tableau ne peut contenir qu'un seul type de données : un tableau d'entiers ou un tableau de floats par exemple.
Savez-vous pourquoi Python permet de mélanger les types ?
04° Comment accéder à la valeur de a contenue dans c d et e ?
...CORRECTION...
1
2
3 |
|
05° Quels sont les indices disponibles dans f? ?
...CORRECTION...
f est un string contenant 5 caractères.
Les indices sont donc 0-1-2-3-4.
1
|
|
06° A quoi servent les fonctions natives str(), int(), list() et tuple() ?
...CORRECTION...
Elles servent à faire du transtypage : tenter de créer une copie de l'ancienne donnée en la transformer vers le nouveau format.
07° Fournir le contenu des variables c, d, e et t lors de l’exécution :
1
2
3
4
5
6 |
|
...CORRECTION...
1
2
3
4
5
6 |
|
08° Fournir les contenus des tableaux suivants :
1
2
3
4
5 |
|
...CORRECTION...
1
2
3
4
5
|
|
09° Pour chacune des variables n, rep, k et x, dire s’il s’agit d’une variable globale ou locale :
1
2
3
4
5
6
7 |
|
...CORRECTION...
Variable globale : variable déclarée directement dans le programme. Elle est permanente jusqu'à que le programme soit interrompu.
Variable locale : variable déclarée dans une fonction. Elle est temporaire : elle n'existe pas avant l'appel à la fonction et disparait lorsque la fonction exécute son return.
1
2
3
4
5
6
7 |
|
10° Sur quelle ligne se trouve l’appel de la fonction calcul() ? Sur quelle ligne se trouve la déclaration ou définition de la fonction calcul() ? Quelle est la différence entre appel et déclaration ?
...CORRECTION...
L'appel se trouve en ligne 7 : un appel consiste à utiliser réellement la fonction, en lui envoyant des arguments qu'elle stockera dans ses paramètres.
La déclaration se trouve en ligne 1 : on signale à Python que la fonction se trouve en ligne s'il la cherche.
11° Donner les lignes suivies par l’interpréteur Python et le contenu progressif de la mémoire sur le programme Q09.
1
2
3
4
5
6
7 |
|
...CORRECTION...
1
2
3
4
5
6
7 |
|
L01 : déclaration de la fonction.
L07 : appel de la fonction en envoyant l'argument 5.
L01 : on stocke 5 dans le paramètre n.
L02 : on initialise rep à 0.
L03-L04 : 1er tour avec k à 1, et incrémentation de rep à 0+1 = 1
L03-L04 : 2e tour avec k à 2, et incrémentation de rep à 1+2 = 3
L03-L04 : 3e tour avec k à 3, et incrémentation de rep à 3+3 = 6
L03-L04 : 4e tour avec k à 4, et incrémentation de rep à 6+4 = 10
L05 : on renvoie 10*10 = 100 vers la ligne 07
L07 : on réalise l'affectation et x référence maintenant 100.
12° Quelqu’un modifie en ligne 03 le nom de k en x. Expliquer si cela va causer une erreur ou pas.
1
2
3
4
5
6
7 |
|
...CORRECTION...
Aucune erreur : Python va travailler comme si nous avions tapé ceci :
1
2
3
4
5
6
7 |
|
Pour lui, il s'agit donc bien de deux variables différentes, aucun problème d'ambigüité.
Il n'y aura aucune erreur et c'est bien pratique : cela vous évite d'avoir à chercher le nom de toutes les variables dans le programme avant de choisir les noms de variables pour vos nouvelles fonctions.
13° Donner la table de vérité du and et du or.
...CORRECTION...
Voici la table de vérité de l'opérateur ET :
Valeur de a | Valeur de b | a and b |
---|---|---|
False | False | False |
False | True | False |
True | False | False |
True | True | True |
A RETENIR : le ET est VRAI uniquement lorsque toutes les entrées sont à VRAI.
Voici la table de vérité de l'opérateur OU :
Valeur de a | Valeur de b | a or b |
---|---|---|
False | False | False |
False | True | True |
True | False | True |
True | True | True |
A RETENIR : le OU est FAUX uniquement lorsque toutes les entrées sont à FAUX.
Notez bien que le OU logique n'est pas le OU habituellement utilisé en français. Le OU de 'fromage ou dessert' (sous entendu l'un ou l'autre, pas les deux) se nomme le XOR, le OU eXclusif.
Voici sa table de vérité :
Valeur de a | Valeur de b | a xor b |
---|---|---|
False | False | False |
False | True | True |
True | False | True |
True | True | False |
14° Compléter le programme pour que le booléen c contienne True si les deux notes sont strictement supérieures à 10. A votre avis, quelle est l’erreur courante qu’on voit sur les copies ?
1
2
3 |
|
...CORRECTION...
1
2
3 |
|
Cette version est correct car Python attend une condition à gauche du and et une autre condition à droite du and.
L'erreur courante a ne pas faire est la suivante : on écrit le code Python comme on le pense en français : note1 et note 2 sont supérieures à 10, ce qui donne :
3 |
|
Pourquoi est-ce faux : c'est simple. Python va transtyper note1 en booléen, comme si vous aviez noté ceci :
3 |
|
A SAVOIR PAR COEUR : en Python, 0, vide ou None sont transtypés en False. Tout le reste est True !
Même si note1 vaut 9, la condition de gauche sera donc évaluée à True car bool(9) est True. Bref, ca ne fonctionne pas comme vous le voulez.
15° Quelqu’un vous donne le prototype ci-dessous. Comment décrire cela en français (avec des phrases) :
moyenne(t:list) -> tuple
...CORRECTION...
moyenne() est une fonction qui attend qu'on lui envoie un tableau de type list qu'elle stockera dans un paramètre nommé t.
Après son exécution, sa réponse sera une donnée de type tuple.
16° Quelqu’un vous donne le prototype ci-dessous. Comment décrire cela en français (avec des phrases) :
moyenne(t:'list[int] NON VIDE') -> tuple
...CORRECTION...
moyenne() est une fonction qui attend qu'on lui envoie un tableau de type list qui devra être NON VIDE (avoir au moins un élément) et qui contiendra uniquement des entiers. La fonction stockera dans un paramètre nommé t.
Après son exécution, sa réponse sera une donnée de type tuple.
PRECONDITIONS
Il s'agit du nom qu'on donne aux conditions supplémentaires, en plus du seul type. Ici, il s'agit donc de NON VIDE.
17° Réaliser une fonction moyenne() précédente. La fonction devra renvoyer un tuple contenant la moyenne des valeurs et le nombre de valeurs contenues dans le tableau. Comment se nomme cette condition sur la sortie ?
...CORRECTION...
Version 1 avec un parcours par indices :
1
2
3
4
5
6
7
8 |
|
Version 2 avec un parcours par valeurs :
1
2
3
4
5
6
7
8 |
|
18° Que doit-il se passer si on passe un appel en respectant les préconditions ? Que peut-il se passer si on ne les respecte pas ?
...CORRECTION...
Il y a donc une sorte de contrat de confiance entre utilisateur et concepteur :
- L'utilisateur est le garant du respect des préconditions lors des appels
- Le concepteur garantit que la postcondition est alors vérifiée (sous condition du respect des préconditions donc).
Premier cas : l'utilisateur respecte les préconditions
Dans ce cas, l'utilisateur peut concevoir le reste de son programme en considérant que la postcondition est vraie : le concepteur de la fonction s’y est engagé.
Si la fonction donne une mauvaise réponse ou provoque une exception, c'est la faute du concepteur car l'utilisateur a envoyé des données respectant les préconditions.
Deuxième cas : l'utilisateur ne respecte pas les préconditions
Dans ce cas, on ne peut pas tenir compte de la postcondition.
La fonction peut
- fonctionner correctement par hasard ou
- donner une mauvaise réponse ou
- provoquer une erreur.
En tous cas, c'est clairement la faute de l'utilisateur : il a utilisé la fonction hors des clous.
19° Comment résumer mathématiquement la relation entre préconditions et postconditions ?
...CORRECTION...
PRECONDITONS ⇒ POSTCONDITONS
Notez bien qu'il s'agit de l'implication et pas de l'équivalence.
20-A° Réaliser une fonction-prédicat est_valide(t:list[int]) → bool qui renvoie True si toutes les notes contenus dans t sont bien entre 0 et 20. Réaliser la documentation de votre fonction. Vous utiliserez un parcours par indices pour réaliser la fonction.
...CORRECTION...
1
2
3
4
5
6
7
8
9
10
11
12
13
14 |
|
20-B° Même question mais vous utiliserez un parcours par valeurs pour réaliser la fonction.
...CORRECTION...
1
2
3
4
5
6
7
8
9
10
11
12
13
14 |
|
20-C° Même question mais avec le prototype suivant : est_valide(t:dict[(str,int)]) → bool
Exemple d’appel
est_valide( {'alice':10, 'bob':2, 'charles':22} )
...CORRECTION...
En utilisant un parcours par clés explicite ( avec keys() ):
1
2
3
4
5
6
7
8
9
10
11
12
13
14 |
|
En utilisant un parcours par clés implicite ( sans keys() ):
1
2
3
4
5
6
7
8
9
10
11
12
13
14 |
|
En utilisant un parcours par valeurs ( avec values() ):
1
2
3
4
5
6
7
8
9
10
11
12
13
14 |
|
En utilisant un parcours par couples (cle, valeur) ( sans items() ):
1
2
3
4
5
6
7
8
9
10
11
12
13
14 |
|
2 - FAQ
Comment encode-t-on les integers déjà ?
Pourquoi est-ce que l'encodage des floats est parfois approximatif ?
Tableaux statiques et tableaux dynamiques ? Pourquoi pas juste liste comme c'est le type list ?
Activité publiée le 05 09 2024
Dernière modification : 05 09 2024
Auteur : ows. h.