🐍 Programmation Python

Python — De zéro à projets réels

Le langage n°1 pour débuter, créer des jeux, automatiser des trucs et construire de l'IA.
Tout ce qu'il faut pour devenir dangereux avec un clavier.

🧠 Pourquoi Python ?

Python est le langage le plus populaire au monde (source : TIOBE, Stack Overflow). Et pour une bonne raison :

🎓

Facile à lire

La syntaxe ressemble presque à de l'anglais. Pas de ; partout, pas d'accolades — juste de l'indentation propre.

🤖

IA & Data Science

TensorFlow, PyTorch, pandas, NumPy… Toute l'intelligence artificielle moderne tourne sur Python.

🌐

Web & APIs

Django, Flask, FastAPI — des millions de sites et services backend sont construits en Python.

🎮

Jeux & Automatisation

Pygame pour les jeux 2D, scripts pour automatiser tes tâches répétitives, bots Discord…

💡

Fun fact : Python est utilisé par la NASA, Google, Instagram, Spotify et Discord. Des entreprises qui recrutent à fond des devs Python.

⚙️ Installation

Avant de coder, il te faut les bons outils. Rien de compliqué :

📥 1. Installer Python

Va sur python.org et télécharge la dernière version (3.12+). Sur l'installeur Windows, coche "Add Python to PATH" — c'est crucial.

# Vérifie que Python est installé :
$ python --version
Python 3.12.4

# Ou sur certains systèmes :
$ python3 --version
Python 3.12.4

📝 2. Un bon éditeur : VS Code

Télécharge Visual Studio Code et installe l'extension Python de Microsoft. Tu auras l'autocomplétion, le débogage, et un terminal intégré.

📦 3. pip — Le gestionnaire de paquets

pip est installé automatiquement avec Python. C'est comme un app store pour les librairies Python.

# Installer un paquet :
$ pip install requests

# Voir les paquets installés :
$ pip list

# Mettre à jour pip :
$ pip install --upgrade pip
⚡

Astuce : Tu peux aussi utiliser IDLE, l'éditeur fourni avec Python. C'est basique mais parfait pour tester des trucs rapidement. Lance-le depuis le menu Démarrer.

🔤 Les bases

Variables & Types

En Python, pas besoin de déclarer le type — le langage le devine tout seul :

# Les types de base nom = "Alex" # str — chaîne de caractères age = 15 # int — nombre entier taille = 1.75 # float — nombre décimal est_dev = True # bool — vrai ou faux # Collections skills = ["Python", "HTML", "Arduino"] # list — liste ordonnée profil = {"nom": "Alex", "level": 42} # dict — clé:valeur

f-strings — Formater du texte

Les f-strings sont la façon moderne (et stylée) d'insérer des variables dans du texte :

nom = "Alex" xp = 1337 print(f"Joueur : {nom}, XP : {xp}") # → Joueur : Alex, XP : 1337 # Tu peux même mettre des calculs dedans : print(f"Level : {xp // 100}") # → Level : 13

input() — Lire une entrée utilisateur

pseudo = input("Ton pseudo : ") age = int(input("Ton âge : ")) # input() renvoie toujours un str ! print(f"Bienvenue {pseudo}, tu as {age} ans.")
⚠️

Attention : input() renvoie toujours une chaîne de caractères (str). Pour un nombre, il faut convertir avec int() ou float().

🔀 Contrôle de flux

if / elif / else — Les conditions

hp = 30 if hp <= 0: print("💀 Game Over") elif hp < 20: print("⚠️ Santé critique !") elif hp < 50: print("🟡 Attention, soigne-toi") else: print("💚 Pleine forme")

for — Boucle sur une séquence

# Parcourir une liste for skill in ["Python", "C++", "Rust"]: print(f"🔧 {skill}") # range() pour compter for i in range(5): # 0, 1, 2, 3, 4 print(f"Tour {i}") # range(start, stop, step) for i in range(0, 20, 5): # 0, 5, 10, 15 print(i)

while — Boucle tant que…

tentatives = 3 while tentatives > 0: reponse = input("Mot de passe : ") if reponse == "s3cr3t": print("✅ Accès accordé !") break # Sort de la boucle tentatives -= 1 print(f"❌ Reste {tentatives} essai(s)") else: print("🔒 Compte bloqué")
🧠

Le saviez-tu ? Le bloc else après un while ou for s'exécute seulement si la boucle n'a pas été interrompue par break. C'est une feature unique de Python.

⚡ Fonctions

Une fonction, c'est un bloc de code réutilisable. Tu l'écris une fois, tu l'appelles autant de fois que tu veux.

def calculer_degats(attaque, defense): """Calcule les dégâts infligés à un ennemi.""" degats = max(0, attaque - defense) return degats # Utilisation : dmg = calculer_degats(25, 10) print(f"🗡️ Tu infliges {dmg} dégâts !") # → 15

Paramètres par défaut

def saluer(nom, titre="Aventurier"): return f"Bienvenue, {titre} {nom} !" print(saluer("Alex")) # → Bienvenue, Aventurier Alex ! print(saluer("Alex", "Maître")) # → Bienvenue, Maître Alex !

Lambda — Fonctions en une ligne

# Fonction classique vs lambda : def doubler(x): return x * 2 doubler_lambda = lambda x: x * 2 # Utile pour trier : joueurs = [{"nom": "A", "xp": 300}, {"nom": "B", "xp": 150}] joueurs.sort(key=lambda j: j["xp"], reverse=True) # → Trié par XP décroissant
📝

Docstrings : La chaîne entre """triple guillemets""" juste après def est une docstring. Elle décrit ce que fait la fonction. C'est une bonne habitude à prendre dès maintenant — ton futur toi te remerciera.

📦 Listes & Dictionnaires

Listes — Les bases avancées

inventaire = ["épée", "bouclier", "potion", "arc", "flèche"] # Slicing — extraire des morceaux print(inventaire[1:3]) # → ['bouclier', 'potion'] print(inventaire[-2:]) # → ['arc', 'flèche'] print(inventaire[::2]) # → ['épée', 'potion', 'flèche'] # Méthodes utiles inventaire.append("bombe") # Ajouter à la fin inventaire.insert(0, "casque") # Insérer à une position inventaire.remove("potion") # Supprimer par valeur dernier = inventaire.pop() # Retirer le dernier

List Comprehension — Du code compact et puissant

# Au lieu de : carres = [] for n in range(10): carres.append(n ** 2) # Tu peux écrire : carres = [n ** 2 for n in range(10)] # → [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] # Avec un filtre : pairs = [n for n in range(20) if n % 2 == 0] # → [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

Dictionnaires — Clé → Valeur

perso = { "nom": "Shadow", "classe": "Assassin", "hp": 80, "skills": ["furtivité", "poison"] } # Accéder print(perso["nom"]) # → Shadow print(perso.get("mana", 0)) # → 0 (pas de crash si clé absente) # Modifier / Ajouter perso["hp"] -= 20 perso["arme"] = "dague" # Nouvelle clé # Parcourir for cle, valeur in perso.items(): print(f"{cle} : {valeur}")
🔥

Pattern utile : Compter des occurrences avec un dict : compteur[mot] = compteur.get(mot, 0) + 1 Ou mieux : utilise from collections import Counter.

🏗️ Classes — Programmation Orientée Objet

La POO, c'est organiser ton code comme un jeu vidéo : des objets avec des propriétés et des actions. Au lieu d'avoir des variables partout, tu les regroupes dans des classes.

class Personnage: """Un personnage de jeu RPG.""" def __init__(self, nom, classe, hp=100, attaque=10): self.nom = nom self.classe = classe self.hp = hp self.hp_max = hp self.attaque = attaque self.inventaire = [] def est_vivant(self): return self.hp > 0 def attaquer(self, cible): degats = self.attaque cible.hp -= degats print(f"⚔️ {self.nom} → {cible.nom} : -{degats} HP") def soigner(self, montant=20): self.hp = min(self.hp + montant, self.hp_max) print(f"💚 {self.nom} : {self.hp}/{self.hp_max} HP") def __str__(self): return f"{self.nom} ({self.classe}) — {self.hp}/{self.hp_max} HP"

Héritage — Créer des sous-classes

class Mage(Personnage): """Un mage avec du mana.""" def __init__(self, nom, mana=50): super().__init__(nom, classe="Mage", hp=70, attaque=8) self.mana = mana def boule_de_feu(self, cible): if self.mana >= 15: self.mana -= 15 degats = 25 cible.hp -= degats print(f"🔥 {self.nom} lance Boule de Feu → {cible.nom} : -{degats} HP") else: print("❌ Pas assez de mana !") # Utilisation : hero = Mage("Gandalf") goblin = Personnage("Goblin", "Monstre", hp=40, attaque=5) hero.boule_de_feu(goblin) print(goblin) # → Goblin (Monstre) — 15/40 HP
💡

self, c'est quoi ? C'est une référence à l'objet lui-même. Quand tu écris self.hp, tu dis "le HP de cet objet-ci". C'est comme this en JavaScript, mais explicite.

🎮 Projet : Mini RPG dans le terminal

On combine tout ce qu'on a appris pour créer un jeu de combat au tour par tour avec inventaire. Copie ce code et lance-le !

import random

class Combattant:
    def __init__(self, nom, hp, attaque):
        self.nom = nom
        self.hp = hp
        self.hp_max = hp
        self.attaque = attaque
        self.potions = 2

    def est_vivant(self):
        return self.hp > 0

    def frapper(self, cible):
        degats = random.randint(self.attaque - 3, self.attaque + 5)
        degats = max(1, degats)
        cible.hp -= degats
        print(f"⚔️  {self.nom} frappe {cible.nom} → -{degats} HP")

    def boire_potion(self):
        if self.potions > 0:
            soin = random.randint(15, 30)
            self.hp = min(self.hp + soin, self.hp_max)
            self.potions -= 1
            print(f"🧪 {self.nom} boit une potion → +{soin} HP ({self.potions} restantes)")
        else:
            print("❌ Plus de potions !")

    def statut(self):
        barre = "█" * (self.hp * 20 // self.hp_max)
        vide = "░" * (20 - len(barre))
        print(f"  {self.nom}: [{barre}{vide}] {self.hp}/{self.hp_max} HP")

# --- Création ---
print("🎮 === MINI RPG TERMINAL === 🎮\n")
nom = input("Ton nom de guerrier : ")
hero = Combattant(nom, hp=100, attaque=15)

monstres = [
    Combattant("Goblin", hp=40, attaque=8),
    Combattant("Squelette", hp=60, attaque=12),
    Combattant("Dragon", hp=120, attaque=20),
]

for monstre in monstres:
    print(f"\n🐉 Un {monstre.nom} apparaît !")
    while hero.est_vivant() and monstre.est_vivant():
        print("\n--- Statut ---")
        hero.statut()
        monstre.statut()
        print(f"\n[1] ⚔️  Attaquer  [2] 🧪 Potion ({hero.potions})")

        choix = input("→ ")
        if choix == "1":
            hero.frapper(monstre)
        elif choix == "2":
            hero.boire_potion()
        else:
            print("❓ Choix invalide, tu perds ton tour !")

        if monstre.est_vivant():
            monstre.frapper(hero)

    if not hero.est_vivant():
        print("\n💀 Game Over...")
        break
    else:
        print(f"\n🏆 {monstre.nom} vaincu !")
        hero.potions += 1
        hero.hp = min(hero.hp + 20, hero.hp_max)
        print(f"💊 +1 potion, +20 HP → {hero.hp}/{hero.hp_max} HP")

if hero.est_vivant():
    print(f"\n🎉 VICTOIRE ! {hero.nom} a terrassé tous les monstres !")
🚀

Pour aller plus loin : Ajoute un système de magie (mana + sorts), un magasin entre les combats, ou des types d'armes avec des dégâts différents. C'est TON jeu, modifie-le !

🌦️ Projet : API Météo en temps réel

On va récupérer la météo d'une ville en temps réel avec l'API gratuite OpenWeatherMap. Tu vas apprendre à faire des requêtes HTTP et parser du JSON — des skills essentiels pour un dev.

📋 Préparation

1. Crée un compte gratuit sur openweathermap.org
2. Récupère ta clé API (onglet "API keys")
3. Installe la librairie requests :

$ pip install requests

🔧 Le code

import requests

API_KEY = "ta_cle_api_ici"  # ← Remplace !
BASE_URL = "https://api.openweathermap.org/data/2.5/weather"

def meteo(ville):
    """Récupère la météo d'une ville."""
    params = {
        "q": ville,
        "appid": API_KEY,
        "units": "metric",      # Celsius
        "lang": "fr"            # Description en français
    }

    reponse = requests.get(BASE_URL, params=params)

    if reponse.status_code != 200:
        print(f"❌ Erreur : ville '{ville}' introuvable")
        return

    data = reponse.json()

    # Extraire les infos utiles
    nom = data["name"]
    temp = data["main"]["temp"]
    ressenti = data["main"]["feels_like"]
    description = data["weather"][0]["description"]
    humidite = data["main"]["humidity"]
    vent = data["wind"]["speed"]

    print(f"\n🌍 Météo à {nom}")
    print(f"🌡️  Température : {temp}°C (ressenti {ressenti}°C)")
    print(f"☁️  Conditions : {description}")
    print(f"💧 Humidité : {humidite}%")
    print(f"💨 Vent : {vent} m/s")

# Lancer
ville = input("🏙️  Ville : ")
meteo(ville)
🔑

Important : Ne partage jamais ta clé API publiquement (sur GitHub par exemple). En vrai projet, on la met dans un fichier .env et on utilise python-dotenv pour la charger.

📊 Comprendre le JSON

L'API renvoie un gros objet JSON. Voici la structure simplifiée :

# reponse.json() donne un dict Python : { "name": "Paris", "main": { "temp": 18.5, "feels_like": 17.2, "humidity": 65 }, "weather": [{"description": "nuageux"}], "wind": {"speed": 3.5} } # C'est un dict imbriqué : data["main"]["temp"] → 18.5

🤖 Projet : Bot Discord

Crée un bot qui répond à des commandes sur ton serveur Discord. C'est le projet le plus cool pour impressionner tes potes.

📋 Setup

1. Va sur Discord Developer Portal
2. Crée une application → Bot → copie le Token
3. Invite le bot sur ton serveur (OAuth2 → URL Generator → scope: bot, permissions: Send Messages)
4. Installe discord.py :

$ pip install discord.py

🔧 Le code du bot

import discord
from discord.ext import commands
import random

# Crée le bot avec un préfixe de commande
intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix="!", intents=intents)

@bot.event
async def on_ready():
    """Quand le bot se connecte."""
    print(f"✅ Connecté en tant que {bot.user}")

@bot.command()
async def ping(ctx):
    """Répond pong avec la latence."""
    latence = round(bot.latency * 1000)
    await ctx.send(f"🏓 Pong ! Latence : {latence}ms")

@bot.command()
async def roll(ctx, faces: int = 6):
    """Lance un dé."""
    resultat = random.randint(1, faces)
    await ctx.send(f"🎲 Tu as lancé un d{faces} → **{resultat}**")

@bot.command()
async def say(ctx, *, message):
    """Le bot répète ton message."""
    await ctx.message.delete()
    await ctx.send(message)

@bot.command()
async def meteo_fake(ctx, ville: str = "Paris"):
    """Météo bidon (pour s'entraîner)."""
    temp = random.randint(-5, 35)
    conditions = random.choice(["☀️ Soleil", "🌧️ Pluie", "⛈️ Orage", "❄️ Neige", "🌤️ Nuageux"])
    await ctx.send(f"🌍 **Météo à {ville}**\n🌡️ {temp}°C — {conditions}")

# Lance le bot (remplace TON_TOKEN)
bot.run("TON_TOKEN_ICI")
⚠️

Sécurité : Ton token Discord est comme un mot de passe. Ne le mets JAMAIS dans du code partagé. Utilise une variable d'environnement : import os; bot.run(os.getenv("DISCORD_TOKEN"))

💡

Combine tes projets ! Ajoute la vraie API météo (projet précédent) à ton bot Discord. Quand quelqu'un tape !meteo Paris, le bot appelle l'API et renvoie la vraie météo. Un vrai projet full-stack !

🚀 Aller plus loin

Tu maîtrises les bases et tu as 3 projets qui tournent. Voici les prochaines étapes pour monter en level :

🎮

Pygame — Jeux 2D

Crée de vrais jeux avec des graphismes : sprites, collisions, sons, niveaux. pip install pygame et c'est parti. Commence par un Space Invaders ou un Flappy Bird.

Jeux
🌐

Flask — Sites web

Construis ton propre site avec un backend Python. API REST, pages dynamiques, base de données. pip install flask — en 10 lignes t'as un serveur web.

Web
📊

pandas — Data Science

Analyse des données comme un pro. Charge des fichiers CSV, fais des graphiques, trouve des tendances. C'est ce que font les data scientists chez Netflix ou Spotify.

Data
🧠

Machine Learning

Entraîne un modèle à reconnaître des images, prédire des prix, ou jouer à un jeu. scikit-learn pour débuter, puis PyTorch pour le deep learning. C'est le futur.

IA

📚 Ressources recommandées

# Sites pour pratiquer "https://www.codingame.com" # Coding challenges gamifiés "https://exercism.org/python" # Exercices avec mentoring "https://projecteuler.net" # Maths + Programmation "https://realpython.com" # Tutos avancés (anglais) # Chaînes YouTube FR "Graven" # Tutos Python clairs "Docstring" # Python avancé en français
🎯

Le secret pour progresser : Code tous les jours, même 20 minutes. Construis des trucs qui t'intéressent. Lis du code d'autres devs sur GitHub. Et quand tu bloques — Google, Stack Overflow, et ChatGPT sont tes meilleurs amis.

← Retour au Labo Tech