Exercices de Programmation Python Avancés
1. Conversion entre un dictionnaire et une liste de tuples à l'aide de comprehensions :
dico_personne = {'nom': 'Alice', 'âge': 30, 'sexe': 'femme'}
liste_paires = [('nom', 'Alice'), ('âge', 30), ('sexe', 'femme')]
dico_vers_liste = [(clé, val) for clé, val in dico_personne.items()]
liste_vers_dico = {clé: val for clé, val in liste_paires}
2. Générateur pour une séquance infinie de nombres triangulaires (1, 3, 6, 10, ...) :
def generateur_triangles():
accumulateur = 0
compteur = 1
while True:
accumulateur += compteur
yield accumulateur
compteur += 1
gen_tri = generateur_triangles()
print(next(gen_tri)) # 1
print(next(gen_tri)) # 3
print(next(gen_tri)) # 6
print(next(gen_tri)) # 10
3. Calcul récursif de la suite de Fibonacci pour modéliser la croissance d'une population de lapins :
def fibonacci_pop(mois, ancien, nouveau):
if mois > 18:
return ancien
prochain = ancien + nouveau
resultat = fibonacci_pop(mois + 1, nouveau, prochain)
return resultat
total_lapins = fibonacci_pop(1, 0, 1)
print(total_lapins) # Nombre de lapins après 18 mois
4. Application de map avec une fonction lambda pour classifier des notes :
points = [52, 67, 93]
evaluations = list(map(lambda p: 'réussi' if p >= 60 else 'échoué', points))
print(evaluations) # ['échoué', 'réussi', 'réussi']
5. Utilisation de reduce pour calculer une somme cumulative :
from functools import reduce
somme_totale = reduce(lambda a, b: a + b, [52, 67, 93])
print(somme_totale)
6. Affichage des représentations binaire, octale et hexadécimale d'un nombre :
valeur = 128
print(bin(valeur))
print(oct(valeur))
print(hex(valeur))
7. Démonstration de fonctions intégrées : sum, pow, callable
print(sum([52, 67, 93]))
print(pow(13, 7))
print(callable(sum)) # Vérifier si un objet est appelable
8. Itération avec une boucle for sur divreses structures de données :
# Listes
seq_liste = [10, 20, 30, 40]
for item in seq_liste:
print(item)
# Tuples
seq_tuple = (100, 200, 300)
for item in seq_tuple:
print(item)
# Dictionnaires
dico_iter = {'x': 5, 'y': 10, 'z': 15}
for cle in dico_iter:
print(cle, dico_iter[cle])
# Utilisation d'enumerate pour obtenir l'indice
for idx, val in enumerate(seq_liste):
print(idx, val)
# Itération sur les valeurs et paires clé-valeur
for val in dico_iter.values():
print(val)
for cle, val in dico_iter.items():
print(cle, val)
9. Implémentaiton d'une fonction range personnalisée à l'aide d'un générateur :
def ma_range(start, stop=None, step=1):
if stop is None:
stop = start
start = 0
courant = start
if step > 0:
while courant < stop:
yield courant
courant += step
elif step < 0:
while courant > stop:
yield courant
courant += step
else:
raise ValueError("Le pas ne peut pas être nul")
# Exemples d'utilisation
for n in ma_range(5):
print(n) # 0,1,2,3,4
for n in ma_range(5, 10):
print(n) # 5,6,7,8,9
for n in ma_range(5, 10, 2):
print(n) # 5,7,9
for n in ma_range(10, 5, -2):
print(n) # 10,8,6
for n in ma_range(10, 5): # Aucune sortie car step positif et stop < start
print(n)