TP 1 : Révisions Python
Contents
TP 1 : Révisions Python#
Calcul#
Question
Écrire une fonction somme(n) renvoyant \(\sum_{i=1}^n \sqrt{i}\).
Solution
def somme(n):
    s = 0
    for i in range(n + 1):
        s += i**.5
    return s
somme(100000)
21082008.973917928
Question
Écrire une fonction somme_riemann(f, a, b, n) renvoyant \(\frac{b - a}{n}\sum_{k=0}^n f(a + k \frac{b-a}{n})\).
Solution
def somme_riemann(f, a, b, n):
    s = 0
    for i in range(n + 1):
        s += f(a + (b-a)*i/n)
    return s*(b - a)/n
def f(x): # pour tester
    return x**.5
somme_riemann(f, 0, 10, 1000)
21.097455887480724
Question
Écrire une fonction fact(n) renvoyant \(n!\).
Solution
def fact(n):
    p = 1
    for i in range(2, n + 1):
        p *= i
    return p
fact(5)
120
Question
Écrire une fonction borne(p) renvoyant le plus petit entier \(n\) tel que \(2^n > p\).
Solution
def borne(p):
    n = 0
    while 2**n <= p:
        n += 1
    return n
borne(100000)
17
Question
Écrire une fonction nombre(n) renvoyant le nombre d’entiers entre \(0\) et \(n\) qui sont multiples de \(3\) ou de \(5\).
Solution
def nombre(n):
    s = 0
    for i in range(n):
        if i % 3 == 0 or i % 5 == 0:
            s += 1
    return s
nombre(100000)
46667
Tuples#
Question
Écrire une fonction distance(p1, p2) renvoyant la distance euclidienne entre les points p1 et p2, où p1 et p2 sont des couples.
On rappelle qu’on peut accéder aux éléments d’un tuple comme pour une liste (p[0] pour le 1er élément, par exemple).
Solution
def distance(p1, p2):
    return ((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2)**.5
distance((0, 0), (3, 4))
5.0
Listes#
Question
Écrire une fonction syracuse(a) renvoyant la liste des \(u_k\) définies par la suite suivante, où on arrêtera de calculer les termes de la suite dès que l’on obtient \(1\) :
Solution
def syracuse(a):
    L = [a]
    while L[-1] != 1:
        if L[-1] % 2 == 0:
            L.append(L[-1] // 2)
        else:
            L.append(3 * L[-1] + 1)
    return L
syracuse(3) # [3, 10, 5, 16, 8, 4, 2, 1, 4, 2]
[3, 10, 5, 16, 8, 4, 2, 1]
Question
Écrire une fonction suite2(n) renvoyant le couple \((u_n, v_n)\) où :
Solution
def suite2(n):
    un, vn = 3, 2
    for i in range(n):
        un, vn = 2*un + 4*vn, un - vn
    return un, vn
suite2(4)
(308, 97)
Question
Écrire une fonction moyenne(L) qui renvoie la moyenne des éléments de la liste L.
Solution
def moyenne(L):
    s = 0
    for x in L:
        s += x
    return s / len(L)
moyenne([9, 2, 8, 4, 5]) # 5.6
5.6
Question
Écrire une fonction variance(L) qui renvoie la variance des éléments de la liste L, donnée par \(\frac{1}{n}\sum_i (L[i] - m)^2\) où \(m\) est la moyenne de L.
On évitera de calculer plusieurs fois la moyenne.
Solution
def variance(L):
    m = moyenne(L)
    s = 0
    for x in L:
        s += (x - m) ** 2
    return s / len(L)
variance([9, 2, 8, 4, 5]) # 6.64
6.640000000000001
Question
Écrire une fonction inverse(L) qui renvoie la liste des éléments de L dans l’ordre inverse.
Solution
def inverse(L):
    L2 = []
    for i in range(len(L)):
        L2.append(L[len(L) - i - 1])
    return L2
# autre solution
def inverse(L):
    return L[::-1]
inverse([1, 2, 3, 4, 5]) # [5, 4, 3, 2, 1]
[5, 4, 3, 2, 1]
Question
Écrire une fonction positifs(L) qui renvoie la liste des éléments de L strictement positifs.
Solution
def positifs(L):
    L2 = []
    for x in L:
        if x > 0:
            L2.append(x)
    return L2
positifs([1, -2, 3, -4, 5, -6, 7, -8, 9, -10])
[1, 3, 5, 7, 9]
Question
Écrire une fonction tous_pairs(L) qui renvoie True si tous les éléments de L sont pairs, False sinon.
Solution
def tous_pairs(L):
    for x in L:
        if x % 2 != 0:
            return False
    return True
print(tous_pairs([2, 4, 6, 8, 10])) # True
print(tous_pairs([2, 4, 6, 8, 10, 11])) # False
True
False
Question
Écrire une fonction croissante(L) qui renvoie True si les éléments de L sont dans l’ordre croissant, False sinon.
Solution
def croissante(L):
    for i in range(len(L) - 1):
        if L[i] > L[i + 1]:
            return False
    return True
print(croissante([1, 2, 3, 4, 5])) # True
print(croissante([1, 2, 3, 4, 3])) # False
True
False
Question
Écrire une fonction concatene(L1, L2) renvoyant une liste composée des éléments de L1 suivis des éléments de L2.
Solution
def concatene(L1, L2):
    L = []
    for x in L1:
        L.append(x)
    for x in L2:
        L.append(x)
    return L
concatene([1, 2, 3], [4, 5, 6])
[1, 2, 3, 4, 5, 6]
Question
Écrire une fonction separe(L) qui renvoie un couple de deux listes, la première contenant les éléments d’indices pairs de L et la seconde les éléments d’indices impairs.
Solution
def separe(L):
    L1 = []
    L2 = []
    for x in L:
        if x % 2 == 0:
            L1.append(x)
        else:
            L2.append(x)
    return L1, L2
separe([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
([2, 4, 6, 8, 10], [1, 3, 5, 7, 9])
Question
Écrire une fonction produit_scalaire(u, v) renvoyant le produit scalaire de u et v, où u et v sont des listes de même longueur.
Solution
def produit_scalaire(u, v):
    s = 0
    for i in range(len(u)):
        s += u[i] * v[i]
    return s
produit_scalaire([1, 2, 3], [4, 5, 6]) # 32
32
Matrices#
Dans les questions suivantes, il est interdit d’utiliser numpy.
Question
Écrire une fonction creer_matrice(n, p, x) qui renvoie une matrice de taille à \(n\) lignes, \(p\) colonnes dont tous les éléments sont égaux à x.
Solution
def creer_matrice(n, p, x):
    M = []
    for i in range(n):
        L = []
        for j in range(p):
            L.append(x)
        M.append(L)
    return M
creer_matrice(3, 4, 2)
[[2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2]]
Question
Écrire une fonction matrice_identite(n) qui renvoie la matrice identité de taille \(n\).
Solution
def matrice_identite(n):
    M = creer_matrice(n, n, 0)
    for i in range(n):
        M[i][i] = 1
    return M
matrice_identite(4)
[[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]
Question
Écrire une fonction transposee(M) qui renvoie la transposée de la matrice M.
Solution
def transposee(M):
    n = len(M)
    p = len(M[0])
    Mt = creer_matrice(p, n, 0)
    for i in range(n):
        for j in range(p):
            Mt[j][i] = M[i][j]
    return Mt
transposee([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
Question
Écrire une fonction egal(M1, M2) qui renvoie True si les matrices M1 et M2 sont égales, False sinon.
Solution
def egal(M1, M2):
    n = len(M1)
    p = len(M1[0])
    for i in range(n):
        for j in range(p):
            if M1[i][j] != M2[i][j]:
                return False
    return True
print(egal([[1, 2, 3], [4, 5, 6], [7, 8, 9]], [[1, 2, 3], [4, 5, 6], [7, 8, 9]])) # True
print(egal([[1, 2, 3], [4, 5, 6], [7, 8, 9]], [[1, 2, 3], [4, 5, 6], [7, 8, 10]])) # False
True
False
Question
Écrire une fonction symetrique(M) qui renvoie True si la matrice M est symétrique, False sinon.
Solution
def symetrique(M):
    return egal(M, transposee(M))
print(symetrique([[1, 2, 3], [2, 4, 5], [3, 5, 6]])) # True
print(symetrique([[1, 2, 3], [2, 4, 7], [3, 5, 6]])) # False
True
False