QCM Python — Corrige Detaille
Chaque reponse est justifiee avec une explication detaillee
Question 1 : Comment peut-on lancer un serveur HTTP depuis la ligne de commande
avec Python ?
Reponse correcte
CORRECT python -m [Link]
Reponses incorrectes
INCORRECT python -m SimpleHTTPServer
INCORRECT python -c '[Link]'
INCORRECT Aucune des commandes ci-dessus
Explication
En Python 3, le module s'appelle '[Link]'. La commande 'python -m [Link]' lance un
serveur HTTP sur le port 8000 par defaut. 'SimpleHTTPServer' etait le nom du module en Python
2 et n'existe plus en Python 3. La commande 'python -c' execute du code inline, pas un module.
Question 2 : Que renvoie le code suivant ?def f(l): for element in l: print(element,
end=' ') else: print('\nOops, something went wrong...')f(list())f([x for x in range(3)])
Reponse correcte
CORRECT Oops, something went wrong...0 1 2Oops, something went
wrong...
Reponses incorrectes
INCORRECT 0 1 2
INCORRECT 0 1 2 / Oops, something went wrong...
Explication
En Python, le bloc 'else' d'une boucle 'for' s'execute TOUJOURS apres la boucle, qu'elle ait itere
ou non (sauf si interrompue par 'break'). Pour f(list()) : liste vide -> boucle ne tourne pas -> else
s'execute -> affiche 'Oops...'. Pour f([0,1,2]) : affiche '0 1 2 ' puis else s'execute -> affiche
'Oops...' aussi.
Question 3 : Quel est le type de fonction de 'function_a' dans le code suivant ?def
function_a(func): def inner(name): return func() + name return
inner@function_adef greet(): return 'Welcome to welovedevs 'print(greet('John'))
Reponse correcte
CORRECT Un decorateur
Reponses incorrectes
INCORRECT Une methode statique de classe
INCORRECT Une methode numerique
INCORRECT Une extension
Explication
Un decorateur est une fonction qui prend une autre fonction en argument, la modifie ou l'etend,
et retourne une nouvelle fonction. Ici '@function_a' est equivalent a ecrire 'greet =
function_a(greet)'. 'function_a' prend 'func' (une fonction) et retourne 'inner', ce qui correspond
exactement au patron du decorateur.
Question 4 : Qu'affiche le code suivant ?a = [1, 2]b = ['a', 'b', 'c']for item in zip(a, b):
print(item)
Reponse correcte
CORRECT (1, 'a')(2, 'b')
Reponses incorrectes
INCORRECT une erreur de type ValueError
INCORRECT (1, 'a') / (2, 'b') / (3, None)
INCORRECT aucune des reponses ci-dessus
Explication
zip() combine les elements de plusieurs iterables en tuples, mais s'arrete a la longueur du plus
court. Ici 'a' a 2 elements et 'b' en a 3, donc zip produit seulement 2 tuples : (1,'a') et (2,'b').
L'element 'c' est ignore. zip ne leve pas d'erreur et ne complete pas avec None (c'est zip_longest
qui fait cela).
Question 5 : Quelle technique est utilisee dans le code suivant ?def f(animal, color):
return f'This {animal} is {color}.'args = ['parrot', 'red']sentence = f(*args)
Reponse correcte
CORRECT Le depaquetage d'arguments (argument unpacking)
Reponses incorrectes
INCORRECT Le desassemblage d'arguments
INCORRECT La concatenation d'arguments
INCORRECT Le decoupage d'arguments
Explication
L'operateur '*' devant une liste lors d'un appel de fonction effectue le 'depaquetage' (unpacking) :
il extrait les elements de la liste et les passe comme arguments positionnels separes.
f(*['parrot','red']) est equivalent a f('parrot', 'red'). Ce mecanisme est distinct du desassemblage
ou de la concatenation.
Question 6 : Quelle est la difference entre les methodes __repr__() et __str__() ?
Reponse correcte
CORRECT __repr__() est destine aux machines (debogage) tandis que
__str__() est destine aux humains
Reponses incorrectes
INCORRECT repr() appelle __repr__() mais pas __str__()
INCORRECT __str__() est destine aux machines tandis que __repr__() est
destine aux humains
INCORRECT print() appelle __repr__() mais pas __str__()
Explication
__repr__() doit retourner une representation technique non ambigue de l'objet, idealement
evaluable (ex: "Point(x=1, y=2)"). Il est utilise dans le shell Python et pour le debogage. __str__()
doit retourner une representation lisible par l'humain. print() appelle __str__() (pas __repr__()). Si
__str__ n'est pas defini, Python utilise __repr__ comme fallback.
Question 7 : Les variables a et b sont des sets. Que representent respectivement a^b,
a|b et a-b ?
Reponse correcte
CORRECT La difference symetrique, l'union et la difference
Reponses incorrectes
INCORRECT L'union symetrique, l'union et un subset
INCORRECT L'union exclusive, l'union et la difference
INCORRECT La difference exclusive, la difference et l'intersection
Explication
Pour les sets Python : '^' = difference symetrique (elements dans a OU b mais pas les deux), '|' =
union (tous les elements de a et b), '&' = intersection (elements communs), '-' = difference
(elements dans a mais pas dans b). La 'difference symetrique' est le terme mathematique correct
pour '^'.
Question 8 : Comment convertir une liste de tuples en dictionnaire ? Ex:
[(1,'one'),(2,'two')] en {1:'one', 2:'two'}
Reponse correcte
CORRECT dict([(1, 'one'), (2, 'two')])
Reponses incorrectes
INCORRECT list([(1, 'one'), (2, 'two')])
INCORRECT tuple([(1, 'one'), (2, 'two')])
INCORRECT set([(1, 'one'), (2, 'two')])
Explication
La fonction dict() accepte une liste de paires (tuples de 2 elements) et cree un dictionnaire ou le
premier element de chaque tuple devient la cle et le second la valeur. list() retourne une liste,
tuple() un tuple, et set() echouerait car les tuples ne sont pas hashables de cette facon.
Question 9 : Quel sera le resultat du code suivant ?class A: def __init__(self, x):
self.x = x def __eq__(self, other): return self.x == [Link] = A(10)b = A(10)print(a ==
b)print(a is b)
Reponse correcte
CORRECT True False
Reponses incorrectes
INCORRECT True True
INCORRECT False False
INCORRECT False True
Explication
'a == b' utilise __eq__ defini dans la classe, qui compare self.x == other.x -> 10 == 10 -> True. 'a
is b' teste l'identite memoire (meme objet en memoire), or a et b sont deux instances differentes
creees separement -> False. '==' teste l'egalite de valeur, 'is' teste l'identite de reference.
Question 10 : Quel(s) conteneur(s) du module 'collections' permet(tent) de trouver les
elements les plus courants d'une liste ?
Reponse correcte
CORRECT Counter
Reponses incorrectes
INCORRECT DefaultDict
INCORRECT ChainMap
INCORRECT namedtuple
Explication
Counter est un sous-type de dict qui compte les occurrences de chaque element. Sa methode
.most_common(n) retourne les n elements les plus frequents. DefaultDict fournit une valeur par
defaut pour les cles manquantes. ChainMap regroupe plusieurs dicts. namedtuple cree des
tuples avec des champs nommes. Aucun de ces trois ne compte les occurrences.
Question 11 : Que permet de faire le module numpy ?
Reponse correcte
CORRECT Effectuer des operations complexes sur des arrays
multidimensionnels (et les produits matriciels)
Reponses incorrectes
INCORRECT Generer des graphes statistiques
INCORRECT Convertir facilement des donnees numeriques en binaire
Explication
NumPy est la librairie fondamentale pour le calcul numerique en Python. Elle permet de creer et
manipuler des tableaux (arrays) multidimensionnels efficacement, et propose des operations
mathematiques avancees dont les produits matriciels ([Link], @). La generation de graphes est
le role de Matplotlib. La conversion binaire n'est pas son objectif.
Question 12 : Parmi les codes suivants, lequel gere l'exception correctement ?(pour
g(0) qui provoque une ZeroDivisionError)
Reponse correcte
CORRECT def g(a): try: print(1/a) except
ZeroDivisionError: print('Error') finally:
print('Done')
Reponses incorrectes
INCORRECT try sans except (seulement raise)
INCORRECT except sans try (syntaxe invalide)
INCORRECT try/except ValueError (mauvais type d'exception)
Explication
Le code correct utilise try/except ZeroDivisionError/finally. 'try' encadre le code risque, 'except
ZeroDivisionError' capture EXACTEMENT le bon type d'exception leve par 1/0. Le bloc 'finally'
s'execute toujours. Capturer ValueError serait incorrect car 1/0 leve ZeroDivisionError, pas
ValueError. Un 'except' sans 'try' est une erreur de syntaxe.
Question 13 : Que contient la variable 'words' apres execution ?import resentence =
'The quick brown fox jumps over the lazy dog'words = [Link](r'lazy', sentence)
Reponse correcte
CORRECT None
Reponses incorrectes
INCORRECT Une erreur se produit
INCORRECT True
INCORRECT <[Link] object; span=(35, 39), match='lazy'>
Explication
[Link]() cherche le pattern UNIQUEMENT au debut de la chaine. La chaine commence par
'The', pas par 'lazy'. Donc match() retourne None (pas d'exception). Si on voulait trouver 'lazy'
n'importe ou dans la chaine, il faudrait utiliser [Link]() qui retournerait l'objet Match avec
span=(35,39).
Question 14 : Lesquels de ces modules sont capables de convertir des donnees
(serialisation) ?
Reponse correcte
CORRECT pickle, json et marshal
Reponses incorrectes
INCORRECT resource (uniquement)
Explication
pickle : serialise des objets Python en format binaire Python-specifique. json : convertit en format
JSON texte, interoperable. marshal : serialise en format binaire interne Python (utilise par le
bytecode). Ces trois modules serialisent/deserializent des donnees. 'resource' est un module
Unix pour gerer les limites des ressources systeme, il ne serialise pas de donnees.
Question 15 : Que contient la variable 'string' dans le code :f = open('[Link]',
'r')string = [Link]()[Link]()
Reponse correcte
CORRECT Une liste contenant chaque ligne du fichier [Link]
Reponses incorrectes
INCORRECT Une unique chaine de caracteres contenant les lignes du fichier
INCORRECT La premiere ligne du fichier
INCORRECT La derniere ligne du fichier
Explication
readlines() retourne une LISTE de strings, chaque element etant une ligne du fichier (avec le
caractere '\n' inclus). Pour obtenir une unique chaine : [Link](). Pour la premiere ligne
uniquement : [Link](). Il n'existe pas de methode native pour lire uniquement la derniere ligne
directement.
Question 16 : Que renvoie la fonction suivante ?def f(): a = [x for x in range(10)]
return list(filter(lambda x: x%3, a))
Reponse correcte
CORRECT [1, 2, 4, 5, 7, 8]
Reponses incorrectes
INCORRECT None
INCORRECT [3, 6, 9]
INCORRECT Une erreur est levee
Explication
filter(lambda x: x%3, a) garde les elements pour lesquels la lambda retourne une valeur truthy.
x%3 vaut 0 (falsy) quand x est multiple de 3 (0,3,6,9). Pour les autres valeurs (1,2,4,5,7,8), x%3
!= 0 (truthy). Donc filter garde [1,2,4,5,7,8] et exclut les multiples de 3. list() convertit le filtre en
liste.
Question 17 : Quelles fonctions peut-on utiliser pour convertir une liste ou un
dictionnaire en iterable ?
Reponse correcte
CORRECT iter()
Reponses incorrectes
INCORRECT map()
INCORRECT generator()
INCORRECT convert()
Explication
iter() est la fonction built-in Python qui convertit un objet iterable (liste, dict, tuple...) en iterateur.
Un iterateur est un objet avec __next__(). map() applique une fonction a chaque element.
'generator()' n'existe pas comme fonction built-in. 'convert()' n'existe pas non plus en Python
standard.
Question 18 : Qu'affiche le code suivant ?a = [x for x in range(5)]b = iter(a)i = 0while i <
len(a): print(next(b), end=' ')
Reponse correcte
CORRECT 0 1 2 3 4
Reponses incorrectes
INCORRECT une exception de type StopIteration
INCORRECT 1 2 3 4 5
INCORRECT aucune de ces reponses
Explication
iter(a) cree un iterateur sur la liste [0,1,2,3,4]. La boucle while tourne 5 fois (i va de 0 a 4). next(b)
retourne les elements un par un : 0, 1, 2, 3, 4. Note : i n'est jamais incremente dans la boucle
visible, mais la condition i < len(a) est verifiee. ATTENTION : si i n'est pas incremente, c'est une
boucle infinie qui lancerait StopIteration apres 5 appels.
Question 19 : Comment recuperer les arguments passes en ligne de commande ?
Reponse correcte
CORRECT [Link]
Reponses incorrectes
INCORRECT [Link]
INCORRECT [Link]
INCORRECT aucune des reponses ci-dessus
Explication
[Link] est une liste du module 'sys' contenant les arguments de la ligne de commande.
[Link][0] est le nom du script, [Link][1] est le premier argument, etc. '[Link]' n'existe pas
(self est pour les instances de classe). '[Link]' n'est pas une syntaxe Python valide pour les
arguments CLI.
Question 20 : Dans le module collections, quel avantage presente le type deque par
rapport au type list ?
Reponse correcte
CORRECT L'operation pop(0) s'effectue en O(1) au lieu de O(n)
Reponses incorrectes
INCORRECT L'operation insert(0, v) est optimisee (O(1))
INCORRECT Il peut etre converti en iterable
INCORRECT aucune des reponses
Explication
deque (double-ended queue) est optimise pour les insertions/suppressions aux deux extremites
en O(1). Pour une list, pop(0) est O(n) car tous les elements doivent etre decales.
[Link]() et [Link]() sont O(1). En revanche, l'acces par index [i] est O(n) pour
deque mais O(1) pour list. Les deux peuvent etre convertis en iterables.
Question 21 : Par quoi peut-on remplacer h dans : for i,e in h(['A','B','C']):
print(f'liste[{i}] = {e}')
Reponse correcte
CORRECT enumerate()
Reponses incorrectes
INCORRECT index()
INCORRECT zip()
INCORRECT map()
Explication
enumerate() retourne des paires (index, valeur) pour chaque element d'un iterable.
enumerate(['A','B','C']) donne (0,'A'), (1,'B'), (2,'C'). C'est exactement ce que le code attend :
i=index, e=element. index() est une methode de liste qui retourne la position d'un element. zip()
combine deux iterables. map() applique une fonction.
Question 22 : Quelle est l'instruction utilisee en Python pour executer le code d'une
boucle tant qu'une condition est vraie ?
Reponse correcte
CORRECT while <condition>:
Reponses incorrectes
INCORRECT while <condition> do:
INCORRECT until <condition>:
INCORRECT for <condition>:
Explication
La syntaxe Python pour une boucle conditionnelle est 'while <condition>:' avec les deux-points et
sans le mot 'do'. 'while ... do:' est la syntaxe de certains autres langages (ex: Pascal). 'until'
n'existe pas en Python. 'for' est pour les boucles d'iteration sur un iterable, pas pour une
condition booleenne.
Question 23 : Lesquelles de ces instructions permettent de generer un nombre reel
aleatoire entre 0 et 1 ?
Reponse correcte
CORRECT [Link](0,1) et [Link](0,1)
Reponses incorrectes
INCORRECT [Link](0, 1)
Explication
[Link](a,b) du module 'random' retourne un float aleatoire dans [a,b].
[Link](0,1) fait de meme avec NumPy. Les deux sont valides. [Link]()
n'existe pas dans le module math de Python. Pour un float entre 0 et 1 specifiquement, on peut
aussi utiliser [Link]() (sans arguments).
Question 24 : Qu'affiche le code suivant apres execution ?var = "I'm a global
variable"def f(var): print(var)f("I'm fairly local")
Reponse correcte
CORRECT I'm fairly local
Reponses incorrectes
INCORRECT Une erreur de type UndefinedVariable
INCORRECT I'm a global variable
INCORRECT Une erreur de type ValueError
Explication
Le parametre 'var' de la fonction f est une variable LOCALE qui masque la variable globale du
meme nom. Quand f("I'm fairly local") est appele, le parametre local 'var' prend la valeur 'I'm
fairly local'. print(var) affiche donc la valeur locale. La variable globale n'est pas modifiee et n'est
pas utilisee ici.
Question 25 : l est une instance de type list. Que renvoie : sorted(l, reverse=True)
Reponse correcte
CORRECT Le tableau dynamique contenant les valeurs de l triees
dans l'ordre DECROISSANT
Reponses incorrectes
INCORRECT Le tableau contenant les inverses des valeurs de l
INCORRECT Le tableau ou la i-eme valeur correspond a la n-i-eme valeur de l
INCORRECT Le tableau contenant les valeurs de l triees dans l'ordre
CROISSANT (INCORRECT - c'etait la reponse cochee)
Explication
sorted(l, reverse=True) retourne une NOUVELLE liste avec les elements tries en ordre
decroissant (du plus grand au plus petit). Sans reverse=True, l'ordre serait croissant.
'reverse=True' inverse l'ordre de tri. La liste originale l n'est pas modifiee (contrairement a
[Link]()). ATTENTION : la reponse cochee dans le QCM (ordre croissant) etait INCORRECTE.
Question 26 : Quelle fonction renvoie True si et seulement si tous les elements de
l'iterable donne en argument valent True ?
Reponse correcte
CORRECT all()
Reponses incorrectes
INCORRECT each()
INCORRECT any()
INCORRECT every()
Explication
all(iterable) retourne True uniquement si TOUS les elements sont truthy (ou si l'iterable est vide).
any(iterable) retourne True si AU MOINS UN element est truthy. 'each()' et 'every()' n'existent pas
comme built-ins Python. Exemple : all([True, True, True]) -> True ; all([True, False, True]) ->
False.
Question 27 : Quelle fonction f(function, iterable) renvoie un iterateur qui applique
'function' a chaque element de 'iterable' ?
Reponse correcte
CORRECT map()
Reponses incorrectes
INCORRECT filter()
INCORRECT exec()
INCORRECT set()
Explication
map(function, iterable) applique la fonction a chaque element et retourne un iterateur de
resultats. filter(function, iterable) garde seulement les elements pour lesquels function retourne
True. exec() execute du code Python dynamiquement. set() cree un ensemble. Exemple :
list(map(str, [1,2,3])) -> ['1','2','3'].
Question 28 : Dans le module itertools, que renvoie la fonction combinations(iterable,
r) ?
Reponse correcte
CORRECT Des tuples de longueur r, tries dans l'ordre, sans
elements repetes
Reponses incorrectes
INCORRECT Des tuples de longueur r, tries dans l'ordre avec elements repetes
INCORRECT Un produit cartesien, equivalent a une boucle for interieure
INCORRECT Des tuples de longueur r, dans tous les ordres possibles, sans
elements repetes
Explication
combinations(iterable, r) genere toutes les combinaisons de r elements sans repetition et dans
l'ordre d'apparition dans l'iterable. Ex : combinations('ABC',2) -> ('A','B'),('A','C'),('B','C'). Avec
repetition : combinations_with_replacement. Dans tous les ordres : permutations. Produit
cartesien : product.
Question 29 : a et b sont des sets. Lesquelles de ces propositions sont correctes ?
Reponse correcte
CORRECT [Link](b) renvoie True si a&b == set() ET
[Link](b) est equivalent a a<=b
Reponses incorrectes
INCORRECT [Link](e) leve une erreur KeyError si e n'appartient pas a a
INCORRECT [Link]({}) ne leve aucune erreur
Explication
CORRECTES : isdisjoint(b) retourne True quand l'intersection est vide (set()). issubset(b) et <=
sont bien equivalents. INCORRECTES : discard(e) ne leve PAS d'erreur si e est absent (c'est
remove(e) qui leve KeyError). [Link]({}) leve une TypeError car les dicts ne sont pas hashables
(les sets ne peuvent contenir que des elements immuables).