Il y a plus de 8 millions de développeurs Python dans le monde. Des milliers de nouveaux apprenants rejoignent chaque jour la communauté Python.
La dure réalité c’est que seuls 10 à 20 % d’entre eux deviennent de bons développeurs et trouvent un emploi intéressant.
Et la principale raison c’est qu’ils ne sont pas capables de répondre à des questions d’entretien avancées. Je vais maintenant te présenter 10 questions d’entretien courantes (et importantes) de Python.
Maîtrise ces questions et tu te démarqueras à coup sûr lors de ton prochain entretien d’embauche en Python.
Quelle est la différence entre les fichiers .py et .pyc ?
Les fichiers .py
sont le code source du programme. Les fichiers .pyc
sont le bytecode compilé.
Python compile les fichiers .py
et les enregistre sous forme de fichiers .pyc
, que la machine virtuelle Python exécute.
Avant d’exécuter le code source principal, Python recherche sa version compilée (donc le fichier .pyc
). S’il la trouve, il l’exécute avec la machine virtuelle. Sinon, il compile le fichier .py
et l’exécute. En gros, les fichiers .pyc
économisent du temps de compilation en réutilisant le code déjà compilé.
Qu’est-ce que l’abstraction ? Comment implémenter l’abstraction en Python ?
L’abstraction cache les fonctions internes à l’utilisateur. Les utilisateurs interagissent avec les fonctions sans savoir comment les résultats sont générés.
Simplement, l’abstraction cache les données non pertinentes afin de réduire la complexité du programme. En Python, nous utilisons le module ABC pour réaliser l’abstraction.
Les classes abstraites peuvent servir de base à d’autres classes. Il n’est pas possible de créer des objets de classes abstraites, de sorte que le seul moyen d’accéder aux éléments est l’héritage.
from abc import ABC, abstractmethod class Parent(ABC): @abstractmethod def show(self): pass class child(Parent): def show(self): print("Child Class") obj = child() # Les classes abstraites ne peuvent pas être instanciées obj.show() # Classe enfant
Qu’est-ce qu’un FrozenSet ? Expliquez son importance à l’aide d’un exemple.
Les FrozenSets sont comme les sets, mais ils sont immuables.
Tu peux modifier les éléments set
à tout moment, mais frozenset
ne peut pas être modifié une fois créé.
Il n’est pas possible d’ajouter, de supprimer ou de mettre à jour des éléments après leur création. frozenset
prend un itérable en entrée et le rend immuable. Parce qu’ils sont immuables, ils peuvent être utilisés comme clés dans les dictionnaires.
data = {"Name": "Roger", "Pin": 3056, "ActNo":9892345112234565} fSet = frozenset(data) print(fSet) # frozenset({'Name', 'Pin', 'ActNo'})
Expliquez la différence entre une copie superficielle et une copie profonde.
La « copie superficielle » (« shallow copy ») stocke les références d’un objet dans un nouvel emplacement de la mémoire. Les modifications apportées au nouvel emplacement se répercutent sur l’ancien. C’est plus rapide qu’une copie profonde.
La « copie profonde » (« deep copy ») stocke les valeurs des objets dans un nouvel emplacement. Les changements dans le nouvel emplacement n’affectent pas l’ancien.
id
est utilisé pour visualiser l’adresse mémoire de l’objet. Les adresses dans l’exemple seront différentes sur ton ordinateur.
## Shallow Copy data = [1, 2, 3, 4, 5] updated_data = data updated_data.append(6) print(updated_data) # [1, 2, 3, 4, 5, 6] print(data) # [1, 2, 3, 4, 5, 6] print(id(data)) # 138342180436736 print(id(updated_data)) # 138342180436736
Comment utiliser pickle?
Pickling
convertit les objets Python en flux d’octets, ce que l’on appelle la sérialisation.
Unpickling
est l’inverse, convertissant les flux d’octets en objets Python, ce qui est connu sous le nom de désérialisation.
En Python, nous utilisons pickle.dump
et pickle.load
pour la sérialisation et la désérialisation.
## Pickling import pickle data = { 'Names': ["Noah","Elio","Summer"], 'Id': ('G770531','G770532','G770533'), 'Salary':[55600,88900,76000] } output = open('./data.pkl', 'wb') pickle.dump(data, output) output.close()
## Unpickling import pickle stream = open('./data.pkl', 'rb') data = pickle.load(stream) print(data) # {'Names': ['Noah', 'Elio', 'Summer'], 'Id': ('G770531', 'G770532', 'G770533'), 'Salary': [55600, 88900, 76000]} stream.close()
Que sont les *args et les **kwargs ?
Les *args et **kwargs permettent de passer un nombre variable d’arguments aux fonctions. Utilise-les lorsque tu n’es pas sûr du nombre d’arguments à passer.
*args permet de passer un nombre variable d’arguments à une fonction.
def addNumbers(*numbers): sum = 0 for number in numbers: sum = sum + number print("Somme : ",sum) addNumbers(3,5) # Somme : 8 addNumbers(5,6,7) # Somme : 18
Les **kwargs permettent de passer un nombre variable d’arguments de type mot-clé à une fonction.
def addNumbers(**data): sum = 0 for key,value in data.items(): sum = sum+value print("Somme : ",sum) addNumbers(a=5, b=6) # Somme : 11 addNumbers(a=5, b=8, c=10) # Somme : 23
Qu’est-ce qu’un gestionnaire de contexte en Python ?
Les gestionnaires de contexte gèrent les ressources. Ils nous permettent d’allouer et de libérer des ressources en fonction des besoins.
L’exemple le plus courant est l’instruction with
.
Elle est principalement utilisée pour ouvrir et fermer des fichiers.
L’instruction with
permet de s’assurer qu’un fichier est correctement fermé si un problème survient au cours d’une seule ligne de code.
with open ('./data.txt','w') as f: f.write("Hello")
Que sont les méthodes d’instance, les méthodes de classe et les méthodes statiques en Python ?
En Python, il existe trois types de méthodes : les méthodes d’instance, les méthodes de classe et les méthodes statiques.
- Méthodes d’instance : Méthodes ordinaires que nous créons dans les classes. Elles se rapportent aux objets et utilisent
self
pour faire référence à l’instance. - Méthodes de classe : Elles sont liées à la classe et non à ses objets. Elles effectuent des tâches au niveau de la classe et peuvent modifier l’état de la classe. Elles utilisent le décorateur
@classmethod
. - Méthodes statiques : Définies dans la classe pour la clarté de la logique, sans rapport avec la classe elle-même. Utiliser le décorateur
@staticmethod
.
Que sont les variables non locales et globales ?
Elles définissent la portée de la variable. Les variables globales sont définies comme des fonctions extérieures.
pi = 3.14 ## Variable globale def circle(radius): area_of_circle = pi * (radius) ** 2 print("L'aire du cercle est : ", area_of_circle) circle(7) # L'aire du cercle est : 153.86
Leur valeur est la même dans tout le code et peut être utilisée n’importe où dans le programme.
Les variables non locales sont utilisées dans des fonctions imbriquées sans portée locale définie. La modification de la valeur d’une variable non locale modifie également la valeur de la variable locale.
def outer_function(): x = "local_variable" def inner_function(): nonlocal x x = "nonlocal_variable" print("fonction interne :", x) inner_function() print("fonction externe :", x) outer_function() # fonction interne : nonlocal_variable # fonction externe : nonlocal_variable
Expliquer un générateur à l’aide d’un exemple.
Les générateurs sont des fonctions qui renvoient des objets itérables. Ils doivent inclure au moins une déclaration yield
.
yield
est un mot-clé qui renvoie une valeur sans perdre l’état actuel de la fonction ou les références des variables locales. Les fonctions avec yield
sont appelées générateurs.
Les générateurs ne produisent des éléments que lorsqu’ils sont nécessaires, ce qui leur permet d’économiser de la mémoire.
Pour les débutants, considérez yield
comme un return
qui n’arrête pas la fonction mais renvoie une valeur.
def fibon(limit): a,b = 0,1 while a < limit: yield a a, b = b, a + b for x in fibon(10): print(x) # 1 2 3 5 8 13 21 34 55 89
Conclusion
Je viens de partager avec toi 10 questions courantes d’entretien en Python. J’espère qu’elles t’aideront lorsque tu envisageras de changer d’emploi ou de te préparer à une recherche d’emploi !