TP2 : corrigé

## Boucles for
def sumcubes(N:int)->int:
    S=0
    for k in range(N+1):
        S=S+k**3
    return S

from math import cos,pi
def sommecos(N):
    S=0
    for k in range(N+1):
        S=S+cos(2*k*pi/N)
    return S

def fact(N:int)->int:
    p=1 # produit vide
    for i in range(1,N+1):
        p=p*i
    return p

def suite(N):
    u=0 # on initialise à u0
    for n in range(N): #on appl. la rel. de réc. N fois
        u=cos(u)
    return u


## Listes
def zeros(n):
    L=[]
    for i in range(n):
        L.append(0)
    return L

def zeros2(n):
    return n*[0]  # version courte mais c'est très spécifique à Python

def miroir(L):
    N=len(L)
    M=[]
    for i in range(1,N+1):
        M.append(L[N-i])
    return M

def miroir2(L):
    #version 'en place' : modifie la liste entrée
    N=len(L)
    for i in range(N//2):
        L[i], L[N-i-1]=L[N-i-1], L[i]
    return L





# Liste des cubes des entiers de 1 à 20
L = [i**3 for i in range(21)]


def somme(L):
    S=0
    for x in L:
        S=S+x
    return S

def moyenne(L):
    return somme(L)/len(L)


def moycoeff(L,C):
    assert len(L)==len(C)
    S=0
    for i in range(len(L)):
        S=S+L[i]*C[i]
    return S/somme(C)



def sommetermeaterme(L,M):
    assert len(L)==len(M)
    N=[]
    for i in range(len(L)):
        N.append(L[i]+M[i])
    return N

def sommetermeaterme2(L,M):
    #version rapide, en compréhension
    assert len(L)==len(M)
    return [L[i]+M[i] for i in range(len(L)) ]

def valeurs_suite(N):
    L=[]
    for i in range(N+1):
        L.append(suite(i))
    return L

# Pour calculer u2 on calcule u0,u1,u2. Pour calculer u3 on recalcule tout ça plus u3... Pas malin !

def valeurs_suite2(N):
    L=[] # on initialise une liste vide
    u=0 # on initialise à u0
    for n in range(N):
        L.append(u) # on ajoute le terme et ...
        u=cos(u) # ... on calcule le suivant
    return L


def rech(L:list,e:int)->int:
    for x in L:
        if x==e: return True
    # Arrivé ici : pas de e dans L
    return False

def maxi(L):
    a=L[0]
    for x in L:
        if x>a: a=x
    return a

def valide(c):
    for l in c:
        if l!='a' and l!='t' and l!='g' and l!='c':
            return False
    return True


def supprime(c,e):
    assert len(e)==1
    chaine = ''
    for lettre in c:
        if lettre!=e:
            chaine=chaine+lettre
    return chaine

##Q18
L=[5,1,4,7,9,8]
L1=L[1:len(L)]
L2=L[0:len(L)-1]

##Q19
c='coucou'
c2=10*c

##20
# On ne peut pas modifier c[0] ou t[0] : t et c sont non mutables.

##21
# Quand on modifie L ça modifie aussi M. En fait L et M pointent vers le même objet en mémoire. Avec L.copy() on règle ce problème, M est une nouvelle liste.