"""
Exercice 38 :
Écrire un programme qui calcule le résultat de f(x_1) @ f(x_2) @ f(x_3) @ ... @ f(x_n) 
sur les éléments x_1, ..., x_n d'un tableau, pour une fonction f et un opérateur @ quelconques. 
Appliquer cette nouvelle fonction calcul pour obtenir la représentation du contenu d'un tableau sous la forme d'une chaîne de charactère 
de la forme "1, 2, 3, 4", c'est à dire où les éléments sont séparés par des virgules.

Exercice 40:
Écrire une ofnction compose(f, g) qui reçoit en arguments deux fonctions f et g et renvoie leur composition, c'est_à-dire une fonction h telle que, pour tout x, h(x) est égale a f(g(x)).

Exercice 42:
Écrire la fonction repreter_delai(f,n,t) qui effectue n appels f(0), ..., f(n-1) où chaque appel à f est suivi d'une pause de t secondes. On pourra utiliser la fonction time.sleep(t) pour mettre le programme en pause t secondes.

Exercice 43:
Écrire une fonction temps_d_executon(f, x) qui prend en argument une fonction f et une valeur x et qui renvoie une paire formée du résultat de f(x) et du temps mis par ce calcul.
Pour mesurer ce temps, on pourra utliser la fonction time.perf_counter() ou la fonction time.time().
Mesurer le temps pris par la fonction boucle inutile sur l'argument 10000000.

"""

def boucle_inutile(n):
    k = 0
    for i in range(n):
        k = k +1

"""
Exercice 44:
La fonction temps_d_executon de l'exercice 43 n'accepte en argument que des fonctions à un argument, ainsi que l'argument sur lequel appeler la fonction.
Soit la fonction boucle_inutile2, indiquer comment utiliser la fonction temps_d_executon pour mesurer le temps de l'appel boucle_inutile2(1000, 10000), sans modifier aucune des deux fonctions.
"""

def boucle_inutile2(n, m):
    k = 0
    for i in range(n):
        for j in range(m):
            k = k + 1

"""
Exercice : For/map+filter/list comprehensions -> comparaison de vitesse

En partant d’une liste de n éléments (l=range(n)), on veut produire une nouvelle liste qui contient
1. e+1 pour tous les éléments e de la liste de départ ([0,1,2, ...]→[1,2,3, ...])
2. seulement les éléments pairs de la liste de départ ([0,1,2, ...]→[0,2,4, ...])
3. e+1 pour tous les éléments pairs e de la liste de départ ([0,1,2, ...]→[1,3,5, ...])
Pour chacun de ces cas, écrire
– Une version avec une boucle for
– Une version avec map et/ou filter
– Une version avec une list comprehension
Comparer les vitesses d’exécution de ces trois variantes dans chacun des trois cas, pour différentes
longueurs de listes.

"""
