Introduction à Python

Qu'est-ce que Python?

Python est un langage de programmation interprété, haut niveau et généraliste. Créé par Guido van Rossum en 1991, il est particulièrement apprécié pour sa syntaxe claire et sa lisibilité.

Avantages

  • Syntaxe simple et intuitive
  • Multiplateforme
  • Grande communauté
  • Bibliothèque standard étendue
  • Utilisé dans de nombreux domaines

Utilisations

  • Développement web (Django, Flask)
  • Science des données (Pandas, NumPy)
  • Machine Learning (TensorFlow, PyTorch)
  • Automatisation de tâches
  • Scripting système

Exploits Offensifs

  • Scripts d'intrusion en réseau
  • Automatisation d'attaques personnalisées
  • Fuzzing et découverte de vulnérabilités
  • Développement d'outils de pentesting
  • Écriture de payloads sur-mesure

Premier programme

Traditionnellement, le premier programme affiche "Hello World!". En Python, cela s'écrit simplement :

print("Hello World!")

Pour exécuter un script Python, enregistrez votre code dans un fichier avec l'extension .py puis lancez python nom_du_fichier.py dans votre terminal.

Installation de Python

Windows

  1. Téléchargez Python depuis python.org
  2. Exécutez l'installateur
  3. Cochez "Add Python to PATH" avant d'installer
  4. Suivez les instructions de l'installateur

macOS/Linux

Python est généralement préinstallé. Vous pouvez vérifier la version avec :

python3 --version

Si besoin, installez avec votre gestionnaire de paquets :

# macOS avec Homebrew
brew install python

# Debian/Ubuntu
sudo apt update && sudo apt install python3

Environnements virtuels

Il est recommandé d'utiliser des environnements virtuels pour isoler vos projets :

# Créer un environnement
python -m venv mon_env

# Activer (Windows)
mon_env\Scripts\activate

# Activer (macOS/Linux)
source mon_env/bin/activate

Sans installation (en ligne)

Si vous ne souhaitez rien installer, utilisez Replit pour coder directement dans votre navigateur : Replit – Python 3

  • Ouvrez le lien et cliquez sur “Start coding”.
  • Tapez votre script dans l’éditeur à gauche.
  • Cliquez sur “Run” en haut pour exécuter votre code.
  • Le terminal apparaît à droite et affiche la sortie.

Variables et Types de données

Déclaration de variables

En Python, les variables sont créées lorsqu'on leur assigne une valeur. Pas besoin de déclarer le type explicitement.

# Déclaration de variables
nom = "Valentin"
age = 23
taille = 1.70
est_etudiant = True

Les noms de variables peuvent contenir des lettres, chiffres et underscores, mais ne peuvent pas commencer par un chiffre. Python est sensible à la casse (age et Age sont différentes).

Types de données de base

Type Description Exemple
int Nombre entier 42
float Nombre à virgule flottante 3.14
str Chaîne de caractères "Bonjour"
bool Booléen (True/False) True
NoneType Absence de valeur None

Conversion de types

Vous pouvez convertir entre différents types avec les fonctions int(), float(), str(), etc.

# Conversion de types
nombre = "123"
nombre_entier = int(nombre)  # Convertit en entier
nombre_flottant = float(nombre)  # Convertit en flottant

texte = str(42)  # Convertit en chaîne de caractères

Attention aux conversions impossibles ! int("abc") provoquera une erreur. Vous apprendrez à gérer ces erreurs plus tard dans le cours.

Entrée utilisateur

La fonction input() permet de récupérer une entrée utilisateur. Elle retourne toujours une chaîne de caractères.

# Demander le nom de l'utilisateur
nom = input("Quel est votre nom ? ")
print(f"Bonjour, {nom} !")

# Demander un nombre (nécessite une conversion)
age = int(input("Quel est votre age ? ")
print(f"L'année prochaine vous aurez {age + 1} ans.")

Exercice pratique

Créez un programme qui demande deux nombres à l'utilisateur et affiche leur somme.

# Solution
nombre1 = float(input("Entrez le premier nombre : "))
nombre2 = float(input("Entrez le deuxième nombre : "))
somme = nombre1 + nombre2
print(f"La somme est {somme}")

Opérateurs en Python

Opérateurs arithmétiques

Python supporte les opérations mathématiques de base :

Opérateur Description Exemple
+ Addition 5 + 3 → 8
- Soustraction 5 - 3 → 2
* Multiplication 5 * 3 → 15
/ Division 5 / 2 → 2.5
// Division entière 5 // 2 → 2
% Modulo (reste) 5 % 2 → 1
** Exponentiation 5 ** 2 → 25

Priorité des opérateurs

Les opérations sont évaluées selon cet ordre de priorité :

  1. () Parenthèses
  2. ** Exponentiation
  3. *, /, //, %
  4. +, -
# Exemple de priorité
resultat = 5 + 3 * 2  # → 11 (pas 16)
resultat = (5 + 3) * 2  # → 16

Opérateurs de comparaison

Ces opérateurs retournent True or False :

Opérateur Description Exemple
== Égal à 5 == 5 → True
!= Différent de 5 != 3 → True
> Plus grand que 5 > 3 → True
< Plus petit que 5 < 3 → False
>= Plus grand ou égal 5 >= 5 → True
<= Plus petit ou égal 5 <= 3 → False
# Exemples de comparaison
age = 18
majeur = age >= 18  # → True
print(majeur)

Opérateurs logiques

Permettent de combiner plusieurs conditions :

Opérateur Description Exemple
and ET logique True and False → False
or OU logique True or False → True
not NON logique not True → False
# Exemples d'opérateurs logiques
age = 20
permis = True

if age >= 18 and permis:
    print("Vous pouvez conduire")
else:
    print("Vous ne pouvez pas conduire")

Exercice pratique

Écrivez un programme qui demande l'âge et le salaire d'une personne, puis affiche "Éligible" si la personne a plus de 25 ans et gagne plus de 30000€, sinon affiche "Non éligible".

# Solution
age = int(input("Quel est votre âge ? "))
salaire = float(input("Quel est votre salaire annuel ? "))

if age > 25 and salaire > 30000:
    print("Éligible")
else:
    print("Non éligible")

Structures conditionnelles

Instruction if

La structure if permet d'exécuter un bloc de code seulement si une condition est vraie.

# Syntaxe de base
if condition:
    # Code à exécuter si condition est True
    print("La condition est vraie")
# Exemple pratique
age = 20

if age >= 18:
    print("Vous êtes majeur")

En Python, l'indentation est cruciale. Le bloc de code qui suit le if doit être indenté (généralement de 4 espaces). Cette indentation définit la portée du bloc conditionnel.

if...else

L'instruction else permet d'exécuter un bloc alternatif si la condition est fausse.

# Syntaxe if...else
if condition:
    # Code si condition vraie
else:
    # Code si condition fausse
# Exemple pratique
age = 16

if age >= 18:
    print("Vous êtes majeur")
else:
    print("Vous êtes mineur")

if...elif...else

Pour tester plusieurs conditions, on utilise elif (contraction de "else if").

# Syntaxe if...elif...else
if condition1:
    # Code si condition1 vraie
elif condition2:
    # Code si condition2 vraie
else:
    # Code si aucune condition vraie
# Exemple pratique
note = 14

if note >= 16:
    print("Très bien")
elif note >= 14:
    print("Bien")
elif note >= 12:
    print("Assez bien")
else:
    print("Insuffisant")

Les conditions sont évaluées dans l'ordre. Dès qu'une condition est vraie, son bloc est exécuté et les autres conditions sont ignorées. L'ordre des tests est donc important.

Conditions imbriquées

Il est possible d'imbriquer des conditions à l'intérieur d'autres conditions.

# Exemple de conditions imbriquées
age = 20
permis = True

if age >= 18:
    if permis:
        print("Vous pouvez conduire")
    else:
        print("Vous avez l'âge mais pas le permis")
else:
    print("Vous êtes trop jeune")

Attention à l'indentation dans les conditions imbriquées ! Chaque niveau d'imbrication nécessite une indentation supplémentaire.

Opérateur ternaire

Python permet une syntaxe condensée pour les conditions simples :

# Syntaxe de l'opérateur ternaire
valeur = valeur_si_vrai if condition else valeur_si_faux
# Exemple pratique
age = 20
statut = "majeur" if age >= 18 else "mineur"
print(statut)  # Affiche "majeur"

Exercice pratique

Écrivez un programme qui demande un nombre à l'utilisateur et affiche :

  • "Positif" si le nombre est strictement positif
  • "Négatif" si le nombre est strictement négatif
  • "Zéro" si le nombre est nul
# Solution
nombre = float(input("Entrez un nombre : "))

if nombre > 0:
    print("Positif")
elif nombre < 0:
    print("Négatif")
else:
    print("Zéro")

Boucles en Python

Boucle while

La boucle while répète un bloc de code tant qu'une condition est vraie.

# Syntaxe de while
while condition:
    # Code à répéter
    print("La condition est vraie")
# Exemple pratique - compte à rebours
compteur = 5

while compteur > 0:
    print(compteur)
    compteur -= 1  # équivalent à compteur = compteur - 1

print("Décollage !")

Attention aux boucles infinies ! Si la condition ne devient jamais fausse, la boucle ne s'arrêtera jamais. Assurez-vous que la condition finira par être fausse.

Boucle for

La boucle for permet d'itérer sur une séquence (liste, chaîne de caractères, etc.).

# Syntaxe de for
for element in sequence:
    # Code à exécuter pour chaque élément
    print(element)
# Exemple pratique - itération sur une liste
fruits = ["pomme", "banane", "orange"]

for fruit in fruits:
    print(fruit)
# Exemple pratique - itération sur une chaîne
mot = "Python"

for lettre in mot:
    print(lettre)

Fonction range()

range() génère une séquence de nombres, utile pour les boucles.

# Syntaxe de range
range(début, fin, pas)  # fin est exclue

# Exemples
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)

Instructions break et continue

break

Interrompt complètement la boucle.

# Exemple de break
for i in range(10):
    if i == 5:
        break
    print(i)  # Affiche 0, 1, 2, 3, 4

continue

Passe à l'itération suivante de la boucle.

# Exemple de continue
for i in range(5):
    if i == 2:
        continue
    print(i)  # Affiche 0, 1, 3, 4

Boucles imbriquées

Il est possible d'imbriquer des boucles à l'intérieur d'autres boucles.

# Exemple de boucles imbriquées
for i in range(3):      # Boucle externe
    for j in range(2):  # Boucle interne
        print(f"i={i}, j={j}")
# Table de multiplication
for i in range(1, 11):
    for j in range(1, 11):
        print(f"{i} x {j} = {i*j}")
    print()  # Ligne vide entre les tables

else avec les boucles

En Python, on peut utiliser else avec les boucles. Le bloc else is exécuté si la boucle se termine normalement (sans break).

# Exemple de else avec for
for i in range(5):
    print(i)
else:
    print("Boucle terminée normalement")
# Exemple avec break
for i in range(5):
    if i == 3:
        break
    print(i)
else:
    print("Ce message ne s'affichera pas")

Exercice pratique

Écrivez un programme qui :

  • Demande un nombre entier positif à l'utilisateur
  • Affiche tous les nombres premiers inférieurs à ce nombre

Un nombre premier est un nombre divisible uniquement par 1 et par lui-même.

# Solution
nombre = int(input("Entrez un nombre entier positif : "))
print(f"Nombres premiers inférieurs à {nombre}:")

for n in range(2, nombre):
    est_premier = True
    for i in range(2, int(n**0.5) + 1):
        if n % i == 0:
            est_premier = False
            break
    if est_premier:
        print(n, end=" ")

Fonctions en Python

Définition de fonctions

Une fonction est un bloc de code réutilisable qui effectue une tâche spécifique.

# Syntaxe de base
def nom_de_la_fonction(paramètres):
    """Docstring (description de la fonction)"""
    # Corps de la fonction
    return résultat  # Optionnel
# Exemple simple
def saluer(nom):
    """Affiche un message de salutation"""
    print(f"Bonjour, {nom} !")

# Appel de la fonction
saluer("Valentin")  # Affiche "Bonjour, Valentin !"

Les docstrings (entre triples guillemets) sont des descriptions des fonctions. Elles sont accessibles avec help(nom_de_la_fonction) et sont essentielles pour documenter votre code.

Valeurs de retour

Une fonction peut retourner une valeur avec return. Si aucun return n'est spécifié, la fonction retourne None.

# Fonction avec retour
def carre(x):
    """Retourne le carré d'un nombre"""
    return x ** 2

resultat = carre(4)  # resultat = 16
# Fonction sans return explicite
def afficher_carre(x):
    """Affiche le carré d'un nombre"""
    print(x ** 2)

resultat = afficher_carre(4)  # Affiche 16, resultat = None
# Retour multiple
def operations(x, y):
    """Retourne plusieurs résultats"""
    return x + y, x - y, x * y, x / y

somme, difference, produit, quotient = operations(10, 2)

Paramètres et arguments

Paramètres positionnels

Les arguments sont assignés aux paramètres dans l'ordre.

def soustraire(a, b):
    return a - b

resultat = soustraire(5, 3)  # a=5, b=3 → 2

Arguments nommés

Permettent de spécifier les arguments par nom, indépendamment de l'ordre.

resultat = soustraire(b=3, a=5)  # Même résultat que précédemment

Valeurs par défaut

Les paramètres peuvent avoir des valeurs par défaut.

def saluer(nom, message="Bonjour"):
    print(f"{message}, {nom} !")

saluer("Valentin")           # "Bonjour, Valentin !"
saluer("Bob", "Salut")    # "Salut, Bob !"

Les paramètres sans valeur par défaut doivent toujours précéder ceux avec valeur par défaut dans la définition de la fonction.

Portée des variables

Les variables définies dans une fonction sont locales à cette fonction. Pour modifier une variable globale, utilisez le mot-clé global.

# Variable globale
compteur = 0

def incrementer():
    global compteur  # Référence à la variable globale
    compteur += 1

incrementer()
print(compteur)  # 1
# Variable locale
def test():
    variable_locale = 10
    print(variable_locale)

test()
print(variable_locale)  # Erreur: variable_locale n'est pas définie

Fonctions lambda

Les fonctions lambda sont des petites fonctions anonymes définies avec le mot-clé lambda.

# Syntaxe
lambda arguments: expression

# Exemple
carre = lambda x: x ** 2
print(carre(4))  # 16
# Utilisation courante avec map()
nombres = [1, 2, 3, 4]
carres = list(map(lambda x: x**2, nombres))  # [1, 4, 9, 16]

Exercice pratique

Écrivez une fonction calculatrice qui :

  • Prend 3 paramètres : deux nombres et une opération (+, -, *, /)
  • Retourne le résultat de l'opération
  • Gère le cas de la division par zéro en retournant None
# Solution
def calculatrice(a, b, operation):
    """Effectue une opération de base sur deux nombres"""
    if operation == '+':
        return a + b
    elif operation == '-':
        return a - b
    elif operation == '*':
        return a * b
    elif operation == '/':
        if b == 0:
            return None
        return a / b
    else:
        return None

# Exemples d'utilisation
print(calculatrice(10, 5, '+'))  # 15
print(calculatrice(10, 0, '/'))  # None

Exercices pour Débutants

Exercice 1 : Calculatrice simple

Créez un programme qui demande deux nombres et une opération (+, -, *, /) à l'utilisateur, puis affiche le résultat.

Consignes :

  • Utilisez input() pour demander les nombres et l'opération
  • Convertissez les entrées en nombres (float)
  • Utilisez des conditions pour déterminer l'opération à effectuer
  • Gérez le cas de la division par zéro
# Solution
nombre1 = float(input("Entrez le premier nombre : "))
nombre2 = float(input("Entrez le deuxième nombre : "))
operation = input("Entrez l'opération (+, -, *, /) : ")

if operation == '+':
    resultat = nombre1 + nombre2
elif operation == '-':
    resultat = nombre1 - nombre2
elif operation == '*':
    resultat = nombre1 * nombre2
elif operation == '/':
    if nombre2 == 0:
        print("Erreur : division par zéro")
        resultat = None
    else:
        resultat = nombre1 / nombre2
else:
    print("Opération non reconnue")
    resultat = None

if resultat is not None:
    print(f"Résultat : {resultat}")

Exercice 2 : Deviner le nombre

Créez un jeu où l'ordinateur choisit un nombre aléatoire entre 1 et 100, et l'utilisateur doit le deviner.

Consignes :

  • Utilisez import random puis random.randint(1, 100) pour générer le nombre aléatoire
  • Demandez à l'utilisateur de deviner le nombre
  • Donnez des indices ("Trop grand", "Trop petit")
  • Comptez le nombre de tentatives
  • Félicitez l'utilisateur quand il trouve
# Solution
import random

nombre_a_deviner = random.randint(1, 100)
tentatives = 0

print("J'ai choisi un nombre entre 1 and 100. Devinez lequel !")

while True:
    tentative = int(input("Votre proposition : "))
    tentatives += 1
    
    if tentative < nombre_a_deviner:
        print("Trop petit !")
    elif tentative > nombre_a_deviner:
        print("Trop grand !")
    else:
        print(f"Bravo ! Vous avez trouvé en {tentatives} tentatives.")
        break

Exercice 3 : FizzBuzz

Écrivez un programme qui affiche les nombres de 1 à 100 avec les règles suivantes :

  • Pour les multiples de 3, affichez "Fizz" au lieu du nombre
  • Pour les multiples de 5, affichez "Buzz" au lieu du nombre
  • Pour les multiples de 3 et 5, affichez "FizzBuzz"

Consignes :

  • Utilisez une boucle for pour parcourir les nombres de 1 à 100
  • Utilisez des conditions pour vérifier les multiples
  • Pensez à vérifier d'abord le cas "FizzBuzz" (multiple de 3 et 5)
# Solution
for i in range(1, 101):
    if i % 15 == 0:  # Multiple de 3 et 5
        print("FizzBuzz")
    elif i % 3 == 0:
        print("Fizz")
    elif i % 5 == 0:
        print("Buzz")
    else:
        print(i)

Exercice 4 : Table de multiplication

Créez un programme qui affiche la table de multiplication d'un nombre choisi par l'utilisateur.

Consignes :

  • Demandez à l'utilisateur d'entrer un nombre
  • Affichez la table de multiplication de ce nombre de 1 à 10
  • Formatez l'affichage sous forme "5 x 2 = 10"
  • Bonus : permettez à l'utilisateur de choisir la plage (par exemple de 3 à 15)
# Solution de base
nombre = int(input("Entrez un nombre : "))

print(f"Table de multiplication de {nombre} :")
for i in range(1, 11):
    print(f"{nombre} x {i} = {nombre * i}")

# Solution bonus
nombre = int(input("Entrez un nombre : "))
debut = int(input("Début de la table : "))
fin = int(input("Fin de la table : "))

print(f"Table de multiplication de {nombre} ({debut} à {fin}) :")
for i in range(debut, fin + 1):
    print(f"{nombre} x {i} = {nombre * i}")

Listes et Tuples en Python

Les listes et les tuples sont des structures de données fondamentales en Python pour stocker des collections d'éléments.
La principale différence est que les listes sont modifiables (mutables) tandis que les tuples sont immuables. Choisissez un tuple lorsque vos données ne doivent pas changer.

Listes

  • Notation : [élément1, élément2, ...]
  • Mutable : on peut ajouter, supprimer, modifier
  • Supporte de nombreuses méthodes intégrées

Tuples

  • Notation : (élément1, élément2, ...)
  • Immuable : protégé contre les modifications accidentelles
  • Plus rapide en lecture et parfois utilisé comme clé dans un dict

1. Travailler avec les Listes

Création et accès

# Création d'une liste
  fruits = ["pomme", "banane", "cerise"]
  
  # Accès par index (0-based)
  print(fruits[0])     # 'pomme'
  print(fruits[-1])    # 'cerise' (dernier élément)

Slicing

Extraire un sous-ensemble :

# Syntaxe : liste[début:fin:pas]
  print(fruits[0:2])   # ['pomme', 'banane']
  print(fruits[::2])   # ['pomme', 'cerise'] (tous les 2)

Méthodes utiles

  • append(x) : ajoute x à la fin
  • insert(i, x) : insère x à l'index i
  • remove(x) : supprime la première occurrence de x
  • pop([i]) : retire et renvoie l'élément à l'index i (dernier par défaut)
  • sort() et sorted() : tri
  • reverse() : inverse l'ordre
# Exemple complet
  nombres = [3, 1, 4, 1, 5]
  nombres.append(9)
  nombres.insert(2, 2)
  nombres.remove(1)
  nombres.sort()
  print(nombres)   # [1, 2, 3, 4, 5, 9]

List Comprehension

Construire une nouvelle liste de façon concise :

# Carrés des nombres de 1 à 5
  carres = [x**2 for x in range(1, 6)]
  print(carres)   # [1, 4, 9, 16, 25]
  
  # Filtrer
  pairs = [x for x in range(1, 11) if x % 2 == 0]
  print(pairs)    # [2, 4, 6, 8, 10]

2. Travailler avec les Tuples

Création et Accès

# Création d'un tuple
  coordonnees = (10.0, 20.0)
  
  # Accès
  x, y = coordonnees    # Unpacking
  print(x, y)           # 10.0 20.0

Usages courants

  • Retour multiple depuis une fonction
  • Clés immuables pour un dict
  • Permutation de variables sans temporaire : a, b = b, a
# Exemple : fonction retournant plusieurs valeurs
  def operations(a, b):
      return a+b, a-b, a*b, (a/b if b else None)
  
  somme, diff, prod, quot = operations(8, 2)
  print(somme, diff, prod, quot)  # 10 6 16 4.0

Exercice Pratique

Écrivez un programme qui :

  • Lit une liste de nombres (input séparés par des espaces)
  • Affiche la liste des carrés pairs uniquement (utilisez une list comprehension)
# Solution
  data = input("Entrez des nombres séparés par des espaces: ")
  nombres = list(map(int, data.split()))
  carres_pairs = [x**2 for x in nombres if x % 2 == 0]
  print(f"Carrés pairs: {carres_pairs}")

Dictionnaires en Python

1. Création & accès

Un dictionnaire est une collection non ordonnée de paires clé → valeur.

# Création
  mon_dict = {
      "nom": "Valentin",
      "age": 23,
      "skills": ["Python", "C"]
  }
  
  # Accès sécurisé
  print(mon_dict["nom"])          # Valentin
  print(mon_dict.get("age"))      # 23
  print(mon_dict.get("ville", "Inconnue"))  # Inconnue
  

Préférez get() pour éviter l'exception KeyError si la clé n'existe pas.

2. Ajout, mise à jour & suppression

# Ajout ou mise à jour
  mon_dict["ville"] = "Paris"   # ajout
  mon_dict["age"] = 26          # mise à jour
  
  # Suppression
  del mon_dict["skills"]        # sans retour
  ancien_age = mon_dict.pop("age")  # récupère et supprime
  

pop() renvoie la valeur associée à la clé supprimée.

3. Parcours & méthodes utiles

# Parcours complet
  for cle, val in mon_dict.items():
      print(f"{cle} → {val}")
  
  # Liste des clés et des valeurs
  cles = list(mon_dict.keys())
  vals = list(mon_dict.values())
  
  # Fusion (Python 3.9+)
  d2 = {"pays": "France"}
  fusion = mon_dict | d2
  

La fusion avec | ne modifie pas les originaux ; elle crée un nouveau dict.

Exercice pratique

Écrivez un programme qui compte la fréquence de chaque mot dans une liste de chaînes, et affiche les 3 mots les plus fréquents.

Manipulation de fichiers

1. Lecture & écriture

# Écriture (mode "w" écrase)
  with open("notes.txt", "w", encoding="utf-8") as f:
      f.write("Ligne 1\nLigne 2\n")
  
  # Lecture complète
  with open("notes.txt", "r", encoding="utf-8") as f:
      contenu = f.read()
      print(contenu)
  
  # Lecture ligne par ligne
  with open("notes.txt", "r", encoding="utf-8") as f:
      for ligne in f:
          print(ligne.strip())
  

Toujours fermer le fichier (avec with) pour s'assurer que les tampons sont vidés.

2. Autres modes d'ouverture

  • "a" → append : ajoute sans écraser
  • "x" → crée le fichier, échoue s'il existe
  • "b" → mode binaire (ex. "rb", "wb")
  • "+" → lecture et écriture simultanées (ex. "r+")

Exercice pratique

Écrivez un script qui lit un fichier CSV (séparateur ",") et calcule la moyenne de la deuxième colonne.

Gestion des erreurs

try / except / else / finally

try:
      x = int(input("Entrez un entier : "))
      y = 10 / x
  except ValueError:
      print("Ce n'est pas un entier valide.")
  except ZeroDivisionError:
      print("Division par zéro interdite.")
  else:
      print("Résultat :", y)
  finally:
      print("Fin du traitement.")

On peut aussi lever soi-même une exception :

def factorial(n):
      if n < 0:
          raise ValueError("n doit être ≥ 0")
      return 1 if n == 0 else n * factorial(n-1)

Modules et PIP

Importer un module

import math
  from datetime import datetime
  
  print(math.sqrt(16))      # 4.0
  print(datetime.now())     # date et heure courantes

Créer son propre module

Créez un fichier mon_module.py :

# mon_module.py
  def saluer(nom):
      return f"Bonjour, {nom} !"

Puis dans votre script :

from mon_module import saluer
  print(saluer("Valentin"))

PIP (gestionnaire de paquets)

# Installer un paquet
  pip install requests
  
  # Lister les paquets installés
  pip list
  
  # Mettre à jour un paquet
  pip install --upgrade requests

Exercices pour Intermédiaire

Exercice 1 : Analyse de texte

Écrivez un programme qui lit un fichier texte et affiche :

  • Le nombre de lignes
  • Le nombre total de mots
  • Le mot le plus fréquent

Exercice 2 : API HTTP

Utilisez requests pour interroger l'API publique JSONPlaceholder (https://jsonplaceholder.typicode.com/posts) et afficher les titres des 5 premiers posts.

Programmation Orientée Objet

Définition d'une classe

class Personne:
      def __init__(self, nom, age):
          self.nom = nom
          self.age = age
  
      def se_presenter(self):
          return f"Je m'appelle {self.nom} et j'ai {self.age} ans."
  
  # Utilisation
  p = Personne("Valentin", 23)
  print(p.se_presenter())

Héritage

class Étudiant(Personne):
      def __init__(self, nom, age, ecole):
          super().__init__(nom, age)
          self.ecole = ecole
  
      def se_presenter(self):
          base = super().se_presenter()
          return base + f" Je suis à {self.ecole}."

Décorateurs

Fonction décoratrice

def chronometre(fonction):
      import time
      def wrapper(*args, **kwargs):
          début = time.time()
          résultat = fonction(*args, **kwargs)
          print("Temps:", time.time() - début)
          return résultat
      return wrapper
  
  @chronometre
  def calcul_lourd(n):
      somme = 0
      for i in range(n):
          somme += i**2
      return somme
  
  calcul_lourd(1000000)

Typing et Annotations

Annotations de type

from typing import List, Optional
  
  def moyenne(valeurs: List[float]) -> Optional[float]:
      if not valeurs:
          return None
      return sum(valeurs) / len(valeurs)
  
  print(moyenne([1.0, 2.5, 3.5]))

Requêtes HTTP (requests)

GET et POST

import requests
  
  # GET
  r = requests.get("https://api.github.com")
  print(r.status_code, r.headers["Content-Type"])
  
  # POST (exemple JSONPlaceholder)
  data = {"title": "foo", "body": "bar", "userId": 1}
  r2 = requests.post("https://jsonplaceholder.typicode.com/posts", json=data)
  print(r2.json())

Programmation réseau (sockets)

Serveur TCP simple

import socket
  
  with socket.socket() as s:
      s.bind(("localhost", 5000))
      s.listen()
      conn, addr = s.accept()
      with conn:
          print("Connecté par", addr)
          while True:
              data = conn.recv(1024)
              if not data:
                  break
              conn.sendall(data.upper())

Exercices pour Avancés

Exercice 1 : Threading

Créez un serveur qui gère plusieurs clients simultanément en utilisant threading.Thread.

Exercice 2 : Générateurs

Écrivez un générateur qui produit une suite de Fibonacci indéfiniment, puis affichez les 20 premiers termes.