Rappels

Les concepts essentiels à maîtriser en Terminale NSI

Objectif : Cette page résume les concepts clés vus en NSI.

Programmation en Python


1. Fonctions avancées

Fonctions comme paramètres
def appliquer(fonction, valeur):
    """Applique une fonction à une valeur"""
    return fonction(valeur)

def carre(x):
    return x ** 2

resultat = appliquer(carre, 5)  # 25
Fonctions lambda
# Fonction lambda (anonyme)
carre = lambda x: x ** 2
somme = lambda a, b: a + b

# Avec map, filter
nombres = [1, 2, 3, 4, 5]
carres = list(map(lambda x: x**2, nombres))      # [1, 4, 9, 16, 25]
pairs = list(filter(lambda x: x%2==0, nombres))  # [2, 4]
Compréhensions de listes
# Liste des carrés
carres = [x**2 for x in range(10)]

# Avec condition
pairs = [x for x in range(20) if x % 2 == 0]

# Liste imbriquée
matrice = [[i*j for j in range(3)] for i in range(3)]

2. Récursivité

Principe

Une fonction récursive s'appelle elle-même. Elle doit avoir un cas de base pour arrêter les appels.

# Factorielle
def factorielle(n):
    if n == 0:              # Cas de base
        return 1
    return n * factorielle(n-1)  # Appel récursif

# Fibonacci
def fibonacci(n):
    if n <= 1:              # Cas de base
        return n
    return fibonacci(n-1) + fibonacci(n-2)

# Somme d'une liste
def somme_recursive(liste):
    if len(liste) == 0:     # Cas de base
        return 0
    return liste[0] + somme_recursive(liste[1:])
Attention : Une fonction récursive sans cas de base provoque une erreur (récursion infinie).

3. Tuples et dictionnaires

Tuples (immutables)
# Créer un tuple
point = (3, 5)
coordonnees = (10, 20, 30)

# Accès
x = point[0]  # 3

# Unpacking
a, b = point  # a=3, b=5

# Tuple à un élément
singleton = (5,)  # Virgule obligatoire
Dictionnaires (clé: valeur)
# Créer un dictionnaire
eleve = {
    "nom": "Alice",
    "age": 17,
    "classe": "1NSI"
}

# Accès
nom = eleve["nom"]
age = eleve.get("age", 0)

# Ajouter/modifier
eleve["note"] = 15

# Parcourir
for cle, valeur in eleve.items():
    print(cle, valeur)
Méthodes des dictionnaires
dico = {"a": 1, "b": 2, "c": 3}

dico.keys()      # dict_keys(['a', 'b', 'c'])
dico.values()    # dict_values([1, 2, 3])
dico.items()     # dict_items([('a', 1), ('b', 2), ('c', 3)])
dico.pop("b")    # Supprime et retourne la valeur de "b"
"a" in dico      # True

4. Gestion de fichiers

Lecture de fichiers
# Lire tout le fichier
with open("fichier.txt", "r", encoding="utf-8") as f:
    contenu = f.read()

# Lire ligne par ligne
with open("fichier.txt", "r", encoding="utf-8") as f:
    for ligne in f:
        print(ligne.strip())

# Lire toutes les lignes dans une liste
with open("fichier.txt", "r", encoding="utf-8") as f:
    lignes = f.readlines()
Écriture dans des fichiers
# Écrire (écrase le contenu)
with open("fichier.txt", "w", encoding="utf-8") as f:
    f.write("Première ligne\n")
    f.write("Deuxième ligne\n")

# Ajouter à la fin
with open("fichier.txt", "a", encoding="utf-8") as f:
    f.write("Ligne ajoutée\n")
Bonne pratique : Utilisez with pour garantir la fermeture du fichier.

Structures de données


5. Tableaux (listes Python)

Recherche dans un tableau
# Recherche séquentielle
def recherche(tableau, valeur):
    for i in range(len(tableau)):
        if tableau[i] == valeur:
            return i
    return -1

# Recherche dichotomique (tableau trié)
def dichotomie(tableau, valeur):
    gauche, droite = 0, len(tableau) - 1
    while gauche <= droite:
        milieu = (gauche + droite) // 2
        if tableau[milieu] == valeur:
            return milieu
        elif tableau[milieu] < valeur:
            gauche = milieu + 1
        else:
            droite = milieu - 1
    return -1
Tableaux à deux dimensions
# Créer une matrice 3x3
matrice = [[0, 1, 2],
           [3, 4, 5],
           [6, 7, 8]]

# Accès
element = matrice[1][2]  # 5

# Parcours
for ligne in matrice:
    for element in ligne:
        print(element, end=" ")

6. Piles et Files

Pile (LIFO)

Last In, First Out - dernier entré, premier sorti

class Pile:
    def __init__(self):
        self.elements = []
    
    def empiler(self, element):
        self.elements.append(element)
    
    def depiler(self):
        if not self.est_vide():
            return self.elements.pop()
    
    def est_vide(self):
        return len(self.elements) == 0

# Utilisation
pile = Pile()
pile.empiler(1)
pile.empiler(2)
print(pile.depiler())  # 2
File (FIFO)

First In, First Out - premier entré, premier sorti

class File:
    def __init__(self):
        self.elements = []
    
    def enfiler(self, element):
        self.elements.append(element)
    
    def defiler(self):
        if not self.est_vide():
            return self.elements.pop(0)
    
    def est_vide(self):
        return len(self.elements) == 0

# Utilisation
file = File()
file.enfiler(1)
file.enfiler(2)
print(file.defiler())  # 1

7. Arbres binaires

Structure d'un arbre
class Noeud:
    def __init__(self, valeur):
        self.valeur = valeur
        self.gauche = None
        self.droite = None

# Créer un arbre
racine = Noeud(10)
racine.gauche = Noeud(5)
racine.droite = Noeud(15)
racine.gauche.gauche = Noeud(3)
racine.gauche.droite = Noeud(7)
Parcours d'arbres
# Parcours préfixe (racine, gauche, droite)
def parcours_prefixe(noeud):
    if noeud is not None:
        print(noeud.valeur)
        parcours_prefixe(noeud.gauche)
        parcours_prefixe(noeud.droite)

# Parcours infixe (gauche, racine, droite)
def parcours_infixe(noeud):
    if noeud is not None:
        parcours_infixe(noeud.gauche)
        print(noeud.valeur)
        parcours_infixe(noeud.droite)

# Parcours postfixe (gauche, droite, racine)
def parcours_postfixe(noeud):
    if noeud is not None:
        parcours_postfixe(noeud.gauche)
        parcours_postfixe(noeud.droite)
        print(noeud.valeur)
Opérations sur les arbres
# Hauteur d'un arbre
def hauteur(noeud):
    if noeud is None:
        return -1
    return 1 + max(hauteur(noeud.gauche), hauteur(noeud.droite))

# Taille d'un arbre (nombre de noeuds)
def taille(noeud):
    if noeud is None:
        return 0
    return 1 + taille(noeud.gauche) + taille(noeud.droite)

8. Graphes

Représentation par liste d'adjacence
# Graphe non orienté
graphe = {
    'A': ['B', 'C'],
    'B': ['A', 'D', 'E'],
    'C': ['A', 'F'],
    'D': ['B'],
    'E': ['B', 'F'],
    'F': ['C', 'E']
}
Parcours en largeur (BFS)
def parcours_largeur(graphe, depart):
    visite = set()
    file = [depart]
    
    while file:
        sommet = file.pop(0)
        if sommet not in visite:
            print(sommet)
            visite.add(sommet)
            for voisin in graphe[sommet]:
                if voisin not in visite:
                    file.append(voisin)
Parcours en profondeur (DFS)
def parcours_profondeur(graphe, sommet, visite=None):
    if visite is None:
        visite = set()
    
    visite.add(sommet)
    print(sommet)
    
    for voisin in graphe[sommet]:
        if voisin not in visite:
            parcours_profondeur(graphe, voisin, visite)

Algorithmes et concepts avancés


9. Algorithmes de tri

Tri par sélection
def tri_selection(tableau):
    n = len(tableau)
    for i in range(n):
        min_idx = i
        for j in range(i+1, n):
            if tableau[j] < tableau[min_idx]:
                min_idx = j
        tableau[i], tableau[min_idx] = tableau[min_idx], tableau[i]
    return tableau
Tri par insertion
def tri_insertion(tableau):
    for i in range(1, len(tableau)):
        cle = tableau[i]
        j = i - 1
        while j >= 0 and tableau[j] > cle:
            tableau[j + 1] = tableau[j]
            j -= 1
        tableau[j + 1] = cle
    return tableau

10. Complexité algorithmique

Notation O (grand O)

Mesure l'efficacité d'un algorithme en fonction de la taille des données.

Complexité Notation Exemple Performance
Constante O(1) Accès à un élément d'un tableau Excellente
Logarithmique O(log n) Recherche dichotomique Très bonne
Linéaire O(n) Parcours d'un tableau Bonne
Linéarithmique O(n log n) Tri fusion, tri rapide Acceptable
Quadratique O(n²) Tri par sélection, insertion Moyenne
Exponentielle O(2ⁿ) Problèmes combinatoires Mauvaise

11. Programmation Orientée Objet (POO)

Définir une classe
class Voiture:
    # Constructeur
    def __init__(self, marque, modele):
        self.marque = marque      # Attribut
        self.modele = modele
        self.vitesse = 0
    
    # Méthode
    def accelerer(self, increment):
        self.vitesse += increment
    
    def __str__(self):
        return f"{self.marque} {self.modele} ({self.vitesse} km/h)"

# Créer un objet
ma_voiture = Voiture("Renault", "Clio")
ma_voiture.accelerer(50)
print(ma_voiture)  # Renault Clio (50 km/h)
Héritage
class VoitureElectrique(Voiture):
    def __init__(self, marque, modele, autonomie):
        super().__init__(marque, modele)
        self.autonomie = autonomie
    
    def recharger(self):
        self.autonomie = 100
        print("Batterie rechargée !")

# Utilisation
tesla = VoitureElectrique("Tesla", "Model 3", 80)
tesla.accelerer(60)
tesla.recharger()

12. Web et réseaux (notions)

Protocoles
  • HTTP/HTTPS : Transfert de pages web
  • TCP/IP : Communication réseau
  • DNS : Résolution de noms de domaine
  • FTP : Transfert de fichiers
HTML/CSS (bases)
<!DOCTYPE html>
<html>
<head>
    <title>Ma page</title>
</head>
<body>
    <h1>Titre</h1>
    <p>Paragraphe</p>
</body>
</html>
Requêtes HTTP
  • GET : Récupérer des données
  • POST : Envoyer des données
  • PUT : Modifier des données
  • DELETE : Supprimer des données
SQL (bases)
-- Sélectionner
SELECT * FROM eleves;

-- Insérer
INSERT INTO eleves 
VALUES ('Alice', 17);

-- Mettre à jour
UPDATE eleves 
SET age = 18 
WHERE nom = 'Alice';

Prêt pour la Terminale ?

Il est temps de passer aux concepts avancés de Terminale !

Cours de Terminale

Découvrez le programme complet

Voir les cours
Exercices

Entraînez-vous

S'exercer
Rappels Python

Bases de Python

Voir les bases