300 Solutions Python
300 Solutions Python
def convertir_en_entier(valeur):
try:
return int(valeur)
except (ValueError, TypeError):
return None
print(convertir_en_entier("42")) # 42
print(convertir_en_entier("abc")) # None
def type_de_variable(valeur):
return type(valeur).__name__
print(type_de_variable(10)) # int
print(type_de_variable("abc")) # str
def est_numerique(chaine):
try:
float(chaine)
return True
except ValueError:
return False
print(est_numerique("3.14")) # True
print(est_numerique("abc")) # False
Exercice 4. Écrire une fonction echanger(a, b) qui retourne le tuple (b, a).
def convertir_kg_en_lb(kg):
return kg * 2.20462
print(convertir_kg_en_lb(10)) # 22.0462
def convertir_lb_en_kg(lb):
return lb / 2.20462
def convertir_km_en_miles(km):
return km * 0.621371
print(convertir_km_en_miles(10)) # 6.21371
def convertir_secondes(s):
h = s // 3600
m = (s % 3600) // 60
sec = s % 60
return (h, m, sec)
print(convertir_secondes(3665)) # (1, 1, 5)
Exercice 10. Écrire une fonction calculer_imc(poids, taille) qui calcule l’IMC (poids
/ taille²).
Exercice 12. Écrire une fonction est_pair(n) qui retourne True si n est pair.
def est_pair(n):
return n % 2 == 0
print(est_pair(4)) # True
Exercice 13. Écrire une fonction est_multiple(n, m) qui vérifie si n est un multiple de
m.
Exercice 14. Écrire une fonction pgcd(a, b) qui calcule le plus grand commun diviseur.
print(pgcd(24, 36)) # 12
Exercice 15. Écrire une fonction ppcm(a, b) qui calcule le plus petit commun multiple.
print(ppcm(4, 6)) # 12
Exercice 16. Écrire une fonction somme_chiffres(n) qui retourne la somme des chiffres
d’un nombre entier.
def somme_chiffres(n):
return sum(int(c) for c in str(abs(n)))
print(somme_chiffres(1234)) # 10
Exercice 17. Écrire une fonction inverser_nombre(n) qui retourne l’entier inversé (ex:
123 -> 321).
def inverser_nombre(n):
return int(str(abs(n))[::-1]) * (1 if n >= 0 else -1)
print(inverser_nombre(123)) # 321
Exercice 18. Écrire une fonction est_nombre_parfait(n) qui vérifie si n est égal à la
somme de ses diviseurs propres (ex: 28).
def est_nombre_parfait(n):
diviseurs = [i for i in range(1, n) if n % i == 0]
return sum(diviseurs) == n
print(est_nombre_parfait(28)) # True
Exercice 19. Écrire une fonction est_nombre_premier(n) qui vérifie si n est un nombre
premier.
def est_nombre_premier(n):
if n < 2:
return False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
return True
print(est_nombre_premier(17)) # True
Exercice 20. Écrire une fonction convertir_base(n, base) qui convertit un entier n en
binaire, octal ou hexadécimal selon base (2, 8, ou 16).
Exercice 21. Écrire une fonction calculer_aire_cercle(rayon) qui retourne l’aire d’un
cercle.
import math
def calculer_aire_cercle(rayon):
return [Link] * rayon ** 2
import math
def calculer_perimetre_cercle(rayon):
return 2 * [Link] * rayon
print(calculer_aire_rectangle(4, 5)) # 20
import math
def calculer_hypotenuse(a, b):
return [Link](a ** 2 + b ** 2)
import math
def resoudre_equation_second_degre(a, b, c):
delta = b ** 2 - 4 * a * c
if delta < 0:
return None
elif delta == 0:
return (-b / (2 * a),)
else:
x1 = (-b + [Link](delta)) / (2 * a)
x2 = (-b - [Link](delta)) / (2 * a)
return (x1, x2)
def calculer_moyenne(notes):
return sum(notes) / len(notes)
def calculer_mediane(valeurs):
v = sorted(valeurs)
n = len(v)
milieu = n // 2
if n % 2 == 0:
return (v[milieu - 1] + v[milieu]) / 2
return v[milieu]
print(calculer_mediane([3, 1, 4, 1, 5])) # 3
Exercice 32. Écrire une fonction distance_points(x1, y1, x2, y2) qui calcule la
distance euclidienne entre deux points.
import math
def distance_points(x1, y1, x2, y2):
return [Link]((x2 - x1) ** 2 + (y2 - y1) ** 2)
Exercice 33. Écrire une fonction calculer_tva(prix_ht, taux) qui retourne le prix
TTC.
Exercice 37. Écrire une fonction racine_carree_newton(n) qui calcule la racine carrée
par la méthode de Newton (sans [Link]).
Exercice 38. Écrire une fonction factorielle_iterative(n) qui calcule n! avec une
boucle.
def factorielle_iterative(n):
resultat = 1
for i in range(2, n + 1):
resultat *= i
return resultat
print(factorielle_iterative(5)) # 120
Exercice 39. Écrire une fonction fibonacci_iteratif(n) qui retourne le n-ième terme
de Fibonacci avec une boucle.
def fibonacci_iteratif(n):
a, b = 0, 1
for _ in range(n):
a, b = b, a + b
return a
print(fibonacci_iteratif(10)) # 55
Exercice 40. Écrire une fonction somme_serie_harmonique(n) qui calcule 1 + 1/2 + 1/3
+ … + 1/n.
def somme_serie_harmonique(n):
return sum(1 / i for i in range(1, n + 1))
Chaînes de Caractères
Exercice 41. Écrire une fonction inverser_mots(phrase) qui inverse l’ordre des mots
d’une phrase.
def inverser_mots(phrase):
return " ".join([Link]()[::-1])
def compter_mots(phrase):
return len([Link]())
print(compter_mots("Bonjour le monde")) # 3
def capitaliser_chaque_mot(phrase):
return " ".join([Link]() for mot in [Link]())
Exercice 44. Écrire une fonction supprimer_espaces(phrase) qui supprime tous les
espaces d’une chaîne.
def supprimer_espaces(phrase):
return [Link](" ", "")
print(compter_occurrences("anticonstitutionnellement", "n")) # 4
Exercice 46. Écrire une fonction est_anagramme(mot1, mot2) qui vérifie si deux mots
sont des anagrammes.
Exercice 47. Écrire une fonction remplacer_voyelles(mot, car) qui remplace toutes
les voyelles d’un mot par un caractère donné.
Exercice 48. Écrire une fonction extraire_nombres(chaine) qui extrait tous les chiffres
présents dans une chaîne sous forme de liste d’entiers.
def extraire_nombres(chaine):
return [int(c) for c in chaine if [Link]()]
print(extraire_nombres("a1b22c3")) # [1, 2, 2, 3]
Exercice 49. Écrire une fonction formater_telephone(numero) qui formate une suite de
10 chiffres en “XX XX XX XX XX”.
def formater_telephone(numero):
return " ".join(numero[i:i+2] for i in range(0, len(numero), 2))
print(formater_telephone("0612345678")) # 06 12 34 56 78
Exercice 50. Écrire une fonction verifier_email(adresse) qui vérifie qu’une adresse
contient un @ et un . après le @.
def verifier_email(adresse):
if "@" not in adresse:
return False
utilisateur, domaine = [Link]("@", 1)
return "." in domaine and len(utilisateur) > 0
print(verifier_email("test@[Link]")) # True
def compter_consonnes(mot):
voyelles = "aeiouAEIOU"
return sum(1 for c in mot if [Link]() and c not in voyelles)
print(compter_consonnes("Bonjour")) # 4
Exercice 54. Écrire une fonction mot_le_plus_long(phrase) qui retourne le mot le plus
long d’une phrase.
def mot_le_plus_long(phrase):
mots = [Link]()
return max(mots, key=len)
def mot_le_plus_court(phrase):
mots = [Link]()
return min(mots, key=len)
def supprimer_doublons_chaine(chaine):
vus = set()
resultat = ""
for c in chaine:
if c not in vus:
[Link](c)
resultat += c
return resultat
print(supprimer_doublons_chaine("programmation")) # progamti
def est_palindrome_phrase(phrase):
nettoye = "".join([Link]() for c in phrase if [Link]())
return nettoye == nettoye[::-1]
def compresser_chaine(chaine):
if not chaine:
return ""
resultat = ""
compte = 1
for i in range(1, len(chaine)):
if chaine[i] == chaine[i - 1]:
compte += 1
else:
resultat += chaine[i - 1] + str(compte)
compte = 1
resultat += chaine[-1] + str(compte)
return resultat
print(compresser_chaine("aaabbc")) # a3b2c1
Exercice 59. Écrire une fonction decompresser_chaine(chaine) qui inverse la
compression (ex: “a3b2c1” -> “aaabbc”).
def decompresser_chaine(chaine):
resultat = ""
i = 0
while i < len(chaine):
lettre = chaine[i]
j = i + 1
nombre = ""
while j < len(chaine) and chaine[j].isdigit():
nombre += chaine[j]
j += 1
resultat += lettre * int(nombre)
i = j
return resultat
print(decompresser_chaine("a3b2c1")) # aaabbc
def premiere_lettre_non_repetee(chaine):
for c in chaine:
if [Link](c) == 1:
return c
return None
print(premiere_lettre_non_repetee("swiss")) # w
Exercice 61. Écrire une fonction vers_camel_case(chaine) qui convertit une chaîne
snake_case en camelCase.
def vers_camel_case(chaine):
mots = [Link]("_")
return mots[0] + "".join([Link]() for m in mots[1:])
print(vers_camel_case("nom_de_variable")) # nomDeVariable
Exercice 62. Écrire une fonction vers_snake_case(chaine) qui convertit une chaîne
camelCase en snake_case.
def vers_snake_case(chaine):
resultat = ""
for c in chaine:
if [Link]():
resultat += "_" + [Link]()
else:
resultat += c
return resultat
print(vers_snake_case("nomDeVariable")) # nom_de_variable
def compter_maj_min(chaine):
maj = sum(1 for c in chaine if [Link]())
minu = sum(1 for c in chaine if [Link]())
return (maj, minu)
print(compter_maj_min("Bonjour Le Monde")) # (3, 11)
Exercice 64. Écrire une fonction verifier_mdp_fort(mdp) qui vérifie qu’un mot de
passe contient au moins 8 caractères, une majuscule, un chiffre et un caractère spécial.
def verifier_mdp_fort(mdp):
if len(mdp) < 8:
return False
a_maj = any([Link]() for c in mdp)
a_chiffre = any([Link]() for c in mdp)
a_special = any(not [Link]() for c in mdp)
return a_maj and a_chiffre and a_special
print(verifier_mdp_fort("Python123!")) # True
def generer_acronyme(phrase):
return "".join(mot[0].upper() for mot in [Link]())
Conditions
Exercice 66. Écrire une fonction classer_age(age) qui retourne “enfant”, “adolescent”,
“adulte” ou “senior” selon l’âge.
def classer_age(age):
if age < 13:
return "enfant"
elif age < 18:
return "adolescent"
elif age < 65:
return "adulte"
else:
return "senior"
print(classer_age(30)) # adulte
Exercice 69. Écrire une fonction est_bissextile(annee) qui vérifie si une année est
bissextile.
def est_bissextile(annee):
return annee % 4 == 0 and (annee % 100 != 0 or annee % 400 == 0)
print(est_bissextile(2024)) # True
def categorie_imc(imc):
if imc < 18.5:
return "Maigreur"
elif imc < 25:
return "Normal"
elif imc < 30:
return "Surpoids"
else:
return "Obésité"
print(categorie_imc(24)) # Normal
def determiner_saison(mois):
if mois in (12, 1, 2):
return "hiver"
elif mois in (3, 4, 5):
return "printemps"
elif mois in (6, 7, 8):
return "été"
else:
return "automne"
print(determiner_saison(7)) # été
Exercice 72. Écrire une fonction verifier_code_postal(code) qui vérifie qu’un code
postal est composé de 5 chiffres.
def verifier_code_postal(code):
return [Link]() and len(code) == 5
print(verifier_code_postal("75001")) # True
Exercice 73. Écrire une fonction peut_voter(age, nationalite) qui vérifie si une
personne peut voter (majeur et nationalité “française”).
Exercice 74. Écrire une fonction tarif_cinema(age) qui retourne le tarif : 5€ si <12
ans, 8€ si <65 ans, 6€ sinon.
def tarif_cinema(age):
if age < 12:
return 5
elif age < 65:
return 8
else:
return 6
print(tarif_cinema(70)) # 6
def qualite_signal(force):
if force >= 80:
return "Excellent"
elif force >= 50:
return "Bon"
elif force > 0:
return "Faible"
else:
return "Aucun"
print(qualite_signal(65)) # Bon
Exercice 78. Écrire une fonction jour_semaine(numero) qui retourne le nom du jour
(1=Lundi … 7=Dimanche).
def jour_semaine(numero):
jours = ["Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi",
"Dimanche"]
if 1 <= numero <= 7:
return jours[numero - 1]
return "Numéro invalide"
print(jour_semaine(3)) # Mercredi
Exercice 79. Écrire une fonction mdp_valide(mdp) qui vérifie qu’un mot de passe a au
moins 6 caractères et contient un chiffre.
def mdp_valide(mdp):
return len(mdp) >= 6 and any([Link]() for c in mdp)
print(mdp_valide("abc123")) # True
Exercice 80. Écrire une fonction note_finale(cc, examen) qui calcule 30% du contrôle
continu + 70% de l’examen, et retourne aussi la mention.
Exercice 81. Écrire une fonction type_nombre(n) qui retourne “positif”, “négatif” ou
“nul”.
def type_nombre(n):
if n > 0:
return "positif"
elif n < 0:
return "négatif"
else:
return "nul"
print(type_nombre(-5)) # négatif
Exercice 82. Écrire une fonction est_chaine_vide(chaine) qui vérifie si une chaîne est
vide ou ne contient que des espaces.
def est_chaine_vide(chaine):
return len([Link]()) == 0
Exercice 83. Écrire une fonction classer_vitesse(vitesse) qui retourne “lente” (<50),
“normale” (50-90) ou “rapide” (>90).
def classer_vitesse(vitesse):
if vitesse < 50:
return "lente"
elif vitesse <= 90:
return "normale"
else:
return "rapide"
print(classer_vitesse(100)) # rapide
Boucles
Exercice 86. Écrire une fonction somme_pairs(n) qui retourne la somme des nombres
pairs de 1 à n.
def somme_pairs(n):
total = 0
for i in range(1, n + 1):
if i % 2 == 0:
total += i
return total
print(somme_pairs(10)) # 30
Exercice 87. Écrire une fonction somme_impairs(n) qui retourne la somme des nombres
impairs de 1 à n.
def somme_impairs(n):
total = 0
for i in range(1, n + 1):
if i % 2 != 0:
total += i
return total
print(somme_impairs(10)) # 25
Exercice 88. Écrire une fonction produit_1_a_n(n) qui retourne le produit des nombres
de 1 à n.
def produit_1_a_n(n):
produit = 1
for i in range(1, n + 1):
produit *= i
return produit
print(produit_1_a_n(5)) # 120
Exercice 89. Écrire une fonction triangle_etoiles(n) qui retourne une chaîne
représentant un triangle de n lignes d’étoiles.
def triangle_etoiles(n):
lignes = []
for i in range(1, n + 1):
[Link]("*" * i)
return "\n".join(lignes)
print(triangle_etoiles(4))
# *
# **
# ***
# ****
Exercice 90. Écrire une fonction triangle_inverse(n) qui retourne un triangle d’étoiles
inversé.
def triangle_inverse(n):
lignes = []
for i in range(n, 0, -1):
[Link]("*" * i)
return "\n".join(lignes)
print(triangle_inverse(4))
# ****
# ***
# **
# *
Exercice 91. Écrire une fonction pyramide(n) qui retourne une pyramide d’étoiles
centrée de n lignes.
def pyramide(n):
lignes = []
for i in range(1, n + 1):
[Link](" " * (n - i) + "*" * (2 * i - 1))
return "\n".join(lignes)
print(pyramide(3))
# *
# ***
# *****
def compter_diviseurs(n):
compte = 0
for i in range(1, n + 1):
if n % i == 0:
compte += 1
return compte
print(compter_diviseurs(12)) # 6
Exercice 93. Écrire une fonction lister_diviseurs(n) qui retourne la liste des
diviseurs d’un nombre.
def lister_diviseurs(n):
return [i for i in range(1, n + 1) if n % i == 0]
def nombres_premiers_jusqua(n):
premiers = []
for nombre in range(2, n + 1):
est_premier = True
for i in range(2, int(nombre ** 0.5) + 1):
if nombre % i == 0:
est_premier = False
break
if est_premier:
[Link](nombre)
return premiers
Exercice 95. Écrire une fonction suite_syracuse(n) qui retourne la longueur de la suite
de Syracuse (Collatz) partant de n.
def suite_syracuse(n):
compte = 0
while n != 1:
if n % 2 == 0:
n = n // 2
else:
n = 3 * n + 1
compte += 1
return compte
print(suite_syracuse(27)) # 111
Exercice 96. Écrire une fonction somme_carres(n) qui retourne la somme des carrés de
1 à n.
def somme_carres(n):
total = 0
for i in range(1, n + 1):
total += i ** 2
return total
print(somme_carres(5)) # 55
Exercice 97. Écrire une fonction somme_cubes(n) qui retourne la somme des cubes de 1
à n.
def somme_cubes(n):
total = 0
for i in range(1, n + 1):
total += i ** 3
return total
print(somme_cubes(3)) # 36
Exercice 98. Écrire une fonction damier(n) qui retourne une chaîne représentant un
damier n x n de ‘X’ et ‘O’.
def damier(n):
lignes = []
for i in range(n):
ligne = ""
for j in range(n):
ligne += "X" if (i + j) % 2 == 0 else "O"
[Link](ligne)
return "\n".join(lignes)
print(damier(4))
# XOXO
# OXOX
# XOXO
# OXOX
Exercice 99. Écrire une fonction pgcd_boucle(a, b) qui calcule le PGCD par
soustractions successives.
print(pgcd_boucle(48, 18)) # 6
def moyenne_geometrique(valeurs):
produit = 1
for v in valeurs:
produit *= v
return produit ** (1 / len(valeurs))
def compter_lettres_boucle(mot):
compteur = {}
for lettre in mot:
if lettre in compteur:
compteur[lettre] += 1
else:
compteur[lettre] = 1
return compteur
print(compter_lettres_boucle("abracadabra"))
Exercice 102. Écrire une fonction inverser_liste_boucle(liste) qui inverse une liste
sans utiliser reverse() ni le slicing.
def inverser_liste_boucle(liste):
resultat = []
for i in range(len(liste) - 1, -1, -1):
[Link](liste[i])
return resultat
def trouver_min_max_boucle(liste):
minimum = maximum = liste[0]
for element in liste[1:]:
if element < minimum:
minimum = element
if element > maximum:
maximum = element
return (minimum, maximum)
def somme_multiples_3_5(limite):
total = 0
for i in range(limite):
if i % 3 == 0 or i % 5 == 0:
total += i
return total
print(somme_multiples_3_5(1000)) # 233168
def compter_voyelles_boucle(texte):
voyelles = "aeiouAEIOU"
compte = 0
for c in texte:
if c in voyelles:
compte += 1
return compte
Exercice 107. Écrire une fonction table_addition(n) qui retourne une liste des
sommes i+n pour i de 1 à 10.
def table_addition(n):
return [i + n for i in range(1, 11)]
Listes
def supprimer_doublons_liste(liste):
vus = set()
resultat = []
for element in liste:
if element not in vus:
[Link](element)
[Link](element)
return resultat
def aplatir_liste(liste_de_listes):
resultat = []
for sous_liste in liste_de_listes:
[Link](sous_liste)
return resultat
Exercice 114. Écrire une fonction rotation_liste(liste, n) qui décale les éléments
d’une liste de n positions vers la droite.
Exercice 115. Écrire une fonction deuxieme_max(liste) qui retourne la deuxième plus
grande valeur d’une liste.
def deuxieme_max(liste):
uniques = sorted(set(liste), reverse=True)
return uniques[1]
print(deuxieme_max([4, 7, 2, 9, 9, 1])) # 7
Exercice 119. Écrire une fonction liste_difference(l1, l2) qui retourne les éléments
de l1 absents de l2.
Exercice 121. Écrire une fonction tri_insertion(liste) qui trie une liste en
implémentant l’algorithme de tri par insertion.
def tri_insertion(liste):
liste = liste[:]
for i in range(1, len(liste)):
cle = liste[i]
j = i - 1
while j >= 0 and liste[j] > cle:
liste[j + 1] = liste[j]
j -= 1
liste[j + 1] = cle
return liste
Exercice 122. Écrire une fonction tri_selection(liste) qui trie une liste en
implémentant l’algorithme de tri par sélection.
def tri_selection(liste):
liste = liste[:]
n = len(liste)
for i in range(n):
idx_min = i
for j in range(i + 1, n):
if liste[j] < liste[idx_min]:
idx_min = j
liste[i], liste[idx_min] = liste[idx_min], liste[i]
return liste
print(tri_selection([64, 25, 12, 22, 11])) # [11, 12, 22, 25, 64]
print(recherche_dichotomique([1,3,5,7,9,11], 7)) # 3
Exercice 124. Écrire une fonction liste_est_triee(liste) qui vérifie si une liste est
triée en ordre croissant.
def liste_est_triee(liste):
for i in range(len(liste) - 1):
if liste[i] > liste[i + 1]:
return False
return True
Exercice 125. Écrire une fonction fusionner_et_trier(l1, l2) qui fusionne deux
listes quelconques puis les trie.
Exercice 126. Écrire une fonction moyenne_liste(liste) qui calcule la moyenne des
éléments d’une liste.
def moyenne_liste(liste):
return sum(liste) / len(liste)
Exercice 127. Écrire une fonction produit_liste(liste) qui calcule le produit des
éléments d’une liste.
def produit_liste(liste):
produit = 1
for element in liste:
produit *= element
return produit
print(produit_liste([1, 2, 3, 4])) # 24
Exercice 128. Écrire une fonction filtrer_pairs(liste) qui retourne uniquement les
nombres pairs d’une liste.
def filtrer_pairs(liste):
return [x for x in liste if x % 2 == 0]
print(filtrer_pairs([1,2,3,4,5,6])) # [2, 4, 6]
Exercice 129. Écrire une fonction filtrer_positifs(liste) qui retourne uniquement
les nombres positifs d’une liste.
def filtrer_positifs(liste):
return [x for x in liste if x > 0]
Exercice 130. Écrire une fonction transformer_carre(liste) qui retourne une liste
avec le carré de chaque élément.
def transformer_carre(liste):
return [x ** 2 for x in liste]
Exercice 131. Écrire une fonction zip_listes(l1, l2) qui combine deux listes en une
liste de tuples (sans utiliser zip).
def liste_cumulative(liste):
resultat = []
total = 0
for x in liste:
total += x
[Link](total)
return resultat
def sous_liste_somme_max(liste):
max_actuel = max_global = liste[0]
for x in liste[1:]:
max_actuel = max(x, max_actuel + x)
max_global = max(max_global, max_actuel)
return max_global
print(sous_liste_somme_max([-2,1,-3,4,-1,2,1,-5,4])) # 6
def transposer_matrice(matrice):
return [[ligne[i] for ligne in matrice] for i in range(len(matrice[0]))]
print(transposer_matrice([[1,2,3],[4,5,6]])) # [[1,4],[2,5],[3,6]]
Exercice 135. Écrire une fonction addition_matrices(m1, m2) qui additionne deux
matrices de même taille.
def liste_vers_dictionnaire(liste):
return {i: valeur for i, valeur in enumerate(liste)}
print(liste_vers_dictionnaire(["a","b","c"])) # {0:'a',1:'b',2:'c'}
Exercice 138. Écrire une fonction melanger_liste(liste) qui retourne une copie
mélangée d’une liste (module random).
import random
def melanger_liste(liste):
copie = liste[:]
[Link](copie)
return copie
def partitionner_pair_impair(liste):
pairs = [x for x in liste if x % 2 == 0]
impairs = [x for x in liste if x % 2 != 0]
return (pairs, impairs)
print(partitionner_pair_impair([1,2,3,4,5,6])) # ([2,4,6],[1,3,5])
Tuples
Exercice 142. Écrire une fonction inverser_tuple(tup) qui retourne un tuple inversé.
def inverser_tuple(tup):
return tup[::-1]
print(inverser_tuple((1,2,3,4))) # (4, 3, 2, 1)
def concatener_tuples(*tuples):
resultat = ()
for t in tuples:
resultat += t
return resultat
def tuple_le_plus_long(liste_de_tuples):
return max(liste_de_tuples, key=len)
Exercice 145. Écrire une fonction comparer_tuples(t1, t2) qui retourne les éléments
qui diffèrent entre deux tuples de même taille.
def tuple_sans_doublons(tup):
vus = set()
resultat = []
for x in tup:
if x not in vus:
[Link](x)
[Link](x)
return tuple(resultat)
print(tuple_sans_doublons((1,2,2,3,1))) # (1, 2, 3)
Exercice 147. Écrire une fonction somme_tuple(tup) qui retourne la somme des
éléments d’un tuple de nombres.
def somme_tuple(tup):
return sum(tup)
print(somme_tuple((1,2,3,4))) # 10
Exercice 148. Écrire une fonction tuple_pair_impair(tup) qui retourne un tuple des
éléments pairs et un tuple des éléments impairs.
def tuple_pair_impair(tup):
pairs = tuple(x for x in tup if x % 2 == 0)
impairs = tuple(x for x in tup if x % 2 != 0)
return (pairs, impairs)
Exercice 150. Écrire une fonction tuple_min_max(tup) qui retourne un tuple (min, max)
d’un tuple de nombres.
def tuple_min_max(tup):
return (min(tup), max(tup))
print(tuple_min_max((4,7,2,9,1))) # (1, 9)
Exercice 151. Écrire une fonction additionner_tuples(t1, t2) qui additionne deux
tuples élément par élément.
print(compter_elements_communs((1,2,3), (2,3,4))) # 2
def tuple_vers_liste_triee(tup):
return sorted(list(tup))
print(tuple_vers_liste_triee((3,1,4,1,5))) # [1, 1, 3, 4, 5]
def extraire_positions_paires(tup):
return tup[::2]
Ensembles
Exercice 156. Écrire une fonction elements_uniques(l1, l2) qui retourne les éléments
qui n’apparaissent que dans une seule des deux listes.
def caracteres_uniques(chaine):
return set(chaine)
print(caracteres_uniques("mississippi")) # {'m','i','s','p'}
Exercice 159. Écrire une fonction intersection_multiple(*ensembles) qui retourne
l’intersection de plusieurs ensembles.
def intersection_multiple(*ensembles):
resultat = set(ensembles[0])
for e in ensembles[1:]:
resultat &= set(e)
return resultat
def union_multiple(*ensembles):
resultat = set()
for e in ensembles:
resultat |= set(e)
return resultat
Exercice 162. Écrire une fonction sont_disjoints(a, b) qui vérifie si deux ensembles
n’ont aucun élément en commun.
Exercice 164. Écrire une fonction ensembles_egaux(a, b) qui vérifie si deux ensembles
contiennent les mêmes éléments.
def fusionner_sans_doublons(*listes):
resultat = set()
for liste in listes:
resultat |= set(liste)
return resultat
def ensemble_carres(ensemble):
return {x ** 2 for x in ensemble}
print(ensemble_carres({1,2,3})) # {1, 4, 9}
def ensemble_premiers(limite):
premiers = set()
for n in range(2, limite + 1):
est_premier = True
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
est_premier = False
break
if est_premier:
[Link](n)
return premiers
print(ensemble_premiers(20)) # {2,3,5,7,11,13,17,19}
Dictionnaires
def compter_frequence_mots(texte):
mots = [Link]().split()
frequence = {}
for mot in mots:
frequence[mot] = [Link](mot, 0) + 1
return frequence
Exercice 173. Écrire une fonction inverser_dictionnaire(d) qui inverse les clés et les
valeurs d’un dictionnaire.
def inverser_dictionnaire(d):
return {valeur: cle for cle, valeur in [Link]()}
Exercice 174. Écrire une fonction trier_dict_par_valeur(d) qui retourne une liste de
tuples (clé, valeur) triée par valeur.
def trier_dict_par_valeur(d):
return sorted([Link](), key=lambda item: item[1])
print(trier_dict_par_valeur({"a":3,"b":1,"c":2})) # [('b',1),('c',2),('a',3)]
Exercice 175. Écrire une fonction trier_dict_par_cle(d) qui retourne une liste de
tuples (clé, valeur) triée par clé.
def trier_dict_par_cle(d):
return sorted([Link]())
print(trier_dict_par_cle({"c":3,"a":1,"b":2})) # [('a',1),('b',2),('c',3)]
def dict_vers_liste_tuples(d):
return list([Link]())
print(dict_vers_liste_tuples({"a":1,"b":2})) # [('a',1),('b',2)]
Exercice 177. Écrire une fonction filtrer_dictionnaire(d, seuil) qui retourne un
dictionnaire ne gardant que les valeurs supérieures au seuil.
Exercice 178. Écrire une fonction cle_valeur_max(d) qui retourne la clé associée à la
plus grande valeur.
def cle_valeur_max(d):
return max(d, key=[Link])
print(cle_valeur_max({"a":5,"b":15,"c":25})) # c
def sommer_valeurs_dict(d):
return sum([Link]())
print(sommer_valeurs_dict({"a":5,"b":15,"c":25})) # 45
def compter_caracteres_dict(mot):
resultat = {}
for c in mot:
resultat[c] = [Link](c, 0) + 1
return resultat
print(compter_caracteres_dict("banane")) # {'b':1,'a':2,'n':2,'e':1}
def grouper_par_longueur(liste_mots):
resultat = {}
for mot in liste_mots:
longueur = len(mot)
[Link](longueur, []).append(mot)
return resultat
print(grouper_par_longueur(["chat","chien","rat","souris"]))
Exercice 184. Écrire une fonction fusionner_en_sommant(d1, d2) qui fusionne deux
dictionnaires en additionnant les valeurs des clés communes.
Exercice 186. Écrire une fonction cles_communes(d1, d2) qui retourne les clés
communes entre deux dictionnaires.
Exercice 187. Écrire une fonction compter_valeur(d, valeur) qui compte combien de
clés ont une valeur donnée.
print(compter_valeur({"a":1,"b":2,"c":1}, 1)) # 2
def valeurs_uniques_dict(d):
return set([Link]())
print(valeurs_uniques_dict({"a":1,"b":2,"c":1})) # {1, 2}
def grouper_par_note(dict_notes):
groupes = {"Très bien": [], "Bien": [], "Passable": [], "Échec": []}
for nom, note in dict_notes.items():
if note >= 16:
groupes["Très bien"].append(nom)
elif note >= 14:
groupes["Bien"].append(nom)
elif note >= 10:
groupes["Passable"].append(nom)
else:
groupes["Échec"].append(nom)
return groupes
Exercice 191. Écrire une fonction moyenne_dict(d) qui calcule la moyenne des valeurs
numériques d’un dictionnaire.
def moyenne_dict(d):
return sum([Link]()) / len(d)
print(moyenne_dict({"Alice":17,"Bob":12,"Charlie":8})) # 12.33...
def compteur_lettres_texte(texte):
compteur = {}
for c in [Link]():
if [Link]():
compteur[c] = [Link](c, 0) + 1
return dict(sorted([Link](), key=lambda x: x[1], reverse=True))
print(compteur_lettres_texte("mississippi"))
Exercice 195. Écrire une fonction fusion_profonde(d1, d2) qui fusionne
récursivement deux dictionnaires imbriqués.
def fibonacci_recursif(n):
if n <= 1:
return n
return fibonacci_recursif(n - 1) + fibonacci_recursif(n - 2)
print(fibonacci_recursif(10)) # 55
Exercice 197. Écrire une fonction récursive factorielle_recursive(n) qui calcule n!.
def factorielle_recursive(n):
if n <= 1:
return 1
return n * factorielle_recursive(n - 1)
print(factorielle_recursive(5)) # 120
def somme_recursive(liste):
if not liste:
return 0
return liste[0] + somme_recursive(liste[1:])
print(somme_recursive([1,2,3,4,5])) # 15
print(pgcd_recursif(48, 18)) # 6
def inverser_chaine_recursive(chaine):
if len(chaine) <= 1:
return chaine
return inverser_chaine_recursive(chaine[1:]) + chaine[0]
print(inverser_chaine_recursive("Python")) # nohtyP
def est_palindrome_recursif(chaine):
if len(chaine) <= 1:
return True
if chaine[0] != chaine[-1]:
return False
return est_palindrome_recursif(chaine[1:-1])
print(est_palindrome_recursif("radar")) # True
print(compter_occurrences_recursif([1,2,1,3,1], 1)) # 3
Exercice 204. Écrire une fonction récursive tours_de_hanoi(n, source, aux, dest)
qui résout les tours de Hanoï et retourne le nombre de déplacements.
print(recherche_dichotomique_recursive([1,3,5,7,9], 7)) # 3
def aplatir_liste_recursive(liste_imbriquee):
resultat = []
for element in liste_imbriquee:
if isinstance(element, list):
[Link](aplatir_liste_recursive(element))
else:
[Link](element)
return resultat
def somme_chiffres_recursive(n):
if n < 10:
return n
return n % 10 + somme_chiffres_recursive(n // 10)
print(somme_chiffres_recursive(12345)) # 15
Exercice 208. Écrire une fonction multiplier_avec_lambda() qui retourne une lambda
multipliant deux nombres, puis l’utiliser.
def multiplier_avec_lambda():
return lambda a, b: a * b
multiplier = multiplier_avec_lambda()
print(multiplier(4, 5)) # 20
Exercice 212. Écrire une fonction somme_args(*args) qui retourne la somme d’un
nombre variable d’arguments.
def somme_args(*args):
return sum(args)
print(somme_args(1, 2, 3, 4, 5)) # 15
Exercice 213. Écrire une fonction afficher_kwargs(**kwargs) qui affiche chaque paire
clé-valeur passée en argument nommé.
def afficher_kwargs(**kwargs):
for cle, valeur in [Link]():
print(f"{cle} : {valeur}")
Exercice 214. Écrire une fonction creer_multiplicateur(n) qui retourne une fonction
(closure) multipliant son argument par n.
def creer_multiplicateur(n):
def multiplicateur(x):
return x * n
return multiplicateur
double = creer_multiplicateur(2)
print(double(5)) # 10
Exercice 215. Écrire une fonction creer_compteur() qui retourne une fonction (closure)
comptant le nombre de ses appels.
def creer_compteur():
compte = [0]
def compteur():
compte[0] += 1
return compte[0]
return compteur
compter = creer_compteur()
print(compter()) # 1
print(compter()) # 2
import time
def mesurer_temps(fonction):
def wrapper(*args, **kwargs):
debut = [Link]()
resultat = fonction(*args, **kwargs)
fin = [Link]()
print(f"Temps d'exécution : {fin - debut:.6f} s")
return resultat
return wrapper
@mesurer_temps
def calcul_long():
return sum(range(1000000))
calcul_long()
def journaliser(fonction):
def wrapper(*args, **kwargs):
print(f"Appel de {fonction.__name__} avec args={args}, kwargs={kwargs}")
return fonction(*args, **kwargs)
return wrapper
@journaliser
def addition(a, b):
return a + b
print(addition(3, 4))
Exercice 218. Écrire un décorateur memoiser(fonction) qui met en cache les résultats
d’une fonction Fibonacci récursive.
def memoiser(fonction):
cache = {}
def wrapper(n):
if n not in cache:
cache[n] = fonction(n)
return cache[n]
return wrapper
@memoiser
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
def est_pair_mutuel(n):
if n == 0:
return True
return est_impair_mutuel(n - 1)
def est_impair_mutuel(n):
if n == 0:
return False
return est_pair_mutuel(n - 1)
print(est_pair_mutuel(10)) # True
print(est_impair_mutuel(7)) # True
def generer_permutations(liste):
if len(liste) <= 1:
return [liste]
permutations = []
for i in range(len(liste)):
reste = liste[:i] + liste[i+1:]
for p in generer_permutations(reste):
[Link]([liste[i]] + p)
return permutations
print(generer_permutations([1,2,3]))
# [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
Exercice 221. Écrire une fonction diviser_securise(a, b) qui gère la division par zéro
et retourne None en cas d’erreur.
def convertir_entier_securise(valeur):
try:
return int(valeur)
except ValueError:
print(f"Erreur : '{valeur}' n'est pas convertible en entier")
return None
print(convertir_entier_securise("abc")) # None
Exercice 224. Écrire une fonction verifier_age_valide(age) qui lève une exception
ValueError si l’âge est négatif ou supérieur à 150.
def verifier_age_valide(age):
if age < 0 or age > 150:
raise ValueError("Âge invalide")
return age
try:
verifier_age_valide(-5)
except ValueError as e:
print("Erreur :", e)
def lire_fichier_securise(nom_fichier):
try:
with open(nom_fichier, "r", encoding="utf-8") as f:
return [Link]()
except FileNotFoundError:
print(f"Erreur : le fichier '{nom_fichier}' n'existe pas")
return None
print(lire_fichier_securise("[Link]")) # None
Exercice 226. Écrire une fonction racine_carree_securisee(n) qui lève une exception
si n est négatif.
def racine_carree_securisee(n):
if n < 0:
raise ValueError("Impossible de calculer la racine carrée d'un nombre
négatif")
return n ** 0.5
try:
racine_carree_securisee(-9)
except ValueError as e:
print("Erreur :", e)
Exercice 227. Écrire une fonction verifier_stock(stock, quantite) qui lève une
exception si la quantité demandée dépasse le stock.
try:
verifier_stock(5, 10)
except ValueError as e:
print("Erreur :", e)
class SoldeInsuffisantError(Exception):
pass
def valider_email_ou_lever(email):
if "@" not in email or "." not in [Link]("@")[-1]:
raise ValueError("Email invalide")
return True
try:
valider_email_ou_lever("pas_un_email")
except ValueError as e:
print("Erreur :", e)
Exercice 230. Écrire une fonction calculatrice(a, b, operation) qui gère plusieurs
exceptions possibles (ZeroDivisionError, TypeError, ValueError).
def verifier_liste_non_vide(liste):
if not liste:
raise ValueError("La liste est vide")
return liste
try:
verifier_liste_non_vide([])
except ValueError as e:
print("Erreur :", e)
class MotDePasseFaibleError(Exception):
pass
def verifier_force_mdp(mdp):
if len(mdp) < 8:
raise MotDePasseFaibleError("Le mot de passe doit contenir au moins 8
caractères")
return True
try:
verifier_force_mdp("abc")
except MotDePasseFaibleError as e:
print("Erreur :", e)
Exercice 233. Écrire une fonction acceder_dict_securise(d, cle) qui gère l’absence
d’une clé dans un dictionnaire.
Exercice 234. Écrire une fonction verifier_type(valeur, type_attendu) qui lève une
exception TypeError si le type ne correspond pas.
try:
verifier_type("texte", int)
except TypeError as e:
print("Erreur :", e)
Exercice 235. Écrire une fonction moyenne_securisee(notes) qui gère le cas d’une liste
vide.
def moyenne_securisee(notes):
try:
return sum(notes) / len(notes)
except ZeroDivisionError:
print("Erreur : liste de notes vide")
return None
print(moyenne_securisee([])) # None
class ElementNonTrouveError(Exception):
pass
def convertir_liste_en_entiers(liste_valeurs):
resultats = []
for valeur in liste_valeurs:
try:
[Link](int(valeur))
except (ValueError, TypeError):
print(f"Ignoré : '{valeur}' n'est pas convertible")
return resultats
try:
verifier_plage(150, 0, 100)
except ValueError as e:
print("Erreur :", e)
class StockEpuiseError(Exception):
pass
try:
commander({"pomme": 3}, "pomme", 5)
except StockEpuiseError as e:
print("Erreur :", e)
def lire_fichier_vers_liste(nom_fichier):
with open(nom_fichier, "r", encoding="utf-8") as f:
return [[Link]() for ligne in [Link]()]
print(lire_fichier_vers_liste("[Link]"))
def compter_lignes_fichier(nom_fichier):
with open(nom_fichier, "r", encoding="utf-8") as f:
return len([Link]())
print(compter_lignes_fichier("[Link]"))
def compter_mots_fichier(nom_fichier):
with open(nom_fichier, "r", encoding="utf-8") as f:
contenu = [Link]()
return len([Link]())
print(compter_mots_fichier("[Link]"))
copier_fichier("[Link]", "copie_nombres.txt")
def compter_caracteres_fichier(nom_fichier):
with open(nom_fichier, "r", encoding="utf-8") as f:
return len([Link]())
print(compter_caracteres_fichier("[Link]"))
import json
def sauvegarder_dict_json(nom_fichier, dictionnaire):
with open(nom_fichier, "w", encoding="utf-8") as f:
[Link](dictionnaire, f, indent=4, ensure_ascii=False)
import json
def charger_dict_json(nom_fichier):
with open(nom_fichier, "r", encoding="utf-8") as f:
return [Link](f)
print(charger_dict_json("[Link]"))
import json
def ajouter_entree_json(nom_fichier, cle, valeur):
with open(nom_fichier, "r", encoding="utf-8") as f:
data = [Link](f)
data[cle] = valeur
with open(nom_fichier, "w", encoding="utf-8") as f:
[Link](data, f, indent=4, ensure_ascii=False)
import json
def supprimer_entree_json(nom_fichier, cle):
with open(nom_fichier, "r", encoding="utf-8") as f:
data = [Link](f)
if cle in data:
del data[cle]
with open(nom_fichier, "w", encoding="utf-8") as f:
[Link](data, f, indent=4, ensure_ascii=False)
supprimer_entree_json("[Link]", "ville")
import json
def fusionner_fichiers_json(fichier1, fichier2, resultat):
with open(fichier1, "r", encoding="utf-8") as f:
data1 = [Link](f)
with open(fichier2, "r", encoding="utf-8") as f:
data2 = [Link](f)
fusion = data1 + data2
with open(resultat, "w", encoding="utf-8") as f:
[Link](fusion, f, indent=4, ensure_ascii=False)
import json
def convertir_txt_en_json(fichier_txt, fichier_json):
with open(fichier_txt, "r", encoding="utf-8") as f:
lignes = [[Link]() for ligne in [Link]()]
with open(fichier_json, "w", encoding="utf-8") as f:
[Link](lignes, f, indent=4, ensure_ascii=False)
convertir_txt_en_json("[Link]", "[Link]")
import json
def convertir_json_en_txt(fichier_json, fichier_txt):
with open(fichier_json, "r", encoding="utf-8") as f:
data = [Link](f)
with open(fichier_txt, "w", encoding="utf-8") as f:
for element in data:
[Link](str(element) + "\n")
convertir_json_en_txt("[Link]", "[Link]")
import json
def sauvegarder_etudiants_json(nom_fichier, etudiants):
with open(nom_fichier, "w", encoding="utf-8") as f:
[Link](etudiants, f, indent=4, ensure_ascii=False)
import json
def statistiques_notes_fichier(nom_fichier):
with open(nom_fichier, "r", encoding="utf-8") as f:
etudiants = [Link](f)
notes = [e["note"] for e in etudiants]
return {
"moyenne": sum(notes) / len(notes),
"min": min(notes),
"max": max(notes)
}
print(statistiques_notes_fichier("[Link]"))
def tri_rapide(liste):
if len(liste) <= 1:
return liste
pivot = liste[len(liste) // 2]
gauche = [x for x in liste if x < pivot]
milieu = [x for x in liste if x == pivot]
droite = [x for x in liste if x > pivot]
return tri_rapide(gauche) + milieu + tri_rapide(droite)
def tri_fusion(liste):
if len(liste) <= 1:
return liste
milieu = len(liste) // 2
gauche = tri_fusion(liste[:milieu])
droite = tri_fusion(liste[milieu:])
resultat = []
i = j = 0
while i < len(gauche) and j < len(droite):
if gauche[i] <= droite[j]:
[Link](gauche[i]); i += 1
else:
[Link](droite[j]); j += 1
[Link](gauche[i:])
[Link](droite[j:])
return resultat
def calculer_expression_rpn(tokens):
pile = []
for token in tokens:
if token in ("+", "-", "*", "/"):
b = [Link]()
a = [Link]()
if token == "+": [Link](a + b)
elif token == "-": [Link](a - b)
elif token == "*": [Link](a * b)
elif token == "/": [Link](a / b)
else:
[Link](float(token))
return pile[0]
def parentheses_equilibrees(expression):
pile = []
paires = {")": "(", "]": "[", "}": "{"}
for c in expression:
if c in "([{":
[Link](c)
elif c in ")]}":
if not pile or [Link]() != paires[c]:
return False
return len(pile) == 0
print(parentheses_equilibrees("{[a+(b*c)]-d}")) # True
print(parentheses_equilibrees("(]")) # False
def infixe_vers_postfixe(expression):
priorite = {"+": 1, "-": 1, "*": 2, "/": 2}
sortie = []
pile = []
for token in [Link]():
if [Link]():
[Link](token)
elif token == "(":
[Link](token)
elif token == ")":
while pile and pile[-1] != "(":
[Link]([Link]())
[Link]()
else:
while pile and pile[-1] != "(" and [Link](pile[-1], 0) >=
priorite[token]:
[Link]([Link]())
[Link](token)
while pile:
[Link]([Link]())
return " ".join(sortie)
grille = [[0,0,1],[1,0,1],[0,0,0]]
print(bfs_labyrinthe(grille, (0,0), (2,2)))
Exercice 267. Écrire une fonction dijkstra(graphe, depart) qui calcule les distances
les plus courtes depuis un sommet dans un graphe pondéré (dictionnaire {sommet:
{voisin: poids}}).
import heapq
def dijkstra(graphe, depart):
distances = {sommet: float("inf") for sommet in graphe}
distances[depart] = 0
file_priorite = [(0, depart)]
while file_priorite:
dist_actuelle, sommet = [Link](file_priorite)
if dist_actuelle > distances[sommet]:
continue
for voisin, poids in graphe[sommet].items():
distance = dist_actuelle + poids
if distance < distances[voisin]:
distances[voisin] = distance
[Link](file_priorite, (distance, voisin))
return distances
graphe = {"A": {"B": 1, "C": 4}, "B": {"C": 2, "D": 5}, "C": {"D": 1}, "D": {}}
print(dijkstra(graphe, "A")) # {'A':0,'B':1,'C':3,'D':4}
g = {"A": "B", "B": "C", "C": "D", "D": "B"} # cycle B->C->D->B
print(detecter_cycle(g, "A")) # True
print(permutations_chaine("abc")) # ['abc','acb','bac','bca','cab','cba']
Exercice 270. Écrire une fonction récursive combinaisons(liste, k) qui génère toutes
les combinaisons de k éléments d’une liste.
print(plus_longue_sous_sequence_commune("ABCBDAB", "BDCABA")) # 4
Exercice 273. Écrire une fonction distance_levenshtein(s1, s2) qui calcule la
distance d’édition entre deux chaînes.
print(distance_levenshtein("kitten", "sitting")) # 3
def plus_longue_sous_sequence_croissante(liste):
if not liste:
return 0
dp = [1] * len(liste)
for i in range(1, len(liste)):
for j in range(i):
if liste[j] < liste[i]:
dp[i] = max(dp[i], dp[j] + 1)
return max(dp)
print(plus_longue_sous_sequence_croissante([10,9,2,5,3,7,101,18])) # 4
def verifier_sudoku_valide(grille):
def valide(sequence):
chiffres = [x for x in sequence if x != 0]
return len(chiffres) == len(set(chiffres))
# print(verifier_sudoku_valide(grille_9x9))
Exercice 277. Écrire une fonction n_reines(n) qui compte le nombre de solutions au
problème des n-reines par backtracking.
def n_reines(n):
solutions = [0]
def peut_placer(colonnes, ligne, col):
for l in range(ligne):
c = colonnes[l]
if c == col or abs(c - col) == abs(l - ligne):
return False
return True
resoudre([0] * n, 0)
return solutions[0]
print(n_reines(8)) # 92
Exercice 278. Écrire une fonction crible_eratosthene(limite) qui génère la liste des
nombres premiers jusqu’à limite grâce au crible d’Ératosthène.
def crible_eratosthene(limite):
est_premier = [True] * (limite + 1)
est_premier[0] = est_premier[1] = False
for i in range(2, int(limite ** 0.5) + 1):
if est_premier[i]:
for multiple in range(i * i, limite + 1, i):
est_premier[multiple] = False
return [i for i, premier in enumerate(est_premier) if premier]
print(crible_eratosthene(50))
import math
from functools import reduce
def pgcd_liste(liste_nombres):
return reduce([Link], liste_nombres)
print(ppcm_liste([4, 6, 8])) # 24
def est_matrice_magique(matrice):
n = len(matrice)
somme_reference = sum(matrice[0])
for ligne in matrice:
if sum(ligne) != somme_reference:
return False
for col in range(n):
if sum(matrice[l][col] for l in range(n)) != somme_reference:
return False
diag1 = sum(matrice[i][i] for i in range(n))
diag2 = sum(matrice[i][n-1-i] for i in range(n))
return diag1 == somme_reference and diag2 == somme_reference
print(est_matrice_magique([[2,7,6],[9,5,1],[4,3,8]])) # True
print(plus_court_chemin_grille([[0,0,0],[1,1,0],[0,0,0]])) # 5
Exercice 283. Écrire une fonction compresser_rle(chaine) qui compresse une chaîne
par Run-Length Encoding et ne conserve la version compressée que si elle est plus
courte.
def compresser_rle(chaine):
if not chaine:
return chaine
resultat = ""
compte = 1
for i in range(1, len(chaine) + 1):
if i < len(chaine) and chaine[i] == chaine[i-1]:
compte += 1
else:
resultat += chaine[i-1] + str(compte)
compte = 1
return resultat if len(resultat) < len(chaine) else chaine
print(compresser_rle("aaaaabbbccd")) # a5b3c2d1
Exercice 284. Écrire une fonction decoder_rle(chaine) qui décode une chaîne
compressée par Run-Length Encoding.
def decoder_rle(chaine):
resultat = ""
i = 0
while i < len(chaine):
lettre = chaine[i]
j = i + 1
nombre = ""
while j < len(chaine) and chaine[j].isdigit():
nombre += chaine[j]
j += 1
resultat += lettre * int(nombre)
i = j
return resultat
print(decoder_rle("a5b3c2d1")) # aaaaabbbccd
def evaluer_expression(chaine):
tokens = [Link]()
pile = [float(tokens[0])]
i = 1
while i < len(tokens):
op = tokens[i]
valeur = float(tokens[i + 1])
if op == "*":
pile[-1] *= valeur
elif op == "/":
pile[-1] /= valeur
elif op == "+":
[Link](valeur)
elif op == "-":
[Link](-valeur)
i += 2
return sum(pile)
def grouper_anagrammes(liste_mots):
groupes = {}
for mot in liste_mots:
cle = "".join(sorted(mot))
[Link](cle, []).append(mot)
return list([Link]())
print(grouper_anagrammes(["eat","tea","tan","ate","nat","bat"]))
# [['eat','tea','ate'], ['tan','nat'], ['bat']]
def parcours_infixe(arbre):
if arbre is None:
return []
return parcours_infixe(arbre["gauche"]) + [arbre["valeur"]] +
parcours_infixe(arbre["droite"])
arbre = None
for v in [5, 3, 8, 1, 4, 7, 9]:
arbre = inserer_abr(arbre, v)
print(parcours_infixe(arbre)) # [1, 3, 4, 5, 7, 8, 9]
Exercice 289. Écrire une fonction hauteur_arbre(arbre) qui calcule la hauteur d’un
arbre binaire représenté par des dictionnaires imbriqués {valeur, gauche, droite}.
def hauteur_arbre(arbre):
if arbre is None:
return 0
return 1 + max(hauteur_arbre(arbre["gauche"]), hauteur_arbre(arbre["droite"]))
Exercice 290. Écrire une fonction verifier_abr_valide(arbre) qui vérifie qu’un arbre
binaire respecte la propriété d’arbre binaire de recherche.
Exercice 291. Écrire une fonction simuler_pile(operations) qui simule une pile
(push/pop/peek) à partir d’une liste d’opérations et retourne l’état final.
def simuler_pile(operations):
pile = []
resultats = []
for operation in operations:
action = operation[0]
if action == "push":
[Link](operation[1])
elif action == "pop":
[Link]([Link]() if pile else None)
elif action == "peek":
[Link](pile[-1] if pile else None)
return pile, resultats
print(simuler_pile([("push",1),("push",2),("peek",),("pop",),("push",3)]))
# ([1, 3], [2, 2])
Exercice 292. Écrire une fonction simuler_file(operations) qui simule une file
(enfiler/défiler) à partir d’une liste d’opérations.
print(simuler_file([("enfiler",1),("enfiler",2),("defiler",),("enfiler",3)]))
# ([2, 3], [1])
def doublons_avec_positions(liste):
positions = {}
for i, element in enumerate(liste):
[Link](element, []).append(i)
return {element: pos for element, pos in [Link]() if len(pos) > 1}
print(statistiques_completes([2,4,4,4,5,5,7,9]))
import random
import string
def generer_mdp_securise(longueur=12):
if longueur < 4:
raise ValueError("Longueur minimale de 4 requise")
categories = [string.ascii_uppercase, string.ascii_lowercase, [Link],
"!@#$%^&*"]
mdp = [[Link](cat) for cat in categories]
tous_caracteres = "".join(categories)
mdp += [[Link](tous_caracteres) for _ in range(longueur - 4)]
[Link](mdp)
return "".join(mdp)
print(generer_mdp_securise(12))
def evaluer_force_mdp(mdp):
score = 0
if len(mdp) >= 8: score += 1
if len(mdp) >= 12: score += 1
if any([Link]() for c in mdp): score += 1
if any([Link]() for c in mdp): score += 1
if any(not [Link]() for c in mdp): score += 1
niveaux = {0: "Très faible", 1: "Faible", 2: "Moyen", 3: "Bon", 4: "Fort", 5:
"Excellent"}
return score, niveaux[score]
print(traiter_file_capacite(["t1","t2","t3","t4","t5"], 3))
def analyser_texte_complet(texte):
phrases = [p for p in [Link](".") if [Link]()]
mots = [Link]().split()
mots_nettoyes = ["".join(c for c in m if [Link]()) for m in mots]
mots_nettoyes = [m for m in mots_nettoyes if m]
frequences = {}
for m in mots_nettoyes:
frequences[m] = [Link](m, 0) + 1
mot_frequent = max(frequences, key=[Link]) if frequences else None
longueur_moyenne = sum(len(m) for m in mots_nettoyes) / len(mots_nettoyes) if
mots_nettoyes else 0
return {
"nb_mots": len(mots_nettoyes),
"nb_phrases": len(phrases),
"nb_caracteres": len(texte),
"mot_frequent": mot_frequent,
"longueur_moyenne_mots": round(longueur_moyenne, 2)
}
import json
class LivreIndisponibleError(Exception):
pass
class LivreInexistantError(Exception):
pass
else:
raise ValueError("Opération non reconnue")
return catalogue
biblio = {}
gerer_bibliotheque(biblio, "ajouter", titre="1984", exemplaires=2)
gerer_bibliotheque(biblio, "emprunter", titre="1984")
try:
gerer_bibliotheque(biblio, "emprunter", titre="Le Petit Prince")
except LivreInexistantError as e:
print("Erreur :", e)
print(biblio) # {'1984': {'exemplaires': 2, 'empruntes': 1}}