Self-assessment quiz
Présentation & objectifs
Les quiz suivants sont là pour vous aider à vérifier que vous avez bien compris les articles que vous deviez étudier.
À la fin d’un quiz, des explications vous seront données sur vos réponses.
Si certaines sont fausses, vous aurez la possibilité de cliquer sur la question ratée pour réessayer.
Ces quiz sont fournis pour l’auto-évaluation et ne seront ni notés ni stockés.
N’hésitez pas à poser vos questions sur le serveur Discord pour toute précision ou explication !
Quiz
Qu’est-ce qu’un programme ?
# Classez dans l’ordre les différentes phases que l’interpréteur Python traverse lors de l’interprétation de votre code.
1. Détecter les erreurs lexicales telles que les problèmes d’encodage
> 💬 C’est la première phase où les erreurs lexicales, comme les problèmes d’encodage ou les jetons invalides, sont identifiées.
2. Vérifier la structure syntaxique du code pour détecter les instructions mal formées
> 💬 Après l’analyse lexicale, Python vérifie si la syntaxe du code est correcte, détectant des erreurs comme l’absence de deux-points ou de parenthèses.
3. Compiler le code source Python en bytecode pour accélérer son exécution
> 💬 Une fois la syntaxe validée, Python compile le code source en bytecode, qui peut être exécuté plus efficacement.
4. Charger et exécuter le code dans la machine virtuelle Python
> 💬 Enfin, le bytecode est exécuté par la machine virtuelle Python pour faire tourner le programme.
# Comment améliorer le code suivant pour le rendre plus facile à comprendre et à étendre ?
```python
from typing import List
l : List[int] = [5, 4, 8, 9, 0, -5, 1, 3]
i : int = 1
j : int = 0
while i < len(l) - 1:
if l[i] < l[len(l) - 1]:
l[j] += l[i]
l[i] = l[j] - l[i]
l[j] = l[j] - l[i]
j += 1
i += 1
l[j] += l[len(l) - 1]
l[len(l) - 1] = l[j] - l[len(l) - 1]
l[j] = l[j] - l[len(l) - 1]
```
- [ ] Utiliser plus de parenthèses et crochets
> ❌ Ajouter plus de parenthèses ou de crochets n’améliorera pas nécessairement la lisibilité ou la maintenabilité du code.
- [x] Ajouter des commentaires
> ✅ Ajouter des commentaires est essentiel pour clarifier le but de chaque section pour d’autres développeurs ou pour une référence future.
- [x] Utiliser des noms de variables plus explicites
> ✅ Dupliquer du code rend la maintenance plus difficile. Abstraire la logique répétée dans une fonction auxiliaire serait une approche plus propre.
- [x] Éviter d’avoir à deux endroits (pendant et après l’itération) trois lignes de code faisant la même chose
> ✅ Correct ! Dupliquer du code rend la maintenance plus difficile. Abstraire la logique répétée dans une fonction auxiliaire serait une approche plus propre.
- [ ] Regrouper les instructions sur une même ligne
> ❌ Incorrect ! Regrouper les instructions sur la même ligne réduirait la lisibilité. Il vaut mieux les garder séparées pour plus de clarté.
- [ ] Ajouter un point-virgule à la fin de chaque ligne
> ❌ Incorrect ! Python ne requiert pas de point-virgule à la fin des lignes, et en ajouter serait inutile et non conventionnel dans du code Python.
# Qu’est-ce qu’un programme ?
- [ ] Une série d’instructions aléatoires
> ❌ Un programme doit suivre une structure logique et ne pas être constitué d’instructions aléatoires.
- [x] Une série d’instructions qui réalisent un algorithme
> ✅ Un programme est une série d’instructions bien définies qui implémentent un algorithme.
- [ ] Un ensemble de spécifications matérielles
> ❌ Cela concerne le matériel, pas un programme logiciel.
- [x] Une traduction d’un algorithme dans un langage particulier
> ✅ Un programme est un algorithme exprimé dans un langage de programmation.
- [ ] Une collection d’entrées utilisateur
> ❌ Bien que les programmes puissent prendre des entrées utilisateur, cela ne définit pas à lui seul un programme.
# De quoi dépend la syntaxe d’un programme ?
- [ ] Des spécifications matérielles
> ❌ Le matériel ne définit pas la syntaxe d’un langage de programmation.
- [ ] Du système d’exploitation
> ❌ La syntaxe est indépendante du système d’exploitation et est définie par le langage lui-même.
- [x] Du langage de programmation
> ✅ La syntaxe est déterminée par les règles du langage de programmation utilisé.
- [x] Des spécificités du langage utilisé
> ✅ Chaque langage a des règles syntaxiques uniques qui doivent être respectées.
- [ ] De la complexité de l’algorithme
> ❌ La complexité d’un algorithme n’affecte pas la syntaxe, bien qu’elle puisse influencer la structure du code.
# Quels facteurs sont importants lors du choix d’un langage de programmation pour un projet ?
- [x] L’adaptation au projet
> ✅ Choisir un langage adapté aux besoins du projet est essentiel.
- [x] La performance
> ✅ Selon le projet, la performance peut être un facteur clé dans le choix du langage.
- [ ] Le classement du langage sur un site spécifique
> ❌ Les classements de popularité ne reflètent pas nécessairement la pertinence d’un langage pour un projet donné.
- [x] La disponibilité des bibliothèques
> ✅ La disponibilité des bibliothèques peut grandement améliorer la productivité et l’efficacité du code.
- [ ] Une sélection aléatoire
> ❌ Choisir un langage au hasard ne garantit pas qu’il répondra aux besoins du projet.
Bonnes pratiques de programmation
# Quels sont les éléments clés pour écrire un programme lisible ?
- [x] Une indentation correcte
> ✅ L’indentation est cruciale pour structurer le code de manière lisible, surtout en Python.
- [x] Des noms de variables significatifs
> ✅ Des noms clairs et descriptifs aident les autres à comprendre plus facilement le code.
- [ ] Une utilisation extensive de variables globales
> ❌ Les variables globales doivent être utilisées avec parcimonie pour éviter la complexité et les problèmes de maintenabilité.
- [x] Des commentaires appropriés
> ✅ Les commentaires aident à expliquer les sections complexes du code et apportent de la clarté sur les détails d’implémentation.
- [ ] Ignorer les règles de syntaxe du langage de programmation
> ❌ Les règles de syntaxe doivent toujours être respectées pour que le code fonctionne correctement.
# Que faut-il éviter lors de la rédaction des noms de variables ?
- [ ] Utiliser des noms significatifs
> ❌ Les noms significatifs sont essentiels pour la clarté et la maintenabilité.
- [x] Des noms comme `x1`, `x2`, `papa`, `maman`
> ✅ Évitez d’utiliser des noms non descriptifs ou confus qui ne reflètent pas le but de la variable.
- [ ] Suivre les conventions de nommage
> ❌ C’est une bonne pratique de suivre les conventions de nommage pour la cohérence et la lisibilité.
- [ ] Utiliser le snake_case en Python
> ❌ Le snake_case est la convention recommandée pour les variables et fonctions en Python.
- [x] Des noms non descriptifs comme `a` ou `prog1`
> ✅ Évitez d’utiliser des lettres seules ou des noms vagues qui ne donnent pas d’indication sur le rôle de la variable.
# Pourquoi est-il important d’éviter d’utiliser des valeurs codées en dur dans votre programme ?
- [x] Cela rend le code plus difficile à mettre à jour
> ✅ Les valeurs codées en dur compliquent les modifications futures, car il faudrait changer les valeurs à plusieurs endroits.
- [x] Utiliser des variables ou constantes rend le code plus flexible
> ✅ Remplacer les valeurs codées en dur par des variables ou constantes facilite la modification et la maintenance du code.
- [ ] Cela affecte la vitesse d’exécution du programme
> ❌ Les valeurs codées en dur n’ont généralement pas d’impact direct sur la vitesse d’exécution.
- [ ] Les valeurs codées en dur augmentent la lisibilité
> ❌ Les valeurs codées en dur rendent souvent le code plus difficile à comprendre, surtout dans les programmes volumineux.
- [x] Les variables permettent une modification plus aisée du code
> ✅ Les variables et constantes facilitent la mise à jour des valeurs dans tout le programme, réduisant le risque d’erreurs.
Évaluer la qualité d’un code Python
# À quoi sert le type hinting en Python ?
- [x] Améliorer la lisibilité du code
> ✅ Le type hinting clarifie le type de données attendu, améliorant la lisibilité et réduisant les erreurs.
- [ ] Optimiser la performance du programme
> ❌ Le type hinting n’affecte pas directement la performance.
- [x] Indiquer explicitement les types des variables
> ✅ Les annotations de type rendent explicites les types des variables et fonctions, facilitant la compréhension et le débogage.
- [ ] Remplacer les annotations de type en Java
> ❌ Le type hinting en Python est différent du système de types statique de Java et ne le remplace pas.
- [x] Aider les IDE à prévenir les erreurs
> ✅ Les annotations de type aident les IDE et les linters à identifier les erreurs potentielles avant l’exécution.
# Lequel des langages suivants est dynamiquement typé ?
1. [x] Python
> ✅ Python est un langage à typage dynamique, où les types des variables sont déterminés à l’exécution.
1. [ ] Java
> ❌ Java est un langage à typage statique, où les types sont vérifiés à la compilation.
1. [ ] C++
> ❌ C++ est également à typage statique.
1. [ ] C#
> ❌ C# est un langage à typage statique.
1. [ ] Go
> ❌ Go est aussi à typage statique.
Erreurs de programmation
# Quels sont les principaux types d’erreurs de programmation ?
- [x] Erreurs syntaxiques
> ✅ Les erreurs de syntaxe surviennent lorsque le code viole les règles grammaticales du langage de programmation.
- [x] Erreurs d’exécution
> ✅ Les erreurs d’exécution surviennent lorsque le programme rencontre un problème pendant son exécution, comme une division par zéro.
- [ ] Erreurs logiques
> ❌ Les erreurs logiques sont des fautes dans l’algorithme du programme, ce n’est pas une catégorie formelle d’erreurs comme les erreurs syntaxiques ou d’exécution.
- [ ] Erreurs de compilation
> ❌ Python n’a pas de phase de compilation distincte ; c’est un langage interprété.
- [ ] Erreurs de typage
> ❌ Les erreurs de type relèvent des erreurs d’exécution ou logiques, selon le moment où elles surviennent.
# Qu’est-ce qui cause une erreur syntaxique dans un programme Python ?
- [x] Une structure de code incorrecte qui viole les règles de syntaxe de Python
> ✅ Les erreurs syntaxiques surviennent lorsque la structure du code ne respecte pas les règles syntaxiques de Python.
- [x] L’utilisation de noms de variables invalides
> ✅ Python impose des règles sur les noms valides de variables, et les violer entraîne une erreur syntaxique.
- [x] Des jetons ou symboles mal placés dans le code
> ✅ Une mauvaise utilisation des jetons (comme des parenthèses ou des virgules manquantes) peut provoquer des erreurs syntaxiques.
- [ ] L’utilisation de types de données invalides pendant l’exécution
> ❌ Cela causerait une erreur d’exécution, pas une erreur syntaxique.
- [ ] L’accès à une mémoire non disponible
> ❌ Cela serait une erreur d’exécution, sans lien avec la syntaxe.
# Qu’est-ce qui peut provoquer des erreurs d’exécution dans un programme Python ?
- [x] Division par zéro
> ✅ Diviser par zéro provoque une erreur d’exécution car c’est une opération invalide en Python.
- [x] Opérations non autorisées sur des variables
> ✅ Effectuer des opérations interdites sur des variables peut entraîner des erreurs d’exécution.
- [x] Accéder à un fichier indisponible
> ✅ Essayer d’ouvrir un fichier qui n’existe pas provoque une erreur d’exécution.
- [ ] Une indentation incorrecte
> ❌ Une indentation incorrecte entraîne une erreur syntaxique, pas une erreur d’exécution.
- [ ] Des noms de variables mal orthographiés
> ❌ Incorrect ! Cela provoquerait une NameError à l’exécution mais n’est pas classé comme une erreur d’exécution.
# Pourquoi les nombres aléatoires peuvent-ils rendre le débogage difficile dans un programme ?
- [x] Le résultat du programme peut varier à chaque exécution
> ✅ Les nombres aléatoires entraînent des résultats variables, rendant plus difficile la reproduction constante des erreurs.
- [ ] Les nombres aléatoires génèrent toujours des erreurs d’exécution
> ❌ Les nombres aléatoires ne causent pas intrinsèquement d’erreurs, bien qu’ils puissent entraîner une variabilité des résultats.
- [x] Certaines exécutions peuvent fonctionner correctement tandis que d’autres échouent de manière inattendue
> ✅ Cette incohérence explique pourquoi les nombres aléatoires compliquent le débogage.
- [ ] Les nombres aléatoires sont intrinsèquement imprévisibles et causent de l’instabilité
> ❌ Les nombres aléatoires sont imprévisibles par nature mais ne causent pas nécessairement d’instabilité.
- [x] Le débogage d’un programme avec des éléments aléatoires peut être incohérent
> ✅ Puisque la sortie varie à chaque exécution, le débogage peut devenir incohérent et peu fiable.
# Que peut-on faire pour assurer la cohérence lors du débogage avec des nombres aléatoires ?
- [x] Fixer une graine pour le générateur de nombres aléatoires
> ✅ Fixer une graine garantit que le générateur produit la même séquence à chaque fois.
- [x] Utiliser une série déterministe de nombres initialisée avec une graine
> ✅ Cela assure la cohérence du comportement du programme pour le débogage.
- [ ] Éviter complètement l’utilisation des nombres aléatoires
> ❌ Les nombres aléatoires sont souvent nécessaires, mais fixer une graine aide à gérer leur imprévisibilité.
- [ ] S’assurer que toutes les valeurs sont prédéfinies
> ❌ Bien que les valeurs prédéfinies évitent l’aléatoire, utiliser une graine permet la reproductibilité sans perdre l’aléatoire.
- [x] Identifier la graine qui cause les erreurs et déboguer en conséquence
> ✅ Connaître la graine permet de reproduire l’erreur de manière constante et de déboguer efficacement.
# Lesquelles des erreurs suivantes sont des erreurs syntaxiques ?
- [x] Un deux-points manquant dans une boucle `for`
> ✅ Un deux-points manquant est une erreur syntaxique, car cela viole les règles de syntaxe de Python pour les boucles.
- [x] Des symboles invalides comme `for i j in range()`
> ✅ Cette syntaxe est invalide, car il manque des éléments nécessaires comme une virgule entre les variables.
- [ ] Division par zéro dans le code
> ❌ La division par zéro provoque une erreur d’exécution, pas une erreur syntaxique.
- [ ] Accéder à un fichier qui n’existe pas
> ❌ Cela déclencherait une erreur d’exécution plutôt qu’une erreur syntaxique.
- [x] Parenthèses non appariées dans les appels de fonction
> ✅ Des parenthèses non appariées sont une erreur syntaxique car elles empêchent l’analyse correcte de l’appel de fonction.
# Quelle est une bonne pratique lors de l’utilisation de nombres aléatoires dans un programme ?
- [x] Fixer une graine spécifique pour assurer la reproductibilité lors du débogage
> ✅ Fixer une graine garantit que la génération de nombres aléatoires peut être répétée de manière cohérente.
- [ ] Toujours éviter l’utilisation de nombres aléatoires dans les calculs importants
> ❌ Les nombres aléatoires peuvent être cruciaux dans certains calculs, mais une bonne gestion (ex. fixation de graines) est importante.
- [x] Utiliser une graine connue pour garantir que toutes les exécutions produisent la même sortie
> ✅ Une graine connue assure la reproductibilité pour les tests et le débogage.
- [ ] Utiliser plusieurs générateurs de nombres aléatoires sans fixer leurs graines
> ❌ Cela entraînerait un comportement non reproductible, compliquant le débogage.
- [x] Rapporter la performance des algorithmes aléatoires en moyennant les résultats sur plusieurs exécutions
> ✅ Les algorithmes aléatoires doivent être évalués sur plusieurs exécutions pour obtenir une performance moyenne.