Fondations Python
Variables · Types · Arithmétique · Input/Output · Strings
Introduction à Python
Python est un langage de programmation polyvalent, lisible et puissant. Utilisé par Google, Netflix, NASA, Instagram — Python est aujourd'hui le langage #1 en Data Science et IA.
# Mon premier programme Python ! print("Hello DIAM!") print("Bienvenue dans le monde de Python") print("=" * 40) # Exécution : python hello.py
Créez un script qui affiche votre profil développeur : nom, ville, objectif avec Python, le tout formaté avec des lignes de séparation.
Variables et Types de Données
Une variable est comme une boîte étiquetée qui stocke une information.
| Type | Description | Exemple |
|---|---|---|
int | Nombre entier | 42, -10, 0 |
float | Nombre décimal | 3.14, -0.5 |
str | Texte | "Python", 'DIAM' |
bool | Vrai / Faux | True, False |
nom = "Alice" # str age = 25 # int taille = 1.75 # float est_etudiant= True # bool print(nom) # Alice print(type(nom)) # <class 'str'> print(f"Prénom : {nom}, Âge : {age} ans")
Déclarez 6 variables avec vos infos (prénom, nom, âge, ville, taille, est_etudiant) et affichez-les avec des f-strings.
Pour chaque variable (10, 3.14, "Python", True, "123"), affichez son type. Question : quelle différence entre 10 et "123" ?
Opérations Arithmétiques
a, b = 10, 3 print(f"{a} + {b} = {a + b}") # 13 print(f"{a} - {b} = {a - b}") # 7 print(f"{a} × {b} = {a * b}") # 30 print(f"{a} / {b} = {a / b}") # 3.333... print(f"{a} // {b} = {a // b}") # 3 (division entière) print(f"{a} % {b} = {a % b}") # 1 (reste) print(f"{a} ^ {b} = {a ** b}") # 1000 (puissance)
Déclarez deux nombres et affichez toutes les opérations : +, -, ×, /, //, %, **.
Calculez : aire d'un rectangle (12×5), aire d'un cercle (r=7, π=3.14159), conversion 25°C en Fahrenheit (F = C×9/5 + 32).
Interaction avec l'Utilisateur
input() retourne TOUJOURS une str. Convertissez avec int() ou float() si nécessaire.nom = input("Votre nom : ") print(f"Bonjour {nom} !") # Convertir en entier directement age = int(input("Votre âge : ")) taille = float(input("Taille (m) : "))
Demandez deux nombres → affichez leur somme, différence, produit et quotient.
Demandez l'âge → calculez et affichez l'année de naissance (2025 - age).
1 km = 0.621371 miles. Demandez une distance en km → affichez l'équivalent en miles (2 décimales).
Manipulation de Chaînes de Caractères
texte = " Python est Génial " print(texte.upper()) # " PYTHON EST GÉNIAL " print(texte.lower()) # " python est génial " print(texte.strip()) # "Python est Génial" print(texte.replace("Génial", "Super")) # Slicing mot = "Python" print(mot[0]) # P print(mot[-1]) # n print(mot[0:3]) # Pyt print(mot[::-1]) # nohtyP # F-Strings (méthode recommandée) nom, age = "Alice", 25 print(f"{nom} a {age} ans") print(f"Pi : {3.14159:.2f}") # 3.14 print(f"{1000000:,}") # 1,000,000
Partez de " PYTHON EST PUISSANT " : supprimez espaces, mettez en minuscules, capitalisez, comptez les 'P', remplacez "PUISSANT" par "GÉNIAL".
Demandez prénom + nom → formatez (Prénom en Title Case, NOM en majuscules) → générez initiales et email prenom.nom@diam.ga.
mot = input("Entrez un mot : ").lower() mot_inverse = mot[::-1] print(f"Mot : {mot}") print(f"Inversé : {mot_inverse}") print(f"Palindrome : {mot == mot_inverse}")
f-strings# ============================================ # MINI-PROJET JOUR 1 : PROFIL PERSONNEL # Club DIAM - Bootcamp Python # ============================================ print("=" * 60) print(" " * 15 + "CALCULATRICE DE PROFIL DIAM") print("=" * 60) prenom = input("Prénom : ").strip().capitalize() nom = input("Nom : ").strip().upper() age = int(input("Âge : ")) taille_cm = float(input("Taille (cm) : ")) poids = float(input("Poids (kg) : ")) ville = input("Ville : ").strip().title() annee_naissance = 2025 - age taille_m = taille_cm / 100 imc = poids / (taille_m ** 2) initiales = f"{prenom[0]}.{nom[0]}." email = f"{prenom.lower()}.{nom.lower()}@diam.ga" if imc < 18.5: cat = "Insuffisance pondérale ⚠️" elif imc < 25: cat = "Poids normal ✅" elif imc < 30: cat = "Surpoids ⚠️" else: cat = "Obésité 🔴" print(f"\n{'='*60}") print(f"{'NOM COMPLET':<25} : {prenom} {nom}") print(f"{'INITIALES':<25} : {initiales}") print(f"{'ÂGE':<25} : {age} ans ({annee_naissance})") print(f"{'IMC':<25} : {imc:.1f} — {cat}") print(f"{'EMAIL':<25} : {email}") print(f"{'='*60}")
Demandez distance en km, température en °C, poids en kg → Convertissez en miles, °F et livres. (Miles=km×0.621, F=C×9/5+32, Livres=kg×2.205)
Prix HT + quantité + TVA 18% → Affichez une facture formatée avec sous-total, TVA et total TTC.
Nom, profession, téléphone, email → Générez une carte de visite encadrée avec ╔ ║ ╚.
Structures de Contrôle
if/elif/else · Opérateurs logiques · Boucles while · for · break/continue
Conditions — IF / ELIF / ELSE
note = 15 if note >= 16: print("Très Bien") elif note >= 14: print("Bien") elif note >= 12: print("Assez Bien") elif note >= 10: print("Passable") else: print("Insuffisant") # Opérateurs logiques : and, or, not age, permis = 20, True if age >= 18 and permis: print("✓ Vous pouvez conduire")
Âge invalide / mineur (+ années restantes) / majeur — 3 cas différents.
Note /20 → mention correspondante avec validation (0-20).
≥100000 → 20% / ≥50000 → 15% / ≥20000 → 10% / sinon 0%. Affichez montant initial, réduction, total final.
Règle : divisible par 4 MAIS pas par 100, SAUF si divisible par 400. Utilisez %.
Utilisez random.choice() pour l'ordinateur. Déterminez le gagnant avec if/elif/else.
Boucles WHILE
# Boucle infinie + break while True: rep = input("Continuer ? (o/n) : ") if rep.lower() == 'n': break print("On continue !") # Continue : sauter à l'itération suivante n = 0 while n < 10: n += 1 if n % 2 == 0: continue # Saute les pairs print(n) # 1,3,5,7,9
Redemandez un âge valide (0-120) tant que l'entrée est invalide. Utilisez isdigit().
L'ordi choisit entre 1 et 100. Donnez des indices "Plus grand / Plus petit" et comptez les tentatives.
4 options : afficher message / calculer carré / compter jusqu'à 10 / quitter. Boucle infinie + break.
Boucles FOR & range()
for i in range(5): # 0,1,2,3,4 print(i) for i in range(1, 6): # 1,2,3,4,5 print(i) for i in range(0, 10, 2): # 0,2,4,6,8 print(i) for i in range(10, 0, -1): # 10,9,...,1 print(i) for lettre in "DIAM": # D I A M print(lettre)
Demandez un nombre → affichez sa table de 1 à 10, formatée proprement.
Calculez N! avec une boucle for. Ex: 5! = 5×4×3×2×1 = 120.
h = int(input("Hauteur : ")) for i in range(1, h + 1): print(" " * (h - i) + "*" * (2 * i - 1)) # Sortie pour h=5 : # * # *** # ***** # ******* # *********
1 à 100 : divisible par 3 ET 5 → FizzBuzz / par 3 → Fizz / par 5 → Buzz / sinon le nombre.
_Fonctions
def · Paramètres · return · Scope · Lambda · *args/**kwargs · Docstrings
defreturnBases des Fonctions
# Fonction simple def dire_bonjour(): print("Bonjour du club DIAM !") dire_bonjour() # Avec paramètre + return def calculer_carre(nombre): """Retourne le carré d'un nombre.""" return nombre ** 2 print(calculer_carre(5)) # 25 # *args : nombre variable d'arguments def calculer_somme(*nombres): return sum(nombres) print(calculer_somme(1, 2, 3)) # 6 print(calculer_somme(10, 20, 30, 40)) # 100 # Valeur par défaut def saluer(nom, message="Bonjour"): print(f"{message} {nom} !") saluer("Alice") # Bonjour Alice ! saluer("Bob", "Bonsoir") # Bonsoir Bob !
4 fonctions : additionner, soustraire, multiplier, diviser. La division gère le cas /0.
calculer_moyenne(*notes) — accepte n'importe combien de notes, gère le cas vide.
Vérifiez : ≥8 chars, ≥1 majuscule, ≥1 minuscule, ≥1 chiffre. Retourne True/False.
fibonacci(n) → retourne les n premiers termes. Ex: fibonacci(10) → [0,1,1,2,3,5,8,13,21,34].
Lambda, map() et filter()
carre = lambda x: x ** 2 addition = lambda a, b: a + b print(carre(5)) # 25 nombres = [1, 2, 3, 4, 5] carres = list(map(lambda x: x**2, nombres)) print(carres) # [1, 4, 9, 16, 25] pairs = list(filter(lambda x: x%2==0, nombres)) print(pairs) # [2, 4]
ajouter_note() avec validation 0-20calculer_moyenne() et calculer_mediane()trouver_min_max()determiner_mention()supprimer_note() par indexListes & Tuples
Listes · Méthodes · Slicing · List Comprehensions · Matrices 2D · Tuples
Listes — Bases & Méthodes
fruits = ["pomme", "banane", "orange"] fruits.append("kiwi") # Ajouter à la fin fruits.insert(1, "mangue") # Insérer à l'index 1 fruits.remove("banane") # Supprimer par valeur dernier = fruits.pop() # Supprimer + retourner le dernier fruits.sort() # Tri croissant print(len(fruits)) # Longueur print("pomme" in fruits) # True/False print(sum([1,2,3])) # 6 print(max([10,5,8])) # 10
Liste de 5 articles → insérez "Lait" en position 1 → supprimez le 3ème → vérifiez si "Eau" est dedans.
Liste [12, 5, 23, 7, 15, 8, 30, 4] → triez, trouvez max/min, calculez somme et moyenne.
Slicing & List Comprehensions
n = [0,1,2,3,4,5,6,7,8,9] print(n[2:7]) # [2, 3, 4, 5, 6] print(n[:5]) # [0, 1, 2, 3, 4] print(n[::2]) # [0, 2, 4, 6, 8] print(n[::-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] print(n[-3:]) # [7, 8, 9] # List Comprehension carres = [x**2 for x in range(5)] # [0,1,4,9,16] pairs = [x for x in range(10) if x%2==0] # [0,2,4,6,8] majusc = [m.upper() for m in ["diam", "ia"]] # ['DIAM','IA']
Créez : carrés de 0-9 / multiples de 3 jusqu'à 30 / conversion ["1","2","3"] en [1,2,3] / liste de booléens (>5).
Tuples & Unpacking
# Unpacking coord = (10, 20) x, y = coord person = ("Alice", 25, "Libreville") nom, age, ville = person # Extended unpacking premier, *milieu, dernier = (1, 2, 3, 4, 5) # Échange pythonique (sans variable temp) a, b = 5, 10 a, b = b, a # Magie Python ! print(a, b) # 10 5
calculer_stats_liste(nombres) → retourne (min, max, somme, moyenne) sous forme de tuple.
[description, priorité, terminée]Dictionnaires & Sets
Paires clé-valeur · Méthodes · Dicts imbriqués · Dict Comprehensions · Ensembles
Dictionnaires — Bases & Méthodes
etudiant = { "nom" : "Dupont", "age" : 22, "notes" : [15, 18, 16] } print(etudiant["nom"]) print(etudiant.get("email", "N/A")) # N/A (pas d'erreur) # Parcourir les paires for cle, val in etudiant.items(): print(f"{cle} : {val}") # Dict comprehension carres = {x: x**2 for x in range(6)} # {0:0, 1:1, 2:4, 3:9, 4:16, 5:25} # Filtrer avec comprehension notes = {"Alice":15, "Bob":8, "Charlie":18} admis = {n: note for n, note in notes.items() if note >= 10}
Comptez les occurrences de chaque mot dans une phrase. Utilisez dict.get(mot, 0) + 1.
Sets — Ensembles
A = {1,2,3,4,5} B = {4,5,6,7,8} print(A | B) # Union → {1,2,3,4,5,6,7,8} print(A & B) # Intersection → {4, 5} print(A - B) # Différence → {1, 2, 3} print(A ^ B) # Diff. symétrique → {1,2,3,6,7,8} # Dédoublonnage automatique liste = [1,2,2,3,1] unique = list(set(liste)) # [1, 2, 3]
Deux groupes d'étudiants → Union, intersection, uniquement dans groupe A, dans un seul groupe.
Créez dedoublonner(liste) qui enlève les doublons EN PRÉSERVANT l'ordre d'apparition.
setFichiers & Exceptions
Lecture/Écriture · CSV · JSON · try/except · Chemins · Persistance
with)Fichiers Texte
with open(...) — le fichier est fermé automatiquement même en cas d'erreur.# Écrire dans un fichier with open("output.txt", "w", encoding="utf-8") as f: f.write("Première ligne\n") f.write("Deuxième ligne\n") # Lire tout le contenu with open("output.txt", "r", encoding="utf-8") as f: contenu = f.read() print(contenu) # Lire ligne par ligne with open("output.txt", "r", encoding="utf-8") as f: for ligne in f: print(ligne.strip()) # strip() enlève le \n # Ajouter à la fin (append) with open("output.txt", "a", encoding="utf-8") as f: f.write("Ligne ajoutée\n") # Modes : "r" lecture, "w" écriture (écrase), "a" ajout
Ajoutez des entrées datées à un fichier journal.txt (mode "a") et lisez-le entier (mode "r").
Fonction qui retourne un dict {lignes, mots, caracteres} d'un fichier donné.
Fichiers CSV
import csv # Écrire un CSV with open("etudiants.csv", "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) writer.writerow(["Nom", "Âge", "Ville"]) writer.writerow(["Alice", 25, "Libreville"]) # Lire avec DictReader (plus pratique) with open("etudiants.csv", "r", encoding="utf-8") as f: reader = csv.DictReader(f) for ligne in reader: print(f"{ligne['Nom']} a {ligne['Âge']} ans")
Fonctions : ajouter_note_csv(nom, matiere, note), lire_notes_csv(), calculer_moyenne_etudiant(nom).
Fichiers JSON
import json donnees = {"nom": "Alice", "age": 25, "notes": [15, 18]} # Écrire JSON with open("data.json", "w", encoding="utf-8") as f: json.dump(donnees, f, indent=4, ensure_ascii=False) # Lire JSON with open("data.json", "r", encoding="utf-8") as f: data = json.load(f) print(data["nom"]) # Alice
Fonctions : charger_base(), sauvegarder_base(), ajouter_personne(), rechercher_personne().
Gestion des Exceptions
try: nombre = int(input("Entrez un nombre : ")) resultat = 10 / nombre except ValueError: print("❌ Entrez un nombre valide") except ZeroDivisionError: print("❌ Division par zéro impossible") else: print(f"Résultat : {resultat}") # Si aucune erreur finally: print("Nettoyage effectué") # Toujours exécuté # Lever une exception def verifier_age(age): if age < 0: raise ValueError("L'âge ne peut pas être négatif")
Calculatrice avec gestion complète : ValueError (mauvaise saisie), ZeroDivisionError, opération invalide, clause else et finally.
Gérez : FileNotFoundError, PermissionError, UnicodeDecodeError, fichier vide — avec messages différents pour chaque cas.
Chemins avec pathlib
from pathlib import Path print(Path.cwd()) # Répertoire actuel fichier = Path("data") / "notes.txt" print(fichier.exists()) # True/False print(fichier.is_file()) # True/False # Créer un dossier Path("mon_dossier").mkdir(exist_ok=True) # Lire/Écrire directement Path("test.txt").write_text("Contenu", encoding="utf-8") contenu = Path("test.txt").read_text(encoding="utf-8") # Lister les .txt du répertoire for f in Path(".").rglob("*.txt"): print(f.name)
Analysez un fichier de log : nb total lignes, nb erreurs (contenant "ERROR"), nb avertissements ("WARNING"), liste des erreurs uniques.
fusionner_fichiers(fichiers, sortie) — Fusionnez plusieurs fichiers texte en un seul avec gestion des erreurs.
Programmation Orientée Objet
Classes · Objets · __init__ · Héritage · Encapsulation · Polymorphisme · Méthodes spéciales
__init__ et selfsuper()__str__, __eq__)Bases des Classes
class Personne: """Représente une personne.""" def __init__(self, nom, age): self.nom = nom # Attribut d'instance self.age = age def se_presenter(self): print(f"Je m'appelle {self.nom}, j'ai {self.age} ans") def __str__(self): return f"Personne('{self.nom}', {self.age})" # Création d'instances p1 = Personne("Alice", 25) p2 = Personne("Bob", 30) p1.se_presenter() # Je m'appelle Alice, j'ai 25 ans print(p1) # Appelle __str__
Créez Voiture(marque, modele, annee) avec afficher_info() et calculer_age().
Méthodes : calculer_aire(), calculer_perimetre(), est_carre().
Attribut de classe nombre_etudiants. Méthodes ajouter_note(), calculer_moyenne(), @classmethod pour afficher le total.
Encapsulation & Properties
class CompteBancaire: def __init__(self, titulaire, solde=0): self.titulaire = titulaire # Public self._solde = solde # Protected @property def solde(self): # Getter return self._solde @solde.setter def solde(self, valeur): # Setter avec validation if valeur >= 0: self._solde = valeur else: raise ValueError("Solde ne peut pas être négatif") def deposer(self, montant): if montant > 0: self._solde += montant print(f"✓ {montant} FCFA déposés")
@property pour prix (doit être positif) et stock. Méthodes ajouter_stock() et vendre(quantite).
Héritage & Polymorphisme
class Animal: def __init__(self, nom, age): self.nom = nom self.age = age def faire_bruit(self): print("...") class Chien(Animal): # Héritage def __init__(self, nom, age, race): super().__init__(nom, age) # Appel parent self.race = race def faire_bruit(self): # Override print(f"{self.nom} : Wouf !") # Polymorphisme animaux = [Chien("Rex", 3, "Berger"), Animal("Chat", 2)] for a in animaux: a.faire_bruit() # Comportement différent selon la classe
Classe Vehicule → Voiture(nb_portes) et Moto(cylindree). Chaque classe redéfinit demarrer().
Fraction avec __str__, __add__, __mul__ et simplification automatique par PGCD.
Livre, Membre, Bibliotheque. Emprunts (max 3/membre), retours, recherche, statistiques.Livre avec statut disponibleMembre avec ID auto-incrémentéBibliotheque comme gestionnaireModules & NumPy
Modules standards · Créer ses modules · pip · NumPy arrays · Opérations vectorielles · Indexation
Modules Python
# Importations import math import math as m from math import sqrt, pi from datetime import datetime, timedelta import random print(math.pi) # 3.14159... print(sqrt(25)) # 5.0 maintenant = datetime.now() print(maintenant.strftime("%d/%m/%Y")) print(random.randint(1, 100)) # Entier aléatoire print(random.choice(["A", "B", "C"])) # Choix aléatoire # Créer son module : sauvegarder dans utilitaires.py # Puis l'utiliser : import utilitaires # Le bloc if __name__ == "__main__": évite l'exécution à l'import
Créez calculs.py avec : factorielle(n), pgcd(a, b), est_premier(n), fibonacci(n). Importez-le dans votre programme.
NumPy — Fondations
import numpy as np # Créer des arrays arr = np.array([1, 2, 3, 4, 5]) zeros = np.zeros((3, 4)) # Matrice 3x4 de zéros plage = np.arange(0, 10, 2) # [0, 2, 4, 6, 8] linesp = np.linspace(0, 1, 5) # [0., 0.25, 0.5, 0.75, 1.] aleat = np.random.randint(1, 101, 20) # Opérations vectorielles (sans boucle !) print(arr + 10) # [11 12 13 14 15] print(arr * 2) # [2 4 6 8 10] print(arr ** 2) # [1 4 9 16 25] # Statistiques print(np.mean(arr)) # 3.0 print(np.std(arr)) # Écart-type print(np.median(arr)) # 3.0 # Indexation booléenne print(arr[arr > 3]) # [4 5] arr[arr > 3] = 0 # Modifier en place
Générez 100 notes aléatoires entre 0 et 20 → calculez : moyenne, médiane, écart-type, min, max, nb de notes ≥ 10.
import numpy as np def estimer_pi(n=100000): x = np.random.rand(n) y = np.random.rand(n) dans_cercle = (x**2 + y**2) < 1 return 4 * np.sum(dans_cercle) / n for n in [1000, 10000, 100000, 1000000]: pi = estimer_pi(n) erreur = abs(pi - np.pi) print(f"n={n:7d} : π ≈ {pi:.6f} (erreur: {erreur:.6f})")
AnalyseurDonnees avec statistiques descriptives, détection d'anomalies (z-score et IQR), analyse de distribution et tendance (régression linéaire).Pandas & Analyse de Données
Series · DataFrames · Filtrage · Groupby · Valeurs manquantes · Lecture CSV/Excel · Visualisation
Introduction à Pandas
import pandas as pd import numpy as np # Créer un DataFrame data = { 'nom' : ['Alice', 'Bob', 'Charlie'], 'age' : [25, 30, 22], 'salaire': [500000, 750000, 450000] } df = pd.DataFrame(data) print(df.info()) # Infos générales print(df.describe()) # Statistiques print(df.head(2)) # 2 premières lignes print(df.shape) # (3, 3) # Sélection print(df['nom']) # Colonne print(df.loc[0, 'nom']) # Cellule par label print(df.iloc[0, 1]) # Cellule par position # Filtrage print(df[df['age'] > 25]) # Lignes où age > 25 print(df[df['salaire'].isin([500000, 750000])])
5 étudiants avec : nom, age, ville, note_maths, note_physique → affichez infos, describe, villes uniques, répartition par ville.
Étudiants avec >15 en maths / >15 en maths ET physique / moyenne ≥ 15 / meilleur en informatique.
Manipulation, Groupby & Valeurs Manquantes
# Ajouter des colonnes calculées df['age_dans_5_ans'] = df['age'] + 5 df['categorie'] = df['salaire'].apply( lambda s: 'Senior' if s > 600000 else 'Junior' ) # Groupby print(df.groupby('ville')['salaire'].mean()) print(df.groupby('ville').agg({ 'salaire': ['mean', 'sum', 'count'], 'age': 'mean' })) # Valeurs manquantes print(df.isnull().sum()) # Nb de NaN par colonne df['age'] = df['age'].fillna(df['age'].mean()) df = df.dropna() # Supprimer lignes avec NaN # Lire / Écrire fichiers df = pd.read_csv('donnees.csv', encoding='utf-8') df.to_csv('sortie.csv', index=False) df.to_json('sortie.json', orient='records', indent=2)
DataFrame ventes → total par produit / total par ville / quantité moyenne par produit / produit le plus vendu.
AnalyseurEducation : génère 100 étudiants, nettoie les données, calcule moyennes/mentions, statistiques par ville, filtrage personnalisé et export CSV/Excel/JSON.nlargest)Projet Final Intégrateur
Intégrer toutes les compétences · Application complète · Documentation · Présentation
Etudiant et Ecole