Examen Python 15

EXAMEN EN PYTHON SUJET 15

EXAMEN PROGRAMMATION PYTHON


Exercice 1 : Questions de cours – Généralités (4pts)

1. Qu'est-ce que le typage dynamique en Python ? Donnez un exemple.

2. Qu'est-ce qu'une fonction en Python et quels sont les intérêts d'utiliser des fonctions ?

3. Que retourne une fonction sans instruction "return" en Python ?

4. Qu'est-ce qu'une fonction lambda (anonyme) et donnez deux exemples d'utilisation ?

5. Quelles sont les 4 portées principales des variables en Python ? Donnez un exemple.


Exercice 2 : Liste imbriquée – filtrage avancé (2pts)

Énoncé : À partir d'une liste de listes de nombres, écrire une fonction Python qui crée une nouvelle liste ne contenant que les sous-listes dont la somme est supérieure à la moyenne globale de tous les nombres.


Exercice 3 : Compression et décompression (2pts)

Énoncé :

1. Écrire une fonction Python qui transforme une liste d'entiers en tuple de compressions :

Exemple : [1,1,1,2,2,3,3,3] → [(1,3),(2,2),(3,3)]

2. Écrire la fonction inverse qui effectue la décompression.


Exercice 4 : Les Fonctions - Compter de caractères (2pts)

Énoncé : Écrire une fonction en Python qui :

1. Reçoit une chaîne de caractères

2. Retourne un dictionnaire {caractère : fréquence} contenant le nombre d'occurrences de chaque caractère

3. Trouve et retourne le caractère le plus fréquent (en utilisant une fonction lambda)


Problème : Manipulation des Listes, tuples et Dictionnaires (10 pts)

Partie A : Manipulation des listes et des tuples (5 pts)

Données :

Etudiants = [
    ("Alice", [12, 14, 15]),
    ("Bob", [8, 9, 10]),
    ("Charlie", [16, 15, 17]),
    ("Diane", [11, 10, 12]),
    ("Eric", [9, 10, 13])
]
    

Question 1 : Afficher le nom de chaque étudiant suivi de sa moyenne (arrondie à 2 décimales)

Question 2 : Créer une liste des étudiants admis (moyenne ≥ 10) avec leurs moyennes

Question 3 : Trouver l'étudiant ayant la meilleure moyenne SANS utiliser la fonction max()

Question 4 : Trier les étudiants par moyenne décroissante

Question 5 : Créer un tuple contenant les noms des étudiants dont la moyenne est supérieure à la moyenne de la classe


Partie B : Fonctions et manipulation des dictionnaires (5 pts)

Données :

Notes_etudiants = {
    "Alice": {"math": 14, "info": 15, "physique": 13},
    "Bob": {"math": 9, "info": 10, "physique": 8},
    "Charlie": {"math": 17, "info": 16, "physique": 15},
    "Diane": {"math": 11, "info": 12, "physique": 10}
}
    

Question 1 : Écrire une fonction "moyenne(liste)" qui calcule la moyenne d'une liste de nombres

Question 2 : Écrire une fonction "moyenne_etudiant(notes_etudiants, nom)" qui retourne la moyenne d'un étudiant donné

Question 3 : Créer une fonction qui retourne la liste des étudiants admissibles (moyenne ≥ 10)

Question 4 : Écrire une fonction qui trouve la matière ayant la moyenne générale la plus faible

Question 5 : Écrire une fonction qui trouve l'étudiant ayant la meilleure moyenne générale


"La persévérance, c'est ce qui rend l'impossible possible, le possible probable et le probable réalisé."

Contact WhatsApp : +237 652027193 | Réalisé Par Mr Joël_Yk

Correction :

 


Exercice 1 : Questions de cours – Généralités (4pts)

1. Typage dynamique en Python

Correction : Le typage dynamique signifie que le type d'une variable est déterminé à l'exécution et peut changer pendant la vie du programme. Contrairement au typage statique, on n'a pas besoin de déclarer le type d'une variable.

Exemple :

x = 10        # x est un entier
print(type(x))  # <class 'int'>
x = "Genius"  # Maintenant x est une chaîne de caractères
print(type(x))  # <class 'str'>
    

Explication : La variable x change de type sans erreur, ce qui illustre la flexibilité du typage dynamique.

2. Fonction en Python

Correction : Une fonction est un bloc de code réutilisable qui effectue une tâche spécifique. Elle est définie avec le mot-clé def.

Intérêt d'utiliser des fonctions :

  • Réutilisabilité : Évite la duplication de code
  • Modularité : Divise un problème complexe en sous-problèmes
  • Lisibilité : Rend le code plus clair et organisé
  • Maintenance : Facilite les modifications

Exemple :

def carre(x):
    return x * x
print(carre(5))  # 25
    

3. Fonction sans instruction return

Correction : Quand une fonction ne contient pas d'instruction return, elle retourne implicitement None.

Exemple :

def saluer(nom):
    print(f"Bonjour {nom}")
resultat = saluer("Mr Joel Yankam")
print(resultat)  # Affiche : Mr Joel Yankam
                 # Puis : None
    

Implicitement veut dire directement effectué par le compilateur ……….

4. Fonction anonyme (lambda)

Correction : Une fonction lambda est une petite fonction anonyme définie avec le mot-clé lambda. Elle peut prendre plusieurs arguments mais ne contient qu'une seule expression.

Exemple d'utilisation :

# Avec sorted() pour trier par le deuxième élément
points = [(1, 5), (3, 2), (2, 8)]
triés = sorted(points, key=lambda x: x[1])
print(triés)  # [(3, 2), (1, 5), (2, 8)]

# Avec map() pour transformer
nombres = [1, 2, 3]
f = list(map(lambda a: a * a, nombres))
print(f)  # résultat [1, 4, 6]
    

5. Portée des variables (scope)

Le concept de portée (scope) définit la manière dont les variables et les noms sont recherchés dans votre code. En Python, il existe 4 portées principales :

  1. Locale (local) : Variable définie dans une fonction
  2. Enclosing(Enclosed) : Variable dans une fonction englobante
  3. Globale (Global) : Variable définie au niveau du module
  4. Built-in : Noms prédéfinis (comme print, len)

Exemple :

# PORTÉE GLOBALE (Global Scope)
# Ces variables sont accessibles partout dans le module
x = 10    # Variable globale x
y = 20    # Variable globale y
def outer():
    # PORTÉE ENCLOSED (Enclosed Scope)
    # Cette variable est définie dans outer() et accessible dans inner()
    z = 30    # Variable enclosed z - accessible dans inner() mais pas globalement
    #Retrouvez plus d'exercice corrigé sur www.pandacodeur.com
    
    def inner():
        # PORTÉE LOCALE (Local Scope)
        # Cette variable n'existe que dans inner()
        x = 30    # Variable locale x - masque la variable globale x
        # Accès aux différentes portées :
        print(f'x is {x}')    # Affiche la variable LOCALE x (30)
        print(f'z is {z}')    # Affiche la variable ENCLOSED z (30)
        print(f'y is {y}')    # Affiche la variable GLOBALE y (20) 
        # PORTÉE BUILT-IN (Built-in Scope)
        # len() est une fonction intégrée de Python
        print(len("abc"))    # Utilise la fonction BUILT-IN len()
    # Appel de la fonction intérieure
    inner()
# Appel de la fonction extérieure
outer()
    

Exercice 2 : Liste imbriquée – filtrage avancé (2pts)

Énoncé : À partir d'une liste de listes de nombres, créer une nouvelle liste ne contenant que les sous-listes dont la somme est supérieure à la moyenne globale.

Correction :

def filtrer_sous_listes(liste_imbriquee):
    # Étape 1 : Calculer la moyenne globale
    tous_nombres = []
    for sous_liste in liste_imbriquee:
        tous_nombres.extend(sous_liste)
    moyenne_globale = sum(tous_nombres) / len(tous_nombres) if tous_nombres else 0
    # Étape 2 : Filtrer les sous-listes
    resultat = []
    for sous_liste in liste_imbriquee:
        if sum(sous_liste) > moyenne_globale:
            resultat.append(sous_liste)
    return resultat

# Exemple d'utilisation
liste_Genius = [[1, 2, 3], [4, 5, 6], [7, 8, 78], [40]]
filtree = filtrer_sous_listes(liste_Genius)
print(filtree)
    

Explication :

  1. On combine d'abord tous les nombres pour calculer la moyenne globale
  2. On parcourt chaque sous-liste et on compare sa somme avec la moyenne
  3. On garde seulement les sous-listes dont la somme est supérieure

Exercice 3 : Compression et décompression (2pts)

Énoncé : Écrire un programme python qui transforme une liste d'entier en tuple ([1,1,1,2,2,3,3,3]) → [(1,3),(2,2),(3,3)] et écrire la fonction qui effectue l'opération inverse.

Correction :

Partie 1 : Compression

def compresser(liste):
    if not liste:
        return []
    resultat = []
    valeur_courante = liste[0]
    compteur = 1
    for i in range(1, len(liste)):
        if liste[i] == valeur_courante:
            compteur += 1
        else:
            resultat.append((valeur_courante, compteur))
            valeur_courante = liste[i]
            compteur = 1
    # Ajouter la dernière valeur
    resultat.append((valeur_courante, compteur))
    return resultat

# Test
liste_origine = [1, 1, 1, 2, 2, 3, 3, 3]
compressee = compresser(liste_origine)
print(compressee)  # [(1, 3), (2, 2), (3, 3)]
    

Partie 2 : Décompression

def decompresser(liste_compressee):
    resultat = []
    for valeur, compteur in liste_compressee:
        resultat.extend([valeur] * compteur)
    return resultat

# Test
decompressee = decompresser(compressee)
print(decompressee)  # [1, 1, 1, 2, 2, 3, 3, 3]

# Vérification
print(decompressee == liste_origine)  # True
    

L'instant Genius :

  • Compression : On compte les occurrences consécutives de chaque valeur
  • Décompression : On recrée la liste originale à partir des paires (valeur, compteur)

Exercice 4 : Les Fonctions - Compter de caractères (2pts)

Énoncé : Écrire une fonction en python, qui reçoit une chaîne et retourne un dictionnaire {caractère : fréquence} contenant le nombre d'occurrences de chaque caractère, ainsi que le caractère le plus fréquent (utiliser une fonction lambda).

Correction :

def compter_caracteres(chaine):
    # Créer le dictionnaire de fréquences
    frequences = { }
    for caractere in chaine:
        if caractere in frequences:
            frequences[caractere] += 1
        else:
            frequences[caractere] = 1
    # Trouver le caractère le plus fréquent avec lambda
    if frequences:
        caractere_max = max(frequences.items(), key=lambda x: x[1])
        # caractere_max est un tuple (caractere, frequence)
        return frequences, caractere_max[0], caractere_max[1]
    else:
        return frequences, None, 0

# Exemple d'utilisation
genius_test = "programmation"
freq, char_max, freq_max = compter_caracteres(genius_test)
print("Fréquences :", freq)
print(f"Caractère le plus fréquent : '{char_max}' avec {freq_max} occurrences")
#Plus d'exercice corrigé pandacodeur.com !
    

L'instant Genius :

  1. On parcourt chaque caractère de la chaîne
  2. On incrémente le compteur dans le dictionnaire
  3. On utilise max() avec une lambda pour trouver le caractère ayant la valeur maximale
  4. La lambda key=lambda x: x[1] spécifie qu'on compare par la fréquence (deuxième élément du tuple)

Problème : Manipulation des Listes, tuples et Dictionnaires

Partie A : Manipulation des listes et des tuples (5 pts)

Données :

Etudiants = [
    ("Alice", [12, 14, 15]),
    ("Bob", [8, 9, 10]),
    ("Charlie", [16, 15, 17]),
    ("Diane", [11, 10, 12]),
    ("Eric", [9, 10, 13])
]
    

1. Afficher le nom de chaque étudiant suivi de sa moyenne

print("1. Noms et moyennes des étudiants:")
for nom, notes in Etudiants:
    moyenne = sum(notes) / len(notes)   
    print(f"{nom}: {moyenne:.2f}")
    

2. Liste des étudiants admis (moyenne ≥ 10)

print("\n2. Étudiants admis (moyenne ≥ 10):")
etudiants_admis = []
for nom, notes in Etudiants:
    moyenne = sum(notes) / len(notes)
    if moyenne >= 10:
        etudiants_admis.append((nom, moyenne))
print(etudiants_admis)
# [('Alice', 13.666...), ('Charlie', 16.0), ('Diane', 11.0), ('Eric', 10.666...)]
    

3. Trouver l'étudiant ayant la meilleure moyenne sans max()

print("\n3. Meilleur étudiant (sans max()):")
meilleur_nom = None
meilleure_moyenne = -1

for nom, notes in Etudiants:
    moyenne = sum(notes) / len(notes)
    if moyenne > meilleure_moyenne:
        meilleure_moyenne = moyenne
        meilleur_nom = nom
print(f"{meilleur_nom} avec {meilleure_moyenne:.2f}")
# Charlie avec 16.00
    

4. Trier les étudiants par moyenne décroissante

print("\n4. Étudiants triés par moyenne décroissante:")
# Créer une liste avec les moyennes
etudiants_avec_moyennes = []
for nom, notes in Etudiants:
    moyenne = sum(notes) / len(notes)
    etudiants_avec_moyennes.append((nom, moyenne))
# Trier par moyenne décroissante
etudiants_tries = sorted(etudiants_avec_moyennes, key=lambda x: x[1], reverse=True)
for nom, moyenne in etudiants_tries:
    print(f"{nom}: {moyenne:.2f}")
    

5. Tuple des étudiants avec note > moyenne de classe

print("\n5. Étudiants avec note > moyenne de classe:")
# Calculer la moyenne générale
toutes_notes = []
for nom, notes in Etudiants:
    toutes_notes.extend(notes)
moyenne_classe = sum(toutes_notes) / len(toutes_notes)
# Filtrer les étudiants
etudiants_superieurs = []
for nom, notes in Etudiants:
    moyenne_etudiant = sum(notes) / len(notes)
    if moyenne_etudiant > moyenne_classe:
        etudiants_superieurs.append(nom)
resultat_tuple = tuple(etudiants_superieurs)
print(f"Moyenne de classe: {moyenne_classe:.2f}")
print("Étudiants au-dessus:", resultat_tuple)
    

Partie B : Fonctions et manipulation des dictionnaires (5 pts)

Données :

Notes_etudiants = {
    "Alice": {"math": 14, "info": 15, "physique": 13},
    "Bob": {"math": 9, "info": 10, "physique": 8},
    "Charlie": {"math": 17, "info": 16, "physique": 15},
    "Diane": {"math": 11, "info": 12, "physique": 10}
}
    

1. Fonction moyenne(liste)

print("\n1. Fonction moyenne():")
def moyenne(liste):
    if not liste:  # Liste vide
        return 0
    return sum(liste) / len(liste)

# Test
test_liste = [10, 12, 14, 16]
print(f"Moyenne de {test_liste}: {moyenne(test_liste)}")  # 13.0
    

2. Fonction moyenne_etudiant()

print("\n2. Fonction moyenne_etudiant():")
def moyenne_etudiant(notes_etudiants, nom):
    if nom not in notes_etudiants:
        return {nom: 0} 
    notes = list(notes_etudiants[nom].values())
    moy = moyenne(notes)
    return {nom: moy}

# Test
resultat = moyenne_etudiant(Notes_etudiants, "Alice")
print(f"Moyenne d'Alice: {resultat}")  # {'Alice': 14.0}
    

3. Étudiants admissibles

print("\n3. Liste des étudiants admissibles (moyenne ≥ 10):")
def etudiants_admissibles(notes_etudiants):
    admis = []
    for nom, matieres in notes_etudiants.items():
        notes = list(matieres.values())
        moy = moyenne(notes)
        if moy >= 10:
            admis.append(nom)
    return admis

admis = etudiants_admissibles(Notes_etudiants)
print("Étudiants admis:", admis)  # ['Alice', 'Charlie', 'Diane']
    

4. Matière avec moyenne générale la plus faible

print("\n4. Matière avec moyenne la plus faible:")
def matiere_faible(notes_etudiants):
    # Calculer les moyennes par matière
    moyennes_matieres = {}
    # Initialiser
    for matiere in next(iter(notes_etudiants.values())).keys():
        moyennes_matieres[matiere] = []
    # Collecter les notes
    for matieres in notes_etudiants.values():
        for matiere, note in matieres.items():
            moyennes_matieres[matiere].append(note)
    # Calculer les moyennes
    moyennes_calculees = {}
    for matiere, notes in moyennes_matieres.items():
        moyennes_calculees[matiere] = moyenne(notes)
    # Trouver la plus faible
    matiere_min = min(moyennes_calculees.items(), key=lambda x: x[1])
    return matiere_min[0], matiere_min[1]

mat_faible, moy_faible = matiere_faible(Notes_etudiants)
print(f"Matière: {mat_faible}, Moyenne: {moy_faible:.2f}")
    

5. Étudiant avec la meilleure moyenne

print("\n5. Meilleur étudiant:")
def meilleur_etudiant(notes_etudiants):
    meilleur_nom = None
    meilleure_moyenne = -1
    for nom, matieres in notes_etudiants.items():
        notes = list(matieres.values())
        moy = moyenne(notes) 
        if moy > meilleure_moyenne:
            meilleure_moyenne = moy
            meilleur_nom = nom 
    return meilleur_nom, meilleure_moyenne

nom_meilleur, moy_meilleur = meilleur_etudiant(Notes_etudiants)
print(f"Meilleur étudiant: {nom_meilleur} avec {moy_meilleur:.2f}")
# Charlie avec 16.00
    

"La persévérance, c'est ce qui rend l'impossible possible, le possible probable et le probable réalisé."

 

Contact WhatsApp : +237 652027193 | Réalisé Par Mr Joël_Yk

 

Questions / Réponses

Aucune question. Soyez le premier à poser une question.
Aucune note. Soyez le premier à attribuer une note !

Ajouter un commentaire

Anti-spam