QCM : Types et fonctions Python — 40 questions

Questions et réponses du QCM

1. Quelles informations un type Python définit-il pour les valeurs qu’il décrit ?

La manière d’écrire une valeur et sa position en mémoire
La taille affichée d’une valeur et son ordre de création
Les valeurs possibles et les opérations applicables
Le résultat attendu d’un programme et son temps d’exécution

Les valeurs possibles et les opérations applicables

Explication

Un type détermine l’ensemble des valeurs représentables ainsi que les opérations qui peuvent leur être appliquées. Une valeur littérale décrit une manière d’écrire une valeur, mais ne définit pas à elle seule ces deux ensembles.

2. Quel type Python correspond à une chaîne de caractères ?

int
bool
str
float

str

Explication

Le type `str` représente les chaînes de caractères en Python. `int` désigne les entiers, `float` les nombres à virgule flottante et `bool` les booléens.

3. Quelle affirmation décrit correctement le type `int` de Python ?

Il représente des valeurs booléennes produites par les comparaisons.
Il représente une approximation des nombres réels comprise entre deux bornes.
Il représente exactement les nombres entiers relatifs, y compris les très grands.
Il représente des chaînes de caractères pouvant contenir des chiffres.

Il représente exactement les nombres entiers relatifs, y compris les très grands.

Explication

Le type `int` représente les nombres entiers relatifs de manière exacte, y compris lorsqu’ils sont très grands. La représentation approximative concerne le type `float`, tandis que les chaînes et les booléens relèvent d’autres types.

4. Quelle écriture constitue un littéral entier Python valide ?

10_000_000
+ 42
007
10,000,000

10_000_000

Explication

Les séparateurs `_` sont autorisés dans les littéraux entiers, ce qui rend `10_000_000` valide. Un zéro initial comme dans `007` est interdit, la virgule ne sert pas de séparateur de milliers et l’espace entre l’opérateur et le nombre empêche cette écriture d’être un seul littéral.

5. Quelle opération Python permet d’obtenir le reste d’une division euclidienne ?

L’opérateur `//`
L’opérateur `*`
L’opérateur `%`
L’opérateur `**`

L’opérateur `%`

Explication

L’opérateur `%` calcule le reste de la division euclidienne, tandis que `//` fournit le quotient entier. Les opérateurs `**` et `*` servent respectivement à la puissance et à la multiplication.

6. Pourquoi une valeur de type `float` peut-elle être différente du nombre réel visé ?

Parce que certains nombres réels ne sont pas représentables exactement en flottant.
Parce que les nombres flottants sont toujours convertis en chaînes avant le calcul.
Parce qu’un flottant ne peut représenter que des nombres négatifs.
Parce que Python arrondit chaque entier dès qu’il rencontre une virgule.

Parce que certains nombres réels ne sont pas représentables exactement en flottant.

Explication

Le type `float` stocke une approximation, car la représentation flottante ne permet pas d’encoder exactement tous les nombres réels. Les conversions en chaîne et l’arrondissement systématique des entiers ne constituent pas le mécanisme en cause.

7. Laquelle de ces écritures est un littéral flottant valide en notation simple ?

.5
5
2,5
2e-1

.5

Explication

La notation simple d’un flottant utilise un point et peut omettre le zéro avant ce point, comme dans `.5`. L’écriture `2,5` forme une expression avec une virgule, `5` est un entier et `2e-1` relève de la notation scientifique.

8. Quel est le type du résultat de l’expression `7 / 2` en Python ?

bool
str
int
float

float

Explication

L’opérateur `/` réalise une division flottante et produit une valeur de type `float`, même lorsque les deux opérandes sont des entiers. Pour obtenir un quotient entier, il faudrait utiliser l’opérateur `//`.

9. Quel résultat Python est associé à l’expression `0.1 + 0.2` ?

0.03 après multiplication implicite
0.3 exactement dans tous les cas
0.30000000000000004
Une erreur car les décimaux sont interdits

0.30000000000000004

Explication

Les nombres flottants sont approximatifs, si bien que l’addition `0.1 + 0.2` peut produire `0.30000000000000004`. Cette différence vient de la représentation binaire des flottants, et non d’une multiplication implicite ou d’une interdiction des décimaux.

10. Laquelle de ces affirmations distingue correctement la chaîne « 314 » de la valeur 314 en Python ?

Les deux valeurs sont des chaînes de caractères
Les deux valeurs sont des entiers numériques
« 314 » est une chaîne, tandis que 314 est un entier
« 314 » est un entier, tandis que 314 est une chaîne

« 314 » est une chaîne, tandis que 314 est un entier

Explication

Les guillemets font de 314 une séquence de caractères, alors que la valeur non guillemetée 314 est interprétée comme un entier. La présence des mêmes chiffres ne suffit donc pas à donner le même type aux deux valeurs.

11. Quelle écriture représente la chaîne de caractères vide en Python ?

None
''
0
" "

''

Explication

Deux apostrophes sans caractère entre elles représentent une chaîne dont la longueur est nulle. Un espace entre guillemets constitue au contraire une chaîne contenant un caractère.

12. Quel est le résultat de l’expression Python "Py"+"thon""Py" + "thon" ?

"Py4thon"
"Py thon"
"Python"
Une erreur de conversion

"Python"

Explication

Avec deux chaînes, l’opérateur + les concatène en plaçant la seconde à la suite de la première. Il n’ajoute ni espace ni valeur numérique entre les deux morceaux.

13. Quelle expression convertit correctement la chaîne numérique « 27 » en entier ?

float("27")
int("27")
int(27.0)
str("27")

int("27")

Explication

La fonction int() transforme une chaîne numérique acceptable en entier. str() conserve ici une chaîne, float() produit un flottant et la dernière expression convertit une valeur déjà numérique plutôt que la chaîne demandée.

14. Quel résultat produit l’évaluation d’une expression Python ?

Une règle de syntaxe
Un opérateur isolé
Un commentaire
Une valeur

Une valeur

Explication

Une expression, qu’elle soit littérale ou composée avec des opérateurs, est évaluée pour produire une valeur. Un opérateur isolé ne forme pas nécessairement une expression complète.

15. Quelle expression utilise des parenthèses pour effectuer l’addition avant la multiplication ?

(2 * 3) + 4
2 * (3 + 4)
2 + 3 * 4
(2 + 3) * 4

(2 + 3) * 4

Explication

Les parenthèses imposent que 2 + 3 soit évalué avant la multiplication par 4. Sans ces parenthèses, la multiplication située dans 2 + 3 * 4 est prioritaire.

16. Quelle est la valeur de 2∗∗2∗∗32 ** 2 ** 3 en Python ?

64
256
512
16

256

Explication

L’opérateur ** s’évalue de droite à gauche : l’expression devient donc 2∗∗(2∗∗3)2 ** (2 ** 3), soit 256. L’écriture (2∗∗2)∗∗3 (2 ** 2) ** 3 donnerait 64, mais elle impose une autre association.

17. Que produit l’expression Python "ha"∗3"ha" * 3 ?

"hahaha"
"ha ha ha"
"ha3"
Une addition numérique

"hahaha"

Explication

La multiplication d’une chaîne par un entier répète la chaîne ce nombre de fois, sans ajouter d’espace. Cette opération se distingue de la multiplication entre deux opérandes numériques.

18. Quel type d’erreur provoque l’évaluation de 100//0100 // 0 en Python ?

Une erreur de syntaxe SyntaxError
Une erreur de priorité des opérateurs
Une erreur de conversion de chaîne
Une erreur d’exécution ZeroDivisionError

Une erreur d’exécution ZeroDivisionError

Explication

La forme de l’expression respecte la syntaxe Python, mais l’opération est impossible parce que le diviseur vaut zéro : l’erreur survient donc à l’exécution. SyntaxError concerne plutôt un code qui ne respecte pas les règles d’écriture, comme 007 dans ce contexte.

19. Quelle démarche aide le mieux à localiser une erreur Python ?

Supprimer les parenthèses de l’expression
Relancer le programme sans examiner le message
Lire le nom et le message de l’erreur
Remplacer tous les opérateurs par des chaînes

Lire le nom et le message de l’erreur

Explication

Le nom et le message de l’erreur indiquent la nature du problème et orientent vers la portion de code à vérifier. Modifier le programme sans tenir compte de ces indications ne permet pas d’identifier méthodiquement la cause.

20. Quel est le rôle général d’une fonction en programmation ?

Elle transforme systématiquement les paramètres en chaînes avant le calcul demandé
Elle mémorise automatiquement chaque résultat obtenu lors des appels précédents
Elle exécute un calcul particulier sans dépendre de données fournies par l’utilisateur
Elle encapsule un calcul en masquant sa réalisation et en précisant les données nécessaires

Elle encapsule un calcul en masquant sa réalisation et en précisant les données nécessaires

Explication

Une fonction regroupe un calcul, précise les données nécessaires et masque les détails de sa réalisation. Un calcul limité à un exemple particulier ne correspond pas au traitement général réalisé par une fonction paramétrée.

21. Quels éléments la signature d’une fonction précise-t-elle ?

Ses paramètres acceptables, les erreurs possibles et les résultats obtenus pour chaque appel
Son nom, sa docstring, son indentation et les expressions évaluées pendant son exécution
Son nom, ses valeurs de test, sa précondition et le contenu détaillé de son algorithme
Son nom, ses paramètres avec leur type et leur ordre, ainsi que son type de retour

Son nom, ses paramètres avec leur type et leur ordre, ainsi que son type de retour

Explication

La signature décrit le nom de la fonction, les paramètres dans leur ordre avec leurs types, ainsi que le type de retour. La précondition concerne les valeurs autorisées avant l’appel et ne constitue pas le type de retour.

22. Dans quel ordre les étapes suivantes se déroulent-elles lors de l’appel d’une fonction ?

L’expression de retour est évaluée, puis les paramètres reçoivent les expressions encore non évaluées
Les expressions sont comparées à la précondition, puis la fonction renvoie automatiquement leur somme
Les paramètres sont associés aux expressions, puis les expressions sont évaluées après le retour
Les expressions sont évaluées, leurs valeurs sont associées aux paramètres, puis le retour est évalué

Les expressions sont évaluées, leurs valeurs sont associées aux paramètres, puis le retour est évalué

Explication

Lors d’un appel, les expressions fournies sont d’abord évaluées, puis leurs valeurs sont liées aux paramètres et l’expression suivant return est calculée. L’évaluation du retour ne précède donc pas l’association des valeurs aux paramètres.

23. Quel résultat produit `nb_cartons(11, 5)` lorsque ses préconditions sont respectées ?

22, car la fonction calcule 11//511 \mathbin{//} 5
00, car le quotient entier ignore les objets restants
33, car tout carton commencé doit être compté comme plein
55, car le nombre de places détermine le résultat renvoyé

$$2$$, car la fonction calcule $$11 \mathbin{//} 5$$

Explication

La fonction renvoie le quotient entier nb_objets//places_par_cartonnb\_objets \mathbin{//} places\_par\_carton, donc 11//5=211 \mathbin{//} 5 = 2. Le résultat ne correspond pas à un arrondi supérieur ni à une suppression complète des objets restants.

24. Qu’est-ce qu’une docstring correctement placée dans une fonction Python ?

Un commentaire écrit au-dessus du nom de la fonction pour annoncer son utilisation
Une liste de tests placée à la fin du programme après toutes les définitions de fonctions
Une chaîne entre triples guillemets située immédiatement sous la signature de la fonction
Une chaîne entre apostrophes placée après le premier calcul effectué par la fonction

Une chaîne entre triples guillemets située immédiatement sous la signature de la fonction

Explication

Une docstring est une chaîne entre triples guillemets placée juste sous la signature afin de documenter le comportement de la fonction. Un commentaire externe ou une liste de tests ne remplit pas cette définition.

25. Que vérifie la précondition d’une fonction avant son appel ?

Elle vérifie que la valeur produite possède le type annoncé par la fonction après son exécution
Elle vérifie que les paramètres respectent les conditions nécessaires pour que l’appel ait un sens
Elle vérifie que la valeur obtenue correspond au résultat attendu dans un test automatisé
Elle vérifie que le corps de la fonction contient une instruction return exécutable

Elle vérifie que les paramètres respectent les conditions nécessaires pour que l’appel ait un sens

Explication

La précondition porte sur les paramètres avant l’appel et indique dans quelles conditions celui-ci est pertinent. Le type de retour décrit la valeur produite après l’exécution et ne constitue pas une précondition.

26. Quel enchaînement caractérise un test automatisé fondé sur un oracle ?

Il vérifie la syntaxe, lance le programme complet, puis remplace les sorties imprévues
Il exécute un appel, compare le résultat obtenu au résultat attendu, puis produit un verdict
Il compare deux fonctions, choisit celle qui semble correcte, puis demande une validation manuelle
Il lit la docstring, modifie les paramètres invalides, puis affiche le résultat sans comparaison

Il exécute un appel, compare le résultat obtenu au résultat attendu, puis produit un verdict

Explication

Un test automatisé exécute l’appel, utilise un oracle pour comparer la valeur obtenue à la valeur attendue, puis produit un verdict. L’oracle réalise la comparaison, tandis que le verdict indique l’issue du test.

27. Dans L1test, quand un test est-il considéré comme réussi ?

Lorsque l’appel respecte la précondition, même si sa valeur diffère du résultat attendu
Lorsque le programme s’exécute sans erreur, même si la comparaison échoue
Lorsque la fonction possède une docstring, quelle que soit la valeur produite
Lorsque la valeur obtenue par l’appel est égale à la valeur attendue

Lorsque la valeur obtenue par l’appel est égale à la valeur attendue

Explication

L1test considère le test réussi lorsque la valeur calculée par l’appel est égale à la valeur attendue. Le respect de la précondition ou l’absence d’erreur ne suffit pas si les deux valeurs comparées diffèrent.

28. Quelle caractéristique distingue un test automatisé d’une vérification manuelle ?

Il compare automatiquement le résultat obtenu au résultat attendu et affiche un verdict
Il demande au programmeur d’examiner mentalement chaque résultat sans règle de comparaison
Il vérifie la présence d’une docstring sans évaluer l’expression associée
Il remplace l’expression testée par une valeur attendue afin d’éviter toute exécution

Il compare automatiquement le résultat obtenu au résultat attendu et affiche un verdict

Explication

Un test automatisé exécute l’expression, compare les deux résultats et affiche un verdict. La vérification mentale d’un résultat correspond au contrôle manuel et ne fournit pas cette comparaison automatique.

29. Quels résultats attendus sont documentés par les trois exemples de `nb_cartons` dans sa docstring ?

nb_cartons(10,5)=2nb\_cartons(10,5)=2, nb_cartons(11,5)=2nb\_cartons(11,5)=2 et nb_cartons(0,5)=0nb\_cartons(0,5)=0
nb_cartons(10,5)=5nb\_cartons(10,5)=5, nb_cartons(11,5)=5nb\_cartons(11,5)=5 et nb_cartons(0,5)=0nb\_cartons(0,5)=0
nb_cartons(10,5)=2nb\_cartons(10,5)=2, nb_cartons(11,5)=3nb\_cartons(11,5)=3 et nb_cartons(0,5)=5nb\_cartons(0,5)=5
nb_cartons(10,5)=0nb\_cartons(10,5)=0, nb_cartons(11,5)=2nb\_cartons(11,5)=2 et nb_cartons(0,5)=10nb\_cartons(0,5)=10

$$nb\_cartons(10,5)=2$$, $$nb\_cartons(11,5)=2$$ et $$nb\_cartons(0,5)=0$$

Explication

La docstring présente les appels avec les résultats attendus 22, 22 et 00 pour les arguments indiqués. Le cas de 1111 objets utilise le quotient entier et ne donne donc pas 33 cartons.

30. Que fait L1Test lorsqu’il exécute un test automatisé ?

Il exécute tous les appels du programme, additionne leurs résultats, puis signale une moyenne
Il vérifie la signature, déduit la valeur attendue à partir du code, puis modifie l’appel testé
Il affiche la docstring, ignore l’exécution de l’appel, puis demande à l’utilisateur de conclure
Il exécute l’appel, compare la valeur obtenue à celle attendue grâce à un oracle, puis fournit un verdict

Il exécute l’appel, compare la valeur obtenue à celle attendue grâce à un oracle, puis fournit un verdict

Explication

L1Test suit le processus d’exécution de l’appel, de comparaison par oracle et de production d’un verdict. Il ne déduit pas nécessairement la valeur attendue du code et ne remplace pas l’exécution par une lecture de la docstring.

31. Quel est l’objectif principal d’un test unitaire ?

Évaluer plusieurs fonctions dépendantes dans un même scénario
Mesurer le temps d’exécution global d’un programme
Vérifier une fonction indépendamment des autres unités
Comparer différentes versions complètes d’une application

Vérifier une fonction indépendamment des autres unités

Explication

Un test unitaire isole une unité de programmation, ici une fonction, afin de la vérifier séparément. Un test portant sur plusieurs fonctions dépendantes ne correspond pas à cette définition.

32. Quelle écriture respecte la syntaxe d’un test L1Test dans une docstring ?

$$$ nb 1
$$$ nb a = 1 puis a
$$$ nb : 1
$$$nb 1

$$$ nb 1

Explication

Un test L1Test est formé de deux lignes consécutives : l’expression précédée de l’invite avec un espace, puis le résultat attendu. L’absence d’espace après l’invite ou l’écriture sur une seule ligne ne respecte pas cette syntaxe.

33. Quels verdicts L1Test peut-il produire lorsqu’il exécute une expression ?

Succès si les résultats sont égaux, échec s’ils diffèrent, erreur si l’expression déclenche une erreur
Succès si le test est rapide, échec s’il est lent, erreur si la sortie est vide
Succès si le code est nouveau, échec s’il est ancien, erreur s’il est incomplet
Succès si l’expression est courte, échec si elle est longue, erreur si elle contient une variable

Succès si les résultats sont égaux, échec s’ils diffèrent, erreur si l’expression déclenche une erreur

Explication

L1Test distingue le succès, l’échec et l’erreur selon la comparaison des résultats et l’exécution de l’expression. La durée, l’âge ou la longueur du code ne définissent pas ces verdicts.

34. Une valeur obtenue est 3,3343{,}334 et la valeur attendue est 3,333{,}33, avec une tolérance de 1×10−21\times10^{-2}. Quel verdict le test approché doit-il produire ?

Un succès, car une valeur approchée ignore la taille de l’écart
Un échec, car toute différence numérique interdit le succès
Une erreur, car la tolérance doit être exprimée en pourcentage
Un succès, car l’écart est inférieur ou égal à la tolérance

Un succès, car l’écart est inférieur ou égal à la tolérance

Explication

L’écart vaut ∣3,334−3,33∣=0,004|3{,}334-3{,}33|=0{,}004, donc il est inférieur à 0,010{,}01 et respecte la tolérance. Une différence numérique n’entraîne pas automatiquement un échec dans un test approché.

35. Que signifie l’écriture `tiers(10) approx(3.33, 1e-2)` dans un test L1Test ?

La valeur produite doit être proche de 3,333{,}33 avec une tolérance de 1×10−21\times10^{-2}
La valeur produite doit être proche de 1010 avec une tolérance de 3,333{,}33
La valeur produite doit être supérieure à 3,333{,}33 d’au moins 1×10−21\times10^{-2}
La valeur produite doit être exactement égale à 3,333{,}33 sans marge d’écart

La valeur produite doit être proche de $$3{,}33$$ avec une tolérance de $$1\times10^{-2}$$

Explication

Cette écriture accepte un résultat proche de 3,333{,}33, l’écart maximal autorisé étant 1×10−21\times10^{-2}. Elle ne demande donc ni une égalité exacte ni une comparaison avec l’argument 1010.

36. Pourquoi l’appel `nb_cartons(5, 0)` peut-il produire un verdict d’erreur ?

Il peut violer une précondition et provoquer une division par zéro
Il renvoie une valeur approchée qui dépasse la tolérance prévue
Il compare deux résultats différents et produit automatiquement un échec
Il utilise des arguments entiers, ce qui rend tout appel invalide

Il peut violer une précondition et provoquer une division par zéro

Explication

Si le second argument ne peut pas être nul, l’appel viole une précondition et peut déclencher une division par zéro, donc une erreur. Un échec correspond plutôt à des résultats différents sans exception d’exécution.

37. Que peut-on conclure lorsque tous les tests d’une fonction sont au vert ?

La confiance dans le code augmente, sans démontrer qu’il est entièrement correct
La fonction respecte toutes ses spécifications, même celles jamais testées
La fonction ne contient aucune erreur puisque chaque exécution a réussi
La fonction est prouvée correcte, car aucun test n’a détecté d’anomalie

La confiance dans le code augmente, sans démontrer qu’il est entièrement correct

Explication

Des tests réussis renforcent la confiance dans le code, mais ils ne couvrent pas nécessairement toutes les erreurs possibles. L’absence d’échec pendant les tests ne constitue donc pas une preuve de correction complète.

38. Lorsqu’un test échoue, quelles causes faut-il envisager ?

Une erreur de tolérance, car tout échec concerne un calcul approché
Une erreur dans le code de la fonction, car un test est forcément fiable
Une erreur dans le code de la fonction ou une erreur dans le test
Une erreur de l’interpréteur, car les fonctions testées sont isolées

Une erreur dans le code de la fonction ou une erreur dans le test

Explication

Un échec peut révéler un comportement incorrect de la fonction, mais aussi une valeur attendue ou une procédure de test mal définie. Il est donc nécessaire d’examiner le code et le test avant de conclure.

39. Lors de la constitution d’un jeu de tests, quelles valeurs faut-il privilégier pour couvrir les comportements d’un programme ?

Des valeurs proches des entrées les plus souvent saisies par les utilisateurs
Des valeurs représentatives des comportements et situées aux limites du domaine
Des valeurs choisies au hasard dans la partie centrale du domaine
Des valeurs correspondant aux résultats obtenus après chaque exécution

Des valeurs représentatives des comportements et situées aux limites du domaine

Explication

Un jeu de tests pertinent combine des valeurs représentatives des différents comportements avec des valeurs situées aux limites du domaine. Des valeurs aléatoires ou fréquentes peuvent compléter les tests, mais elles ne garantissent pas la couverture des cas limites.

40. Pourquoi les tests automatisés sont-ils utiles après une modification du code ?

Ils remplacent l’analyse du code lorsque le programme devient plus complexe
Ils empêchent qu’une erreur présente avant la modification soit observée pendant les tests
Ils vérifient que toutes les modifications produisent nécessairement un nouveau comportement
Ils peuvent détecter automatiquement une régression apparue à la suite de la modification

Ils peuvent détecter automatiquement une régression apparue à la suite de la modification

Explication

Les tests automatisés constituent un filet de sécurité en signalant une régression, c’est-à-dire une erreur apparue à la suite d’une modification du code. Ils ne remplacent pas l’analyse du code et ne se limitent pas aux erreurs antérieures à la modification.

Révisez avec les flashcards

Mémorisez les réponses avec 69 flashcards sur Types et fonctions Python.

Qu'est-ce qu'un type en programmation ?

Un type définit les valeurs possibles et les opérations applicables.

Quels sont les types de base en Python ?

int, float, bool et str sont les types de base.

Que désigne une valeur littérale en informatique ?

Une valeur écrite directement dans le code.

Voir les flashcards →

Approfondir avec la fiche

Consultez la fiche de révision complète sur Types et fonctions Python.

Voir la fiche →

Cours similaires

Crée tes propres QCM

Importe ton cours et l'IA génère des QCM avec corrections en 30 secondes.

Générateur de QCM