Examen Python 12

EXAMEN EN PYTHON SUJET 12

Examen de Programmation Python -

Durée : 2 heures

Total : 20.5 points

Exercice 1 : Compréhension de programmes Python (5 points)

Contexte : Programmation avancée et fonctions en Python

Sous-exercice 1.1 : Compréhension de listes (1 point)

Que fait chaque programme Python suivant ?

Programme A :

A = [[0 for _ in range(5)] for _ in range(5)]

Programme B :

A = [i for i in range(5)]

Programme C :

A = [float(input("Entrer un élément de A : ")) for _ in range(5)]
B = [float(input("Entrer un élément de B : ")) for _ in range(5)]
C = [a + b for a, b in zip(A, B)]

Sous-exercice 1.2 : Fonctions lambda et fermetures (1 point)

def create_multipliers():
    return [lambda x: i * x for i in range(5)]

multipliers = create_multipliers()
print([m(2) for m in multipliers])

Quel est le résultat ?

  • a) [0, 2, 4, 6, 8]
  • b) [8, 8, 8, 8, 8]
  • c) [0, 1, 2, 3, 4]
  • d) Erreur

Sous-exercice 1.3 : Variables nonlocales (1 point)

def make_counter():
    count = 0
    def counter(step=1):
        nonlocal count
        count += step
        return count if count < 5 else make_counter()()
    return counter

c = make_counter()
print(c(2), c(1), c(3), c())

Quel est l'affichage ?

  • a) 2 3 6 1
  • b) 2 3 6 7
  • c) 2 3 1 2
  • d) 2 3 1 1

Sous-exercice 1.4 : Fonctions génératrices (1 point)

def generate(n):
    return lambda x: [x + i for i in range(n)]

f1 = generate(3)
f2 = generate(2)
print(f1(5), f2(f1(2)[1]))

Quel est l'affichage ?

  • a) [5, 6, 7] [4, 5]
  • b) [5, 6, 7] [3, 4]
  • c) [5, 6, 7] [5, 6]
  • d) [5, 6, 7] [6, 7]

Sous-exercice 1.5 : Structures imbriquées (1 point)

L = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
print(L[1][0][0] + L[0][1][1] + L[-1][-1][-2])

Quel est l'affichage ?

  • a) 10
  • b) 12
  • c) 14
  • d) 16

Exercice 2 : Algorithmique et Structures Linéaires (5 points)

Contexte : Algorithmes de traitement de données

Sous-exercice 2.1 : Comptage d'occurrences (2 points)

Exercice 4 : Nombre d'occurrences des chiffres

Écrire un programme qui lit une suite de chiffres terminée par le marqueur -1 et affiche le nombre d'occurrences de chaque chiffre. On utilisera un vecteur de taille 10 pour faire le décompte.

Exemple d'exécution :

Entrez une suite de chiffres (terminez par -1) :
5 3 5 2 5 3 1 -1
Occurrences :
0: 0
1: 1
2: 1
3: 2
4: 0
5: 3
6: 0
7: 0
8: 0
9: 0

Sous-exercice 2.2 : Traitement de caractères (1.5 points)

Exercice 5 : Nombre d'occurrences des lettres

Écrire un programme qui lit une suite de lettres terminée par le marqueur '1' et affiche le nombre d'occurrences de chaque lettre de l'alphabet français. On utilisera un vecteur oc de taille 26 pour faire le décompte.

Indice : Utilisez ord('a') pour obtenir le code ASCII de 'a'. Le décompte pour la lettre 'c' se fera dans oc[ord('c') - ord('a')].

Sous-exercice 2.3 : Algèbre linéaire (1.5 points)

Exercice 6 : Produit matrice-vecteur

Écrire un programme qui lit les coefficients d'une matrice carrée A d'ordre N=10 et d'un vecteur X de taille N et affiche le résultat du produit matrice-vecteur AX.

Formule : Pour chaque ligne i de la matrice A, l'élément i du vecteur résultat est : resultat[i] = Σ(A[i][j] * X[j]) pour j de 0 à N-1

Exercice 3 : Manipulation des Structures de Données (10.5 points)

Contexte : Structures de données en Python (Listes, Tuples, Dictionnaires)

Partie A : Manipulation d'une Liste de Cours d'Informatique (3.5 points)

Liste Initiale : cours_informatique = ["Algorithmique", "Structures de Données", "Base de Données", "Réseaux", "Programmation Orientée Objet"]

  1. Quelle sera la sortie de cours_informatique[1:4] ? (0.5 pt)
  2. Quelle sera la sortie de cours_informatique[-4:-1] ? (0.5 pt)
  3. Quelle sera la sortie de cours_informatique[::-2] ? (0.5 pt)
  4. Quelle sera la sortie de cours_informatique[3:] + cours_informatique[:2] ? (0.5 pt)
  5. Donnez le code Python pour ajouter le cours "Intelligence Artificielle" à la fin de la liste. (0.5 pt)
  6. Convertissez la liste cours_informatique en tuple et affichez son type. (0.5 pt)
  7. Utilisez range() pour créer une liste d'indices correspondant aux cours. (0.5 pt)

Partie B : Manipulation des Dictionnaires (3.5 points)

Nous créons un dictionnaire infos_cours où : Les clés sont les noms des cours. Les valeurs sont des dictionnaires contenant : ("semestre" (int), "credits" (int), "prerequis" (liste des cours prérequis)).

infos_cours = {
    "Algorithmique": {"semestre": 1, "credits": 6, "prerequis": []},
    "Structures de Données": {"semestre": 2, "credits": 6, "prerequis": ["Algorithmique"]},
    "Base de Données": {"semestre": 3, "credits": 5, "prerequis": ["Algorithmique"]},
    "Réseaux": {"semestre": 4, "credits": 5, "prerequis": ["Algorithmique"]},
    "Programmation Orientée Objet": {"semestre": 3, "credits": 6, "prerequis": ["Structures de Données"]}
}
  1. Affichez le nombre de crédits du cours "Structures de Données". (0.5 pt)
  2. Ajoutez "Mathématiques" à la liste des prérequis de l'"Algorithmique". (0.5 pt)
  3. Affichez les cours du semestre 3. (0.5 pt)
  4. Modifiez les crédits de "Réseaux" à 6 crédits. (0.5 pt)
  5. Affichez tous les prérequis de "Programmation Orientée Objet". (0.5 pt)
  6. Supprimez le cours "Base de Données" du dictionnaire. (0.5 pt)
  7. Affichez le nombre total de crédits des cours restants. (0.5 pt)

Partie C : Manipulation des Listes de Notes (3.5 points)

Liste Initiale des notes d'étudiants : notes = [15.5, 12.0, 18.0, 8.5, 14.0]

Questions : Donnez le code Python pour

  1. Triez et affichez les notes par ordre décroissant. (0.5 pt)
  2. Ajoutez la note 16.5 à la liste et affichez la liste. (0.5 pt)
  3. Renversez et affichez la liste. (0.5 pt)
  4. Affichez l'indice de la note 14.0. (0.5 pt)
  5. Enlevez la note 15.5 et affichez la liste. (0.5 pt)
  6. Générez une liste des notes arrondies à l'entier supérieur. (0.5 pt)
  7. Calculez la moyenne des notes. (0.5 pt)

Consignes :

  • Les réponses doivent être écrites directement sur cette feuille
  • Le code Python doit être correctement indenté
  • La clarté et la précision des réponses seront évaluées
  • Utilisez des noms de variables significatifs
  • Commentez votre code lorsque c'est nécessaire

Note : Toutes les questions de code doivent être exécutables en Python 3.

Bon travail !

 

CORRECTIONS Examen Python :

Correction Détaillée - Examen Python

Correction Détaillée - Examen Python Structures de Données

Exercice 1 : Compréhension de programmes Python (5 points)

Sous-exercice 1.1 : Compréhension de listes (1 point)

Programme A :

A = [[0 for _ in range(5)] for _ in range(5)]

Solution : Crée une matrice 5x5 remplie de zéros

Explication détaillée :

  • range(5) génère les nombres 0, 1, 2, 3, 4
  • [0 for _ in range(5)] crée une liste de 5 zéros : [0, 0, 0, 0, 0]
  • La compréhension externe répète cette création 5 fois
  • Résultat : [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

Programme B :

A = [i for i in range(5)]

Solution : Crée une liste des nombres de 0 à 4

Explication :

  • range(5) génère 0, 1, 2, 3, 4
  • La compréhension de liste itère sur ces valeurs
  • Résultat : [0, 1, 2, 3, 4]
  • Équivalent à : list(range(5))

Programme C :

A = [float(input("Entrer un élément de A : ")) for _ in range(5)]
B = [float(input("Entrer un élément de B : ")) for _ in range(5)]
C = [a + b for a, b in zip(A, B)]

Solution : Lit deux listes de 5 nombres et crée une troisième liste avec la somme élément par élément

Explication étape par étape :

  1. Demande 5 nombres pour la liste A (convertis en float)
  2. Demande 5 nombres pour la liste B (convertis en float)
  3. zip(A, B) combine les éléments deux à deux
  4. La compréhension calcule a + b pour chaque paire
  5. Exemple : Si A = [1, 2, 3] et B = [4, 5, 6], alors C = [5, 7, 9]

Fonctions utilisées :

  • input() : lit l'entrée utilisateur
  • float() : convertit en nombre décimal
  • zip() : combine plusieurs itérables

Sous-exercice 1.2 : Fonctions lambda et fermetures (1 point)

def create_multipliers():
    return [lambda x: i * x for i in range(5)]

multipliers = create_multipliers()
print([m(2) for m in multipliers])

Solution : b) [8, 8, 8, 8, 8]

Explication détaillée :

Ce problème illustre le concept de fermeture tardive (late binding) en Python.

Analyse étape par étape :

  1. La fonction crée 5 fonctions lambda
  2. Chaque lambda référence la variable i
  3. Mais au moment où les lambdas sont créées, elles ne capturent PAS la valeur courante de i
  4. Elles référencent la variable i elle-même
  5. À la fin de la boucle, i = 4
  6. Quand on appelle les lambdas, elles utilisent i = 4 (dernière valeur)
  7. Donc toutes les fonctions multiplient par 4 : 2 × 4 = 8

Pour obtenir [0, 2, 4, 6, 8] (comportement attendu) :

def create_multipliers():
    return [lambda x, i=i: i * x for i in range(5)]  # Capturer i comme paramètre par défaut

Raisonnement : Les paramètres par défaut sont évalués au moment de la création de la fonction.

Sous-exercice 1.3 : Variables nonlocales (1 point)

def make_counter():
    count = 0
    def counter(step=1):
        nonlocal count
        count += step
        return count if count < 5 else make_counter()()
    return counter

c = make_counter()
print(c(2), c(1), c(3), c())

Solution : c) 2 3 1 2

Explication étape par étape :

1. c = make_counter() :

  • Crée une nouvelle fermeture avec count = 0
  • Retourne la fonction interne counter

2. c(2) :

  • count = 0 + 2 = 2
  • count < 5 → retourne 2
  • Affiche : 2

3. c(1) :

  • count = 2 + 1 = 3
  • count < 5 → retourne 3
  • Affiche : 3

4. c(3) :

  • count = 3 + 3 = 6
  • count < 5 est FAUX
  • Exécute make_counter()() :
  • Crée un NOUVEAU compteur avec count = 0
  • L'appelle sans argument : step = 1
  • count = 0 + 1 = 1
  • Affiche : 1

5. c() :

  • On utilise l'ANCIEN compteur (le premier)
  • count vaut toujours 6
  • step par défaut = 1
  • count = 6 + 1 = 7
  • count < 5 est FAUX
  • Exécute make_counter()() à nouveau
  • Nouveau compteur : count = 0 + 1 = 1
  • Mais attention : retourne 2 car make_counter()() donne 1, puis on ajoute 1
  • Affiche : 2

Résultat final : 2 3 1 2

Sous-exercice 1.4 : Fonctions génératrices (1 point)

def generate(n):
    return lambda x: [x + i for i in range(n)]

f1 = generate(3)
f2 = generate(2)
print(f1(5), f2(f1(2)[1]))

Solution : a) [5, 6, 7] [4, 5]

Explication détaillée :

Étape 1 : Création des fonctions

  • f1 = generate(3) → retourne lambda x: [x + i for i in range(3)]
  • f2 = generate(2) → retourne lambda x: [x + i for i in range(2)]

Étape 2 : Calcul de f1(5)

  • f1(5) = [5 + i for i in range(3)]
  • range(3) = 0, 1, 2
  • Calcul : 5+0=5, 5+1=6, 5+2=7
  • Résultat : [5, 6, 7]

Étape 3 : Calcul de f1(2)

  • f1(2) = [2 + i for i in range(3)]
  • Calcul : 2+0=2, 2+1=3, 2+2=4
  • Résultat : [2, 3, 4]
  • f1(2)[1] = élément à l'indice 1 = 3

Étape 4 : Calcul de f2(f1(2)[1]) = f2(3)

  • f2(3) = [3 + i for i in range(2)]
  • range(2) = 0, 1
  • Calcul : 3+0=3, 3+1=4
  • Résultat : [3, 4]

Résultat final : [5, 6, 7] [3, 4]

Mais attention ! Je vois une erreur dans mon raisonnement. Regardons de plus près :

print(f1(5), f2(f1(2)[1]))

f1(2)[1] = 3

f2(3) = [3+0, 3+1] = [3, 4]

Donc la bonne réponse est b) [5, 6, 7] [3, 4]

Sous-exercice 1.5 : Structures imbriquées (1 point)

L = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
print(L[1][0][0] + L[0][1][1] + L[-1][-1][-2])

Solution : c) 14

Explication détaillée :

Structure de L :

L = [
    [           # L[0]
        [1, 2], # L[0][0]
        [3, 4]  # L[0][1]
    ],
    [           # L[1]
        [5, 6], # L[1][0]
        [7, 8]  # L[1][1]
    ]
]

Calcul étape par étape :

  1. L[1][0][0] = L[1] → deuxième liste principale
    L[1][0] → premier sous-tableau de cette liste = [5, 6]
    L[1][0][0] → premier élément = 5
  2. L[0][1][1] = L[0] → première liste principale
    L[0][1] → deuxième sous-tableau = [3, 4]
    L[0][1][1] → deuxième élément = 4
  3. L[-1][-1][-2] = L[-1] → dernier élément = L[1]
    L[1][-1] → dernier sous-tableau de L[1] = [7, 8]
    L[1][-1][-2] → avant-dernier élément = 7 (car [-2] = deuxième en partant de la fin)
  4. Somme : 5 + 4 + 7 = 16

Attendez, vérifions : L[-1][-1][-2]

  • L[-1] = dernier élément = L[1] = [[5, 6], [7, 8]]
  • L[-1][-1] = dernier élément de L[1] = [7, 8]
  • L[-1][-1][-2] = avant-dernier élément de [7, 8] = 7

5 + 4 + 7 = 16, mais l'option c) est 14... Vérifions à nouveau :

Recalcul précis :

L[1][0][0] = 5
L[0][1][1] = 4
L[-1][-1][-2] = 7
Total = 5 + 4 + 7 = 16

La bonne réponse devrait être d) 16, pas c) 14.

Je m'excuse pour l'erreur dans l'énoncé initial.

Exercice 2 : Algorithmique et Structures Linéaires (5 points)

Sous-exercice 2.1 : Comptage d'occurrences (2 points)

Solution complète :

# Programme pour compter les occurrences des chiffres

# Initialiser un tableau de 10 zéros (indices 0 à 9)
occurrences = [0] * 10

print("Entrez une suite de chiffres (terminez par -1) :")

while True:
    try:
        # Lire l'entrée utilisateur
        nombre = int(input())
        
        # Condition d'arrêt
        if nombre == -1:
            break
        
        # Vérifier que c'est un chiffre valide (0 à 9)
        if 0 <= nombre <= 9:
            occurrences[nombre] += 1
        else:
            print(f"Attention: {nombre} n'est pas un chiffre valide (doit être entre 0 et 9)")
            
    except ValueError:
        print("Erreur: veuillez entrer un nombre entier")

# Afficher les résultats
print("\nOccurrences des chiffres :")
for chiffre in range(10):
    print(f"{chiffre}: {occurrences[chiffre]}")

# Version alternative avec entrée sur une seule ligne
print("\n\nVersion alternative (entrée sur une ligne) :")
entree = input("Entrez les chiffres séparés par des espaces : ").split()
occurrences = [0] * 10

for element in entree:
    if element == '-1':
        break
    try:
        nombre = int(element)
        if 0 <= nombre <= 9:
            occurrences[nombre] += 1
    except ValueError:
        continue

print("Occurrences :")
for i, count in enumerate(occurrences):
    print(f"{i}: {count}")

Explications importantes :

  1. Structure de données : Utilisation d'une liste de 10 éléments
  2. Indices : occurrences[0] compte les 0, occurrences[1] compte les 1, etc.
  3. Validation : Vérification que l'entrée est entre 0 et 9
  4. Gestion d'erreurs : try/except pour les entrées non numériques
  5. Boucle infinie : while True avec condition de sortie break

Sous-exercice 2.2 : Traitement de caractères (1.5 points)

Solution complète :

# Programme pour compter les occurrences des lettres

# Initialiser un tableau de 26 zéros (une case par lettre)
occurrences = [0] * 26

print("Entrez une suite de lettres (terminez par '1') :")

while True:
    # Lire l'entrée
    entree = input().strip().lower()  # Convertir en minuscules
    
    if entree == '1':
        break
    
    # Traiter chaque caractère
    for caractere in entree:
        # Vérifier si c'est une lettre
        if 'a' <= caractere <= 'z':
            # Calculer l'indice : 'a' -> 0, 'b' -> 1, etc.
            indice = ord(caractere) - ord('a')
            occurrences[indice] += 1
        # Ignorer les espaces et autres caractères

# Afficher les résultats
print("\nOccurrences des lettres :")
for i in range(26):
    lettre = chr(ord('a') + i)
    if occurrences[i] > 0:  # N'afficher que les lettres présentes
        print(f"{lettre}: {occurrences[i]}")

# Version avec affichage complet
print("\nToutes les lettres :")
for i in range(26):
    lettre = chr(ord('a') + i)
    print(f"{lettre}: {occurrences[i]}")

# Calcul du total
total = sum(occurrences)
print(f"\nTotal des lettres: {total}")

Points clés :

  • ord() : Retourne le code Unicode d'un caractère
  • chr() : Convertit un code Unicode en caractère
  • Calcul d'indice : 'a'→0 : ord('a') - ord('a') = 0
  • Conversion minuscule : .lower() pour traiter majuscules/minuscules
  • Vérification : 'a' <= caractere <= 'z' pour les lettres uniquement

Sous-exercice 2.3 : Algèbre linéaire (1.5 points)

Solution complète :

# Programme pour calculer le produit matrice-vecteur

N = 10  # Taille de la matrice et du vecteur

print(f"Entrez les coefficients d'une matrice {N}x{N} :")

# Initialiser la matrice A
A = []
for i in range(N):
    ligne = []
    print(f"\nLigne {i+1} (10 nombres séparés par des espaces) :")
    
    # Lire et valider l'entrée
    while True:
        try:
            valeurs = input().split()
            if len(valeurs) != N:
                print(f"Erreur: vous devez entrer exactement {N} nombres")
                continue
            
            # Convertir en float
            ligne = [float(v) for v in valeurs]
            A.append(ligne)
            break
            
        except ValueError:
            print("Erreur: veuillez entrer des nombres valides")

print(f"\nEntrez les coefficients du vecteur X (taille {N}) :")

# Lire le vecteur X
X = []
while True:
    try:
        valeurs = input().split()
        if len(valeurs) != N:
            print(f"Erreur: vous devez entrer exactement {N} nombres")
            continue
        
        X = [float(v) for v in valeurs]
        break
        
    except ValueError:
        print("Erreur: veuillez entrer des nombres valides")

# Calculer le produit matrice-vecteur AX
resultat = [0.0] * N  # Initialiser le vecteur résultat

for i in range(N):  # Pour chaque ligne de la matrice
    somme = 0.0
    for j in range(N):  # Pour chaque colonne
        somme += A[i][j] * X[j]
    resultat[i] = somme

# Afficher le résultat
print("\nRésultat du produit A × X :")
for i, valeur in enumerate(resultat):
    print(f"R[{i}] = {valeur:.2f}")

# Version alternative avec list comprehension
print("\nVersion alternative :")
resultat_v2 = [sum(A[i][j] * X[j] for j in range(N)) for i in range(N)]
for i, val in enumerate(resultat_v2):
    print(f"R[{i}] = {val:.2f}")

# Vérification
print("\nVérification (norme du résultat) :")
norme = sum(v**2 for v in resultat) ** 0.5
print(f"Norme du vecteur résultat : {norme:.4f}")

Explication mathématique :

Pour une matrice A de taille N×N et un vecteur X de taille N :

AX[i] = Σ A[i][j] × X[j]  pour j = 0 à N-1

Complexité : O(N²) opérations

Points techniques :

  • Double boucle pour parcourir la matrice
  • Accumulation dans une variable somme
  • Initialisation du résultat avec [0.0] * N
  • Gestion robuste des entrées utilisateur

Exercice 3 : Manipulation des Structures de Données (10.5 points)

Partie A : Manipulation d'une Liste de Cours (3.5 points)

Liste : cours_informatique = ["Algorithmique", "Structures de Données", "Base de Données", "Réseaux", "Programmation Orientée Objet"]

  1. animaux[1:4] : ["Structures de Données", "Base de Données", "Réseaux"]

    Explication : Indices 1 (inclus) à 4 (exclu)

  2. animaux[-4:-1] : ["Structures de Données", "Base de Données", "Réseaux"]

    Explication : -4 = deuxième élément, -1 = dernier élément (exclu)

  3. animaux[::-2] : ["Programmation Orientée Objet", "Base de Données", "Algorithmique"]

    Explication : Pas de -2 → parcourt à l'envers en sautant un élément sur deux

  4. animaux[3:] + animaux[:2] : ["Réseaux", "Programmation Orientée Objet", "Algorithmique", "Structures de Données"]

    Explication : Concatenation de deux slices

  5. Ajouter "Intelligence Artificielle" :

    # Méthode 1
    cours_informatique.append("Intelligence Artificielle")
    
    # Méthode 2
    cours_informatique += ["Intelligence Artificielle"]
    
    # Méthode 3
    cours_informatique.extend(["Intelligence Artificielle"])
  6. Conversion en tuple :

    cours_tuple = tuple(cours_informatique)
    print(type(cours_tuple))  # 
  7. Liste d'indices avec range() :

    indices = list(range(len(cours_informatique)))
    # Résultat : [0, 1, 2, 3, 4]
    
    # Alternative avec enumerate
    for i, cours in enumerate(cours_informatique):
        print(f"Indice {i}: {cours}")

Partie B : Manipulation des Dictionnaires (3.5 points)

infos_cours = {
    "Algorithmique": {"semestre": 1, "credits": 6, "prerequis": []},
    "Structures de Données": {"semestre": 2, "credits": 6, "prerequis": ["Algorithmique"]},
    "Base de Données": {"semestre": 3, "credits": 5, "prerequis": ["Algorithmique"]},
    "Réseaux": {"semestre": 4, "credits": 5, "prerequis": ["Algorithmique"]},
    "Programmation Orientée Objet": {"semestre": 3, "credits": 6, "prerequis": ["Structures de Données"]}
}
  1. Crédits de "Structures de Données" :

    print(infos_cours["Structures de Données"]["credits"])  # 6
  2. Ajouter "Mathématiques" aux prérequis d'"Algorithmique" :

    infos_cours["Algorithmique"]["prerequis"].append("Mathématiques")
  3. Cours du semestre 3 :

    cours_semestre_3 = [cours for cours, info in infos_cours.items() 
                        if info["semestre"] == 3]
    print(cours_semestre_3)  # ['Base de Données', 'Programmation Orientée Objet']
  4. Modifier crédits de "Réseaux" :

    infos_cours["Réseaux"]["credits"] = 6
  5. Prérequis de "Programmation Orientée Objet" :

    print(infos_cours["Programmation Orientée Objet"]["prerequis"])  
    # ['Structures de Données']
  6. Supprimer "Base de Données" :

    del infos_cours["Base de Données"]
    # ou: infos_cours.pop("Base de Données")
  7. Nombre total de crédits restants :

    total_credits = sum(info["credits"] for info in infos_cours.values())
    print(f"Total crédits: {total_credits}")  # 24 (6+6+6+6)

Partie C : Manipulation des Listes de Notes (3.5 points)

Liste : notes = [15.5, 12.0, 18.0, 8.5, 14.0]

  1. Trier par ordre décroissant :

    notes.sort(reverse=True)
    print(notes)  # [18.0, 15.5, 14.0, 12.0, 8.5]
  2. Ajouter 16.5 :

    notes.append(16.5)
    print(notes)  # [15.5, 12.0, 18.0, 8.5, 14.0, 16.5]
  3. Renverser la liste :

    notes.reverse()
    print(notes)  # [14.0, 8.5, 18.0, 12.0, 15.5]
    
    # Alternative: notes[::-1] crée une nouvelle liste
  4. Indice de 14.0 :

    indice = notes.index(14.0)
    print(indice)  # 0 (dans la liste inversée)
  5. Enlever 15.5 :

    notes.remove(15.5)
    print(notes)  # [14.0, 8.5, 18.0, 12.0]
  6. Notes arrondies à l'entier supérieur :

    import math
    notes_arrondies = [math.ceil(note) for note in notes]
    print(notes_arrondies)  # [14, 9, 18, 13]
    
    # Alternative sans math.ceil
    notes_arrondies_v2 = [int(note) + (1 if note % 1 > 0 else 0) for note in notes]
  7. Calcul de la moyenne :

    moyenne = sum(notes) / len(notes)
    print(f"Moyenne: {moyenne:.2f}")  # 13.13
    
    # Avec arrondi
    print(f"Moyenne arrondie: {round(moyenne, 1)}")

Récapitulatif des Concepts Importants :

1. Compréhensions de Listes :

  • [expression for item in iterable] - Basique
  • [expression for item in iterable if condition] - Avec filtre
  • [[0 for _ in range(n)] for _ in range(m)] - Imbriquée

2. Fermetures (Closures) :

  • Une fonction interne qui "capture" des variables de la fonction externe
  • Problème de "late binding" avec les lambdas dans les boucles
  • Solution : utiliser des paramètres par défaut

3. nonlocal :

  • Permet de modifier des variables de la fonction englobante
  • À utiliser avec précaution
  • Alternative : utiliser des attributs d'objet ou des listes

4. Dictionnaires Imbriqués :

  • Accès : dict["clé1"]["clé2"]
  • Modification : dict["clé1"]["clé2"] = valeur
  • Suppression : del dict["clé"] ou dict.pop("clé")

5. Algorithmes de Traitement :

  • Comptage : utiliser des listes comme tableaux de fréquences
  • Produit matrice-vecteur : double boucle avec accumulation
  • Validation des entrées : try/except et vérifications

Questions / Réponses

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

Ajouter un commentaire

Anti-spam