Examen Python 14

EXAMEN EN PYTHON SUJET 14

EXAMEN — Python — Listes et Dictionnaires

 

Partie 1 : Les Listes — Le Sac à Dos

Exercice 1 : Créer et manipuler une liste

Énoncé : Analysez ce code :

# Création de l'inventaire inventaire = ["épée", "bouclier", "potion", "clé", "torche"] print("Inventaire :", inventaire) print("Nombre d'objets :", len(inventaire)) print("Premier objet :", inventaire[0]) print("Dernier objet :", inventaire[-1])

a) Qu'affiche ce programme ? Écrivez chaque ligne de sortie :

Correction :

Inventaire : ['épée', 'bouclier', 'potion', 'clé', 'torche'] Nombre d'objets : 5 Premier objet : épée Dernier objet : torche

Explication :

  • len(inventaire) retourne 5 car la liste contient 5 éléments
  • inventaire[0] accède au premier élément (indice 0 = "épée")
  • inventaire[-1] accède au dernier élément (indice -1 = "torche")

b) Que vaut inventaire[2] ? Et inventaire[-2] ?

Correction :

inventaire[2] = "potion"

inventaire[-2] = "clé"

Explication :

  • Les indices positifs commencent à 0 : 0="épée", 1="bouclier", 2="potion"
  • Les indices négatifs partent de la fin : -1="torche", -2="clé", -3="potion"

c) Que se passe-t-il si on écrit inventaire[10] ?

Correction : On obtient une IndexError (erreur d'indice).

Message d'erreur : IndexError: list index out of range

Explication : La liste n'a que 5 éléments (indices 0 à 4), donc l'indice 10 n'existe pas.

Pour éviter cela :

if 10 < len(inventaire): print(inventaire[10]) else: print("Indice invalide !")

Exercice 2 : Modifier l'inventaire

Énoncé : Python offre plusieurs méthodes pour modifier une liste :

inventaire = ["épée", "bouclier", "potion"] # Ajouter un objet à la fin inventaire.append("arc") print(inventaire) # ['épée', 'bouclier', 'potion', 'arc'] # Insérer à une position précise inventaire.insert(1, "casque") print(inventaire) # ['épée', 'casque', 'bouclier', 'potion', 'arc'] # Supprimer par valeur inventaire.remove("potion") # Supprimer par indice et récupérer l'objet objet = inventaire.pop(0) print("Objet retiré :", objet)

a) Après toutes ces opérations, que contient inventaire ?

Correction :

inventaire = ['casque', 'bouclier', 'arc']

Explication étape par étape :

  1. Départ : ["épée", "bouclier", "potion"]
  2. append("arc")["épée", "bouclier", "potion", "arc"]
  3. insert(1, "casque")["épée", "casque", "bouclier", "potion", "arc"]
  4. remove("potion")["épée", "casque", "bouclier", "arc"]
  5. pop(0) → retire "épée" → ["casque", "bouclier", "arc"]

b) Quelle est la différence entre remove() et pop() ?

Correction :

remove(valeur) : Supprime la première occurrence d'une valeur spécifiée. Ne retourne rien.

pop(indice) : Supprime l'élément à un indice spécifique et retourne sa valeur.

Exemples :

# remove() - par valeur liste = [1, 2, 3, 2] liste.remove(2) # Supprime le premier 2 print(liste) # [1, 3, 2] # pop() - par indice liste = [1, 2, 3] element = liste.pop(1) # Supprime l'élément à l'indice 1 print(element) # 2 print(liste) # [1, 3] # pop() sans paramètre supprime le dernier dernier = liste.pop() print(dernier) # 3 print(liste) # [1]

c) Écrivez le code pour : créer une liste vide, y ajouter "pomme", "pain", "fromage", puis retirer "pain" :

Correction :

# Création d'une liste vide liste_courses = [] # Ajout des éléments liste_courses.append("pomme") liste_courses.append("pain") liste_courses.append("fromage") print("Avant :", liste_courses) # ['pomme', 'pain', 'fromage'] # Retirer "pain" liste_courses.remove("pain") print("Après :", liste_courses) # ['pomme', 'fromage']

Alternative avec pop() :

liste_courses = ["pomme", "pain", "fromage"] liste_courses.pop(1) # Retire l'élément à l'indice 1 ("pain")

Partie 2 : Parcourir une Liste — Fouiller le Sac

Exercice 3 : La boucle for

Énoncé :

inventaire = ["épée", "bouclier", "potion", "arc", "flèches"] # Parcourir les éléments print("=== Contenu du sac ===") for objet in inventaire: print("- " + objet) # Parcourir avec les indices print("=== Avec positions ===") for i in range(len(inventaire)): print(f"Position {i} : {inventaire[i]}")

a) Quelle est la différence entre les deux façons de parcourir ?

Correction :

  • Première méthode : for objet in inventaire parcourt directement les valeurs
  • Deuxième méthode : for i in range(len(inventaire)) parcourt les indices

Quand utiliser laquelle :

  • Utiliser la première quand on n'a besoin que des valeurs
  • Utiliser la seconde quand on a besoin des indices (pour modifier ou connaître la position)

Alternative moderne : for i, objet in enumerate(inventaire) combine les deux

b) Écrivez une fonction compter_potions(inventaire) qui compte combien de "potion" sont dans la liste :

Correction :

def compter_potions(inventaire): compteur = 0 for objet in inventaire: if objet == "potion": compteur += 1 return compteur # Test sac = ["potion", "épée", "potion", "bouclier", "potion"] print("Nombre de potions :", compter_potions(sac)) # 3

Version courte :

def compter_potions(inventaire): return inventaire.count("potion")

c) Écrivez une fonction rechercher(inventaire, objet) qui retourne True si l'objet est présent, False sinon :

Correction :

def rechercher(inventaire, objet_cherche): for objet in inventaire: if objet == objet_cherche: return True return False # Test sac = ["épée", "bouclier", "potion"] print("Épée présente ?", rechercher(sac, "épée")) # True print("Arc présent ?", rechercher(sac, "arc")) # False

Version courte :

def rechercher(inventaire, objet_cherche): return objet_cherche in inventaire

Partie 3 : Les Dictionnaires — Fiche d'Objet

Exercice 4 : Créer et accéder à un dictionnaire

Énoncé : Un dictionnaire associe des clés à des valeurs :

# Fiche d'une épée epee = { "nom": "Épée de feu", "degats": 25, "prix": 150, "rare": True } print("Nom :", epee["nom"]) print("Dégâts :", epee["degats"]) print("Clés :", epee.keys()) print("Valeurs :", epee.values())

a) Quels sont les types des valeurs dans ce dictionnaire ?

Correction :

  • "nom" : str (chaîne de caractères)
  • "degats" : int (nombre entier)
  • "prix" : int (nombre entier)
  • "rare" : bool (booléen)

b) Créez un dictionnaire pour une "Potion de soin" (soin: 50, prix: 25, quantite: 3) :

Correction :

potion = { "nom": "Potion de soin", "soin": 50, "prix": 25, "quantite": 3 } # Affichage print("=== FICHE POTION ===") print("Nom :", potion["nom"]) print("Soin :", potion["soin"]) print("Prix :", potion["prix"]) print("Quantité :", potion["quantite"])

c) Comment ajouter une nouvelle clé "poids" avec la valeur 5 à l'épée ?

Correction :

epee["poids"] = 5 # Vérification print(epee) # {'nom': 'Épée de feu', 'degats': 25, 'prix': 150, 'rare': True, 'poids': 5}

Note : Si la clé existe déjà, sa valeur sera remplacée.

Exercice 5 : Parcourir un dictionnaire

Énoncé :

personnage = { "nom": "Aria", "classe": "Guerrière", "niveau": 12, "pv": 150, "force": 18 } # Parcourir clés et valeurs for cle, valeur in personnage.items(): print(f"{cle} : {valeur}")

a) Écrivez une fonction afficher_stats(perso) qui affiche joliment toutes les statistiques :

Correction :

def afficher_stats(perso): print("=== STATISTIQUES ===") for cle, valeur in perso.items(): cle_formatee = cle.capitalize() # Première lettre en majuscule print(f"{cle_formatee} : {valeur}") # Test personnage = {"nom": "Aria", "classe": "Guerrière", "niveau": 12} afficher_stats(personnage)

b) Écrivez une fonction augmenter_stat(perso, stat, valeur) qui augmente une statistique :

Correction :

def augmenter_stat(perso, stat, valeur): if stat in perso: perso[stat] += valeur print(f"{stat} augmenté de {valeur}") else: print(f"Statistique '{stat}' inexistante") # Test joueur = {"pv": 100, "force": 15} augmenter_stat(joueur, "pv", 20) print("PV après augmentation :", joueur["pv"]) # 120

Partie 4 : Combiner Listes et Dictionnaires

Exercice 6 : L'inventaire complet

Énoncé : Un vrai inventaire contient des objets détaillés :

inventaire = [ {"nom": "Épée", "type": "arme", "valeur": 100}, {"nom": "Potion", "type": "consommable", "valeur": 25}, {"nom": "Bouclier", "type": "armure", "valeur": 75}, {"nom": "Potion", "type": "consommable", "valeur": 25} ] # Accéder au nom du premier objet print(inventaire[0]["nom"]) # Épée

a) Que vaut inventaire[2]["type"] ?

Correction : "armure"

Explication :

  • inventaire[2] accède au 3ème élément (indice 2)
  • C'est le dictionnaire {"nom": "Bouclier", "type": "armure", "valeur": 75}
  • inventaire[2]["type"] accède à la valeur de la clé "type" → "armure"

b) Écrivez une fonction valeur_totale(inventaire) qui calcule la somme des valeurs :

Correction :

def valeur_totale(inventaire): total = 0 for objet in inventaire: total += objet["valeur"] return total # Test inventaire_test = [ {"nom": "Épée", "valeur": 100}, {"nom": "Potion", "valeur": 25}, {"nom": "Bouclier", "valeur": 75} ] print("Valeur totale :", valeur_totale(inventaire_test)) # 200

Version courte :

def valeur_totale(inventaire): return sum(objet["valeur"] for objet in inventaire)

c) Écrivez une fonction trouver_par_type(inventaire, type_obj) qui retourne la liste des objets d'un type donné :

Correction :

def trouver_par_type(inventaire, type_cherche): resultats = [] for objet in inventaire: if objet["type"] == type_cherche: resultats.append(objet) return resultats # Test inventaire_complet = [ {"nom": "Épée", "type": "arme", "valeur": 100}, {"nom": "Potion", "type": "consommable", "valeur": 25}, {"nom": "Arc", "type": "arme", "valeur": 80} ] armes = trouver_par_type(inventaire_complet, "arme") print("Armes trouvées :", armes) # [{'nom': 'Épée', 'type': 'arme', 'valeur': 100}, # {'nom': 'Arc', 'type': 'arme', 'valeur': 80}]

Défi Final : Le Marchand

Mission : Créer un système de marchand complet

Énoncé : Créez un système de marchand avec :

  • Un stock (liste de dictionnaires avec nom, prix, quantité)
  • Une fonction acheter(stock, inventaire, or, nom_objet)
  • Une fonction vendre(stock, inventaire, or, nom_objet)
  • Une fonction afficher_stock(stock) joliment formatée

Correction du Défi Final : Le Marchand

1. Structure initiale :

# Stock du marchand stock = [ {"nom": "Épée courte", "prix": 50, "quantite": 3}, {"nom": "Potion de soin", "prix": 20, "quantite": 10}, {"nom": "Bouclier de bois", "prix": 30, "quantite": 5} ] # État initial du joueur inventaire_joueur = [] or_joueur = 100

2. Fonction afficher_stock() :

def afficher_stock(stock): print("\n=== BOUTIQUE ===") for i, article in enumerate(stock, 1): print(f"{i}. {article['nom']:<20} {article['prix']:>3} pièces " f"({article['quantite']} disponible(s))")

3. Fonction acheter() :

def acheter(stock, inventaire, or_disponible, nom_objet): # Chercher l'article article = None for a in stock: if a["nom"] == nom_objet: article = a break if article is None: return or_disponible, "❌ Cet objet n'est pas en vente." if article["quantite"] <= 0: return or_disponible, "❌ Cet objet est en rupture de stock." if or_disponible < article["prix"]: return or_disponible, f"❌ Pas assez d'or ! Il vous manque {article['prix'] - or_disponible} pièces." # Transaction réussie article["quantite"] -= 1 inventaire.append(nom_objet) nouvel_or = or_disponible - article["prix"] return nouvel_or, f"✅ Achat réussi ! Vous avez acheté '{nom_objet}'."

4. Fonction vendre() :

def vendre(stock, inventaire, or_disponible, nom_objet): # Vérifier si le joueur possède l'objet if nom_objet not in inventaire: return or_disponible, "❌ Vous ne possédez pas cet objet." # Chercher l'article dans le stock article = None for a in stock: if a["nom"] == nom_objet: article = a break # Prix de vente (50% du prix d'achat si l'article existe, sinon prix fixe) if article: prix_vente = article["prix"] // 2 article["quantite"] += 1 else: prix_vente = 10 # Prix pour les objets spéciaux # Transaction inventaire.remove(nom_objet) nouvel_or = or_disponible + prix_vente return nouvel_or, f"✅ Vente réussie ! '{nom_objet}' vendu pour {prix_vente} pièces."

5. Programme principal :

def simulation_marchand(): print("?‍♂️ BIENVENUE CHEZ LE MARCHAND ?‍♂️") stock = [ {"nom": "Épée courte", "prix": 50, "quantite": 3}, {"nom": "Potion de soin", "prix": 20, "quantite": 10}, {"nom": "Bouclier de bois", "prix": 30, "quantite": 5} ] inventaire = [] or_joueur = 80 while True: print(f"\n? Votre or : {or_joueur} pièces") print("? Votre inventaire :", inventaire) print("\n1. Voir le stock") print("2. Acheter un objet") print("3. Vendre un objet") print("4. Quitter") choix = input("Votre choix (1-4) : ") if choix == "1": afficher_stock(stock) elif choix == "2": afficher_stock(stock) nom = input("\nNom de l'objet à acheter : ") or_joueur, message = acheter(stock, inventaire, or_joueur, nom) print(message) elif choix == "3": if inventaire: print("\nVous pouvez vendre :", inventaire) nom = input("Nom de l'objet à vendre : ") or_joueur, message = vendre(stock, inventaire, or_joueur, nom) print(message) else: print("❌ Votre inventaire est vide !") elif choix == "4": print("? Au revoir !") break else: print("❌ Choix invalide !") # Pour tester if __name__ == "__main__": simulation_marchand()
 

Questions / Réponses

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

Ajouter un commentaire

Anti-spam