
##Exercice 1

#Créer une liste
l = [9, 2, 5, 7, "chat", 16, 7, 8]

#Taille de la liste
n = len(l)

#Lire un élément
print(l[0])     #Premier élément
print(l[1])
print(l[n - 1]) #Dernier élément
print(l[-1])    #Dernier élément (variante pratique))

#print(l[n])     #Erreur due à un dépassement (=out of range)

#Modifier un élément
l[2] =-6



##Exercice 2.3
def somme(l):

    n = len(l)
    s = 0
    for i in range(n):
        s += l[i]
    return s

##Exercice 2.4
def moy(l):

    return somme(l)/len(l)

##Exercice 2.5
def nbpos(l):

    n = len(l)
    nb = 0
    for i in range(n):
        if l[i] > 0 :
            nb += 1

    return nb


##Exercice 4.1
def carres(n) :
    l = []

    for i in range(n):
        l.append(i**2)

    return l


##Exercice 4.2
def licon(n,c):

    l = []

    for i in range(n):
        l.append(c)

    return l

#Variante
def licon(n,c):

    return [c]*n

##Exercice 5
def rech_seq(t, x) :

    for i in range(len(t)):
        if t[i] == x :
            return i       #Dès qu'on trouve l'élément, on renvoie son indice. Le return stoppe la fonction immédiatement.

    return None

#Dans le pire des cas : len(t) comparaisons
#Le pire des cas est celui où l'élément recherché est le dernier de la liste ou n'est pas présent.


##Exercice 6

def ispos(l):
    for x in l : #Cette syntaxe permet de balayer directement les éléments d'une liste (sans utiliser les indices)
        if x < 0 :
            return False #Dès qu'on trouve un élément négatif, on SAIT que la liste n'est pas positive. Le return stoppe la fonction immédiatement
    return True          #Pour savoir si une liste est positive, il faut avoir vérifié tous les termes et donc attendre la fin de la boucle


##Exercice 7
def ppi(l):
    k = 0
    while l[k] != 0 :
        k+=1
    return k

def ppibis(l):
    k = 0
    while k < len(l) and l[k] != 0 : #Si la liste ne contient aucun élément nul, k va augmenter jusqu'à devenir égal à len(t) (=out of range). On doit donc cesser la boucle dès que cela arrive. L'ordre des conditions est important.
        k+=1
    return k


##Exercice 8
def sommepos(l):
    s = 0
    for i in range(len(l)):
        if l[i] > 0 :
            s += l[i]

    return s

##Exercice 9
def termespairs(l) :
    lpair = []
    for x in l :
        if x%2 == 0 : #Si le reste de la division par 2 est nul, le terme est pair
            lpair.append(x)

    return lpair

##Exercice 10
def invlis(l):
    n = len(l)
    linv = []
    for i in range(n):
        linv.append(l[-1-i]) #Indice -1 : dernier terme, indice -2 : avant dernier terme, etc...

    return linv

#Variante
def invlis2(l):
    n = len(l)
    linv = []
    for i in range(n-1,-1,-1): #Le pas de -1 permet de balayer à l'envers
        linv.append(l[i])

    return linv

##Exercice 12
def indlis(l,x):
    lx = []
    n = len(l)
    for i in range(n):
        if l[i] == x :
            lx.append(i)
    return lx









