Introduction
Ce tutoriel vous guidera à travers le processus de mise en œuvre d'un système de notation utilisant les instructions if-elif-else de Python. Vous apprendrez à déterminer la note d'un étudiant en fonction de ses notes, une tâche courante dans les établissements d'enseignement. À la fin de ce tutoriel, vous aurez créé un programme de notation fonctionnel qui peut être appliqué à des scénarios réels. Cette approche pratique renforcera votre compréhension des instructions conditionnelles en Python, qui sont des éléments fondamentaux pour une logique de programmation plus complexe.
Comprendre les instructions conditionnelles en Python
Avant de créer notre système de notation, comprenons les instructions conditionnelles de base en Python. Les instructions conditionnelles permettent à votre programme de prendre des décisions basées sur des conditions spécifiques.
Création de votre premier fichier Python
Commençons par créer un nouveau fichier Python :
- Dans le WebIDE, cliquez sur le menu "File" (Fichier) en haut à gauche.
- Sélectionnez "New File" (Nouveau fichier).
- Enregistrez le fichier sous le nom
conditional_demo.pydans le répertoire/home/labex/project.
Instruction If-Else de base
Dans votre fichier conditional_demo.py, écrivez le code suivant :
## Basic if-else example
score = 75
if score >= 70:
print("You passed the test!")
else:
print("You need to study more.")
## Try changing the score to see different results
Ce programme simple vérifie si la variable score est supérieure ou égale à 70. Si c'est le cas, il affiche "You passed the test!". Sinon, il affiche "You need to study more."
Tester votre code
Pour exécuter votre code, ouvrez un terminal dans le WebIDE et exécutez :
python3 /home/labex/project/conditional_demo.py
Vous devriez voir la sortie :
You passed the test!
Ajout de plus de conditions avec If-Elif-Else
Développons notre exemple pour gérer plus de conditions en utilisant la structure if-elif-else :
## If-elif-else example
score = 85
if score >= 90:
print("Excellent!")
elif score >= 80:
print("Very good!")
elif score >= 70:
print("Good!")
elif score >= 60:
print("Satisfactory")
else:
print("Needs improvement")
## Try different values for score to see different results
Enregistrez le fichier et exécutez-le à nouveau :
python3 /home/labex/project/conditional_demo.py
Sortie :
You passed the test!
Very good!
La structure if-elif-else évalue les conditions de haut en bas. Une fois qu'une condition est vraie, son bloc de code correspondant s'exécute, et le reste des conditions est ignoré.
Comprendre ce flux est crucial pour construire notre système de notation à l'étape suivante.
Création d'un système de notation de base
Maintenant que nous comprenons les instructions conditionnelles, construisons un système de notation simple. Nous allons créer une fonction qui convertit les notes numériques en notes littérales.
Création du fichier du système de notation
- Dans le WebIDE, créez un nouveau fichier appelé
grading_system.py - Enregistrez-le dans le répertoire
/home/labex/project
Implémentation de la fonction de notation de base
Dans votre fichier grading_system.py, écrivez le code suivant :
def get_grade(marks):
"""
Convertir les notes numériques en notes littérales.
A: 90-100
B: 80-89
C: 70-79
D: 60-69
F: 0-59
"""
if marks >= 90:
return 'A'
elif marks >= 80:
return 'B'
elif marks >= 70:
return 'C'
elif marks >= 60:
return 'D'
else:
return 'F'
## Test the function with a few examples
test_marks = [95, 82, 75, 65, 45]
for mark in test_marks:
grade = get_grade(mark)
print(f"Marks: {mark} - Grade: {grade}")
Ce code crée une fonction get_grade() qui prend les notes d'un étudiant en entrée et renvoie la note littérale correspondante en fonction des seuils de notation courants.
Exécution de notre système de notation
Testons notre système de notation en exécutant le code :
python3 /home/labex/project/grading_system.py
Vous devriez voir une sortie similaire à :
Marks: 95 - Grade: A
Marks: 82 - Grade: B
Marks: 75 - Grade: C
Marks: 65 - Grade: D
Marks: 45 - Grade: F
Comprendre le code
Décomposons le fonctionnement :
- Nous avons défini une fonction appelée
get_grade()qui prend un paramètre :marks(notes). - À l'intérieur de la fonction, nous avons utilisé des instructions if-elif-else pour vérifier les notes par rapport à différents seuils de notation.
- Nous avons créé une liste de notes de test pour démontrer comment la fonction fonctionne avec différentes valeurs.
- Nous avons utilisé une boucle
forpour itérer sur chaque note, obtenir sa note et afficher le résultat.
Ce système de notation de base fonctionne bien pour les cas standards, mais qu'en est-il des cas limites (edge cases) ? À l'étape suivante, nous améliorerons notre système pour les gérer.
Gestion des cas limites dans notre système de notation
Notre système de notation de base fonctionne, mais il ne tient pas compte des cas limites tels que :
- Saisies non valides (notes inférieures à 0 ou supérieures à 100)
- Saisies non numériques
Améliorons notre système de notation pour gérer ces scénarios.
Mise à jour du système de notation
Créez un nouveau fichier appelé improved_grading.py dans le répertoire /home/labex/project avec le code suivant :
def get_grade(marks):
"""
Convertir les notes numériques en notes littérales avec validation des entrées.
A: 90-100
B: 80-89
C: 70-79
D: 60-69
F: 0-59
Retourne "Invalid marks" (Notes non valides) pour les entrées en dehors de la plage 0-100
"""
try:
## Convertir en float au cas où l'entrée est un nombre sous forme de chaîne
marks = float(marks)
## Vérifier si les notes sont dans la plage valide
if marks < 0 or marks > 100:
return "Invalid marks: must be between 0 and 100"
elif marks >= 90:
return 'A'
elif marks >= 80:
return 'B'
elif marks >= 70:
return 'C'
elif marks >= 60:
return 'D'
else:
return 'F'
except ValueError:
return "Invalid marks: not a number"
## Test the function with valid and invalid inputs
test_inputs = [95, 82, 75, 65, 45, -5, 105, "abc", "75"]
for value in test_inputs:
grade = get_grade(value)
print(f"Input: {value} - Result: {grade}")
Exécution du système de notation amélioré
Exécutez le système de notation amélioré :
python3 /home/labex/project/improved_grading.py
La sortie devrait ressembler à :
Input: 95 - Result: A
Input: 82 - Result: B
Input: 75 - Result: C
Input: 65 - Result: D
Input: 45 - Result: F
Input: -5 - Result: Invalid marks: must be between 0 and 100
Input: 105 - Result: Invalid marks: must be between 0 and 100
Input: abc - Result: Invalid marks: not a number
Input: 75 - Result: C
Explication des améliorations
Examinons les améliorations que nous avons apportées :
Conversion du type d'entrée : Nous utilisons
float()pour convertir l'entrée en un nombre, ce qui permet à notre fonction d'accepter des entrées de type chaîne comme "75".Vérification de la plage valide : Nous avons ajouté une condition pour vérifier si les notes se situent dans la plage valide de 0 à 100.
Gestion des erreurs : Nous avons enveloppé notre code dans un bloc try-except pour intercepter les exceptions
ValueErrorqui se produisent lorsque des entrées non numériques sont fournies.Messages d'erreur détaillés : Nous renvoyons des messages d'erreur spécifiques pour informer l'utilisateur de ce qui s'est mal passé au lieu de simplement renvoyer un code d'erreur.
Ces améliorations rendent notre système de notation plus robuste en gérant gracieusement divers cas limites. Le programme fournit désormais des commentaires utiles lorsque des entrées non valides sont rencontrées, au lieu de planter ou de produire des résultats incorrects.
Amélioration du système de notation avec des messages de commentaires
Améliorons encore notre système de notation en ajoutant des messages de commentaires personnalisés pour chaque note. Cela rend le système plus informatif et convivial.
Création du système de notation amélioré
Créez un nouveau fichier appelé enhanced_grading.py dans le répertoire /home/labex/project :
def get_grade_with_feedback(marks):
"""
Convertir les notes numériques en notes littérales avec des commentaires personnalisés.
Retourne un tuple contenant la note et un message de commentaire.
"""
try:
marks = float(marks)
if marks < 0 or marks > 100:
return (None, "Invalid marks: must be between 0 and 100")
elif marks >= 90:
return ('A', "Excellent! Outstanding performance.")
elif marks >= 80:
return ('B', "Very good! Above average performance.")
elif marks >= 70:
return ('C', "Good work! Average performance.")
elif marks >= 60:
return ('D', "Satisfactory. Below average but passing.")
else:
return ('F', "Needs improvement. Please study more.")
except ValueError:
return (None, "Invalid marks: not a number")
def format_report(student_name, marks, subject):
"""
Générer un rapport formaté pour un étudiant.
"""
grade, feedback = get_grade_with_feedback(marks)
if grade is None:
return f"Report for {student_name}: {feedback}"
return f"""
Report Card
-----------
Student: {student_name}
Subject: {subject}
Marks: {marks}
Grade: {grade}
Feedback: {feedback}
"""
## Test the enhanced system with a few examples
students = [
{"name": "Alice", "marks": 92, "subject": "Mathematics"},
{"name": "Bob", "marks": 78, "subject": "Science"},
{"name": "Charlie", "marks": 45, "subject": "History"},
{"name": "David", "marks": "abc", "subject": "English"}
]
for student in students:
report = format_report(student["name"], student["marks"], student["subject"])
print(report)
Exécution du système de notation amélioré
Exécutez le système de notation amélioré :
python3 /home/labex/project/enhanced_grading.py
Vous devriez voir une sortie similaire à :
Report Card
-----------
Student: Alice
Subject: Mathematics
Marks: 92
Grade: A
Feedback: Excellent! Outstanding performance.
Report Card
-----------
Student: Bob
Subject: Science
Marks: 78
Grade: C
Feedback: Good work! Average performance.
Report Card
-----------
Student: Charlie
Subject: History
Marks: 45
Grade: F
Feedback: Needs improvement. Please study more.
Report for David: Invalid marks: not a number
Explication des nouvelles fonctionnalités
Examinons les améliorations que nous avons implémentées :
Commentaires personnalisés : Chaque note comprend désormais un message de commentaire spécifique qui fournit un contexte et des encouragements.
Format de retour : Notre fonction
get_grade_with_feedback()renvoie un tuple contenant à la fois la note et le message de commentaire.Formatage du rapport : Nous avons créé une nouvelle fonction
format_report()qui génère un bulletin de notes bien structuré pour chaque étudiant.Tests avec des données réelles : Nous avons utilisé une liste de dictionnaires pour simuler des données réelles d'étudiants, ce qui est une structure de données courante en programmation.
Gestion gracieuse des erreurs : Le système gère toujours les entrées non valides avec élégance, mais présente désormais les erreurs dans un format convivial.
Ces améliorations rendent notre système de notation plus pratique pour une utilisation réelle. Les commentaires personnalisés aident les étudiants à comprendre leurs performances, tandis que le rapport formaté fournit une présentation professionnelle des résultats.
Application du système de notation à un ensemble de données réel
Appliquons maintenant notre système de notation à un scénario plus réaliste. Nous allons créer un programme qui lit les données des étudiants à partir d'un fichier, calcule les notes et écrit un rapport complet.
Création d'un exemple d'ensemble de données
Tout d'abord, créons un fichier avec des exemples de données d'étudiants. Créez un nouveau fichier appelé student_data.csv dans le répertoire /home/labex/project avec le contenu suivant :
name,subject,marks
John,Mathematics,88
Emily,Mathematics,92
Michael,Mathematics,75
Sophia,Mathematics,68
Daniel,Mathematics,42
Olivia,Mathematics,95
William,Mathematics,73
Emma,Mathematics,60
James,Mathematics,79
Ava,Mathematics,85
Création de l'application de notation complète
Maintenant, créez un nouveau fichier appelé grading_application.py dans le répertoire /home/labex/project :
def get_grade_with_feedback(marks):
"""
Convertir les notes numériques en notes littérales avec des commentaires personnalisés.
Retourne un tuple contenant la note et un message de commentaire.
"""
try:
marks = float(marks)
if marks < 0 or marks > 100:
return (None, "Invalid marks: must be between 0 and 100")
elif marks >= 90:
return ('A', "Excellent! Outstanding performance.")
elif marks >= 80:
return ('B', "Very good! Above average performance.")
elif marks >= 70:
return ('C', "Good work! Average performance.")
elif marks >= 60:
return ('D', "Satisfactory. Below average but passing.")
else:
return ('F', "Needs improvement. Please study more.")
except ValueError:
return (None, "Invalid marks: not a number")
def process_student_data(input_filename, output_filename):
"""
Traiter les données des étudiants à partir d'un fichier CSV et générer un rapport.
"""
try:
## Lire le fichier d'entrée
with open(input_filename, 'r') as file:
lines = file.readlines()
## Ignorer la ligne d'en-tête
headers = lines[0].strip().split(',')
data = [line.strip().split(',') for line in lines[1:]]
## Préparer la sortie
output_lines = ["Student Grade Report\n", "=" * 20 + "\n\n"]
## Calculer les statistiques
valid_marks = []
grade_counts = {'A': 0, 'B': 0, 'C': 0, 'D': 0, 'F': 0, 'Invalid': 0}
## Traiter chaque étudiant
for student in data:
name, subject, marks = student
grade, feedback = get_grade_with_feedback(marks)
if grade:
valid_marks.append(float(marks))
grade_counts[grade] += 1
output_lines.append(f"Student: {name}\n")
output_lines.append(f"Subject: {subject}\n")
output_lines.append(f"Marks: {marks}\n")
output_lines.append(f"Grade: {grade}\n")
output_lines.append(f"Feedback: {feedback}\n\n")
else:
grade_counts['Invalid'] += 1
output_lines.append(f"Student: {name}\n")
output_lines.append(f"Subject: {subject}\n")
output_lines.append(f"Error: {feedback}\n\n")
## Calculer les statistiques
if valid_marks:
average_mark = sum(valid_marks) / len(valid_marks)
max_mark = max(valid_marks)
min_mark = min(valid_marks)
output_lines.append("Class Statistics\n")
output_lines.append("-" * 15 + "\n")
output_lines.append(f"Average Mark: {average_mark:.2f}\n")
output_lines.append(f"Highest Mark: {max_mark:.1f}\n")
output_lines.append(f"Lowest Mark: {min_mark:.1f}\n\n")
output_lines.append("Grade Distribution\n")
output_lines.append("-" * 17 + "\n")
for grade, count in grade_counts.items():
output_lines.append(f"{grade}: {count}\n")
## Écrire le fichier de sortie
with open(output_filename, 'w') as file:
file.writelines(output_lines)
print(f"Report successfully generated and saved to {output_filename}")
except Exception as e:
print(f"An error occurred: {str(e)}")
## Run the application
input_file = "/home/labex/project/student_data.csv"
output_file = "/home/labex/project/grade_report.txt"
process_student_data(input_file, output_file)
## Display the report in the console as well
print("\nGenerated Report Contents:")
print("--------------------------")
with open(output_file, 'r') as file:
print(file.read())
Exécution de l'application complète
Exécutez l'application :
python3 /home/labex/project/grading_application.py
Le programme lira les données des étudiants, calculera les notes, générera un rapport et l'affichera dans la console. Vous devriez voir une sortie similaire à :
Report successfully generated and saved to /home/labex/project/grade_report.txt
Generated Report Contents:
--------------------------
Student Grade Report
====================
Student: John
Subject: Mathematics
Marks: 88
Grade: B
Feedback: Very good! Above average performance.
Student: Emily
Subject: Mathematics
Marks: 92
Grade: A
Feedback: Excellent! Outstanding performance.
...
Class Statistics
---------------
Average Mark: 75.70
Highest Mark: 95.0
Lowest Mark: 42.0
Grade Distribution
-----------------
A: 2
B: 2
C: 3
D: 1
F: 2
Invalid: 0
Examen du fichier de rapport
Vous pouvez également vérifier le fichier de rapport généré :
cat /home/labex/project/grade_report.txt
Le fichier doit contenir le même contenu que celui affiché dans la console.
Compréhension de l'application complète
L'application de notation complète que nous avons créée démontre plusieurs concepts de programmation importants :
- Entrées/Sorties de fichiers (File I/O) : Lecture et écriture de données dans des fichiers
- Traitement des données (Data Processing) : Conversion et analyse des données brutes
- Calcul des statistiques (Statistics Calculation) : Calcul des moyennes et recherche des valeurs minimales/maximales
- Gestion des erreurs (Error Handling) : Gestion des erreurs potentielles lors des opérations sur les fichiers
- Formatage de la sortie (Formatting Output) : Création d'un rapport bien structuré et lisible
Cette application représente un cas d'utilisation réel de notre système de notation, montrant comment les instructions if-elif-else de Python peuvent être appliquées pour résoudre des problèmes pratiques dans les contextes éducatifs.
Résumé
Dans ce tutoriel, vous avez réussi à construire un système de notation complet en utilisant les instructions if-elif-else de Python. En commençant par les instructions conditionnelles de base, vous avez progressivement amélioré votre programme pour gérer les cas limites, fournir des commentaires personnalisés et traiter des données réelles d'étudiants.
Voici les compétences clés que vous avez développées :
- Utilisation des instructions if-elif-else pour implémenter une logique de prise de décision
- Validation des entrées utilisateur et gestion gracieuse des erreurs
- Fourniture de commentaires pertinents basés sur des conditions
- Traitement des données à partir de fichiers et génération de rapports
- Calcul de statistiques à partir d'un ensemble de données
Ces compétences sont fondamentales pour de nombreuses tâches de programmation et peuvent être appliquées à divers scénarios réels au-delà des systèmes de notation. Les principes de la logique conditionnelle que vous avez appris serviront de blocs de construction pour des programmes plus complexes dans vos futurs projets Python.
N'oubliez pas que les bonnes pratiques de programmation incluent :
- Des noms de variables et de fonctions clairs et descriptifs
- Une gestion appropriée des erreurs
- Un code bien structuré et organisé
- Des commentaires et une documentation utiles
Continuez à vous entraîner en étendant ce système de notation ou en appliquant ce que vous avez appris à de nouveaux défis de programmation !



