Les conteneurs 2 : Tuples
Tuples
Les chaînes de caractères permettent de stocker des caractères exclusivement, les tuples sont un moyen de stocker des données de toutes sortes.
Exemple
On travaille dessus comme pour les chaînes de caractères, la fonction len donne la longueur, on accède aux éléments à l'aide des indices, et on peut faire des slices. Comme une chaîne de caractères un tuple est immuable (on ne peut changer les éléments d'un tuple).
On utilise les tuples de plusieurs manières :
Affectations multiples.
Considérons l'exemple suivant
Exemple
a,b,c = 4,5,"bonjour"
print(a)
print(b)
print(c)
# idéal pour échanger le contenu de deux variables.
a,c = c,a
print(a)
print(c)
# C'est mieux que
tmp = a
a = c
c = tmp
Run
Retourner plusieurs valeurs.
Considérons l'exemple suivant
Exemple
def ordonne(a,b):
return min(a,b),max(a,b)
a,b = ordonne(2,3)
print(a,b)
print(ordonne(5,4))
Run
Accepter un nombre indéfini de paramètres.
Exemple
def maximum(*nombres):
assert len(nombres)>0
maxi = nombres[0]
place = 0
for i in range(1,len(nombres)):
if nombres[i] > maxi:
maxi = nombres[i]
place = i
return maxi,place
print(maximum(1,2,3))
t = (3,2,1)
print(maximum(*t))
Run
Il faut écrire *nombres et pas nombre car sinon la fonction attend un paramètre.
Le assert est là pour déclencher volontairement une erreur si on ne donne pas de paramètres, il vaut mieux avoir une erreur qu'un comportement aléatoire. Le python offre une gestion des erreurs très pratique (contrairement au C) mais qui n'est pas au programme.
Algorithme sur les conteneurs : Trouver les extremums
Algorithme
Un algorithme classique et très courant sur les conteneurs (donc sur les chaines) et le fait de trouver les extremums. On peut représenter l'algorithme de la facon suivante :
Il existe de nombreuses façons de l'implémenter en python, avec une boucle for ou while, par compréhension ou non. En voici différentes :
La version par compréhension est la plus simple, cependant si on ne demande plus le maximum mais la position du maximum alors on ne plus faire appelle à la compréhension.
Q.C.M.
Si t = "Bonjour",4,2.1,3 alors le type de t[2] est :
Une erreur.
Un tuple.
Un int.
Un double
Q.C.M.
Si t = "Bonjour","à","tous"," " alors "Bonjour à tous" est égal à :
t[1] + t[7] + t[3] + t[7] + t[5]
t[0] + t[6] + t[2] + t[6] + t[4]
t[0],t[3],t[1],t[3],t[2]
t[0]+t[3]+t[1]+t[3]+t[2]
Q.C.M.
Si t =1,2,3,4 alors t[1::2] est
2
(2,)
(2,3)
3
Q.C.M.
Si a,b,c = (4,2),"bonjour",2 alors a est égal à :
4
(4,2)
(4,)
(4,2),"bonjour,2
Exercices
Dans les exercices suivant, on se forcera à utiliser les indices des éléments d'un tuple(libre à vous de refaire les fonctions sans après où si vous avez terminé).
On donne p = (4,5,6,3,1), donnez sans utilisez Python :
On donne p = ( (1,2) , (3,2,1) , (1,5,7,6) , (8,2) ), donnez sans utilisez Python :
len(p).
len(p[-1])
p[2]
p[-2][-1]
p[0][1]
p[1][0]
On donne p = ( 1 , 4, 5 , 7, 2 , 6), que va afficher
for i in range( len(p)) :
print(i)
for i in range(len(p)) :
print(p[i])
for i in range(3, -1, -1) :
print(p[i+1])
for i in range(0, len(p)//2, 2) :
print(p[i])
Faire une fonction compte_positif(*nombres) qui retourne le nombre de valeurs positives données en paramètre.
Faire une fonction donne_effectif_valeur( valeur , notes) qui donne l'effectif de la valeur données en paramètre.
Faire une fonction donne_nb_mentions( mention , notes) où mention est une chaîne de caractères égale à "AB", "B", "TB" et notes un tupple contenant des notes (par exemple (6,5,18,20,14,3). La fonction doit retourner le nombre de notes dans [12,14[ si mention est "AB", de notes entre [14;16[ si mention est "B" et de notes u dessus de 16 si mention est "TB", sinon la fonction retourne None.
Faire une fonction indice_maximum(*nombres) qui retourne l'indice du plus grand des nombres donnés en paramètre. (Si le maximum apparait plusieurs fois il faut donner l'indice le plus bas.
Faire une fonction indice_et_maximum(*nombres) qui retourne l'indice et la valeur du plus grand nombre donné en paramètre.
Faire une fonction minimum(*nombres) qui retourne le plus petit des nombres donnés en paramètre.
Faire une fonction etendue(*nombre) qui retourne l'étendue des nombres donnés en paramètre.
On donne la fonction suivante :
Que valent mystere(3,4,1,4,6) et mystere(1,2,3,4) ?
Que fait la fonction mystere ?
Peut on eviter d'utiliser la variable ind_max ?
Faire une fonction somme(*nombres) qui retourne la somme de tous les nombres données en paramètre. On peut compléter :
Faire une fonction de teste de la fonction précédente.
Utiliser la fonction précédente pour faire une fonction moyenne(*nombres) qui donne la moyenne des nombres.
Faire une fonction qui teste la fonction précédente.
Faire une fonction test_ordonnes(*nombres) qui retourne True si les nombres sont ordonnes croissant et False sinon. test_ordonnes(2,7,8) donne True par exemple. Indiction si i est l'indice d'un nombre donné en paramètre le nombre suivant à quel indice ? et si les nombres sont ordonnées croissant quelle inégalité y a t'il entre le nombre d'indice i et le nombre suivant ?
(dur) Faire une fonction test_unique(*nombres) qui teste si tous les nombres sont différents (True) ou non (False). PAr exemple test_unique(2,1,2) donne False.
Faire une fonction prochain_espace(chaine,nb) qui prend en paramètre une chaine de caractere et un nombre entier inférieur à la taille de la chaine et qui doit retourner l'indice du prochain espace (" ") de la chaine. Si mots = "bonjour à tous" alors prochain_espace(mot,0) = 7, prochain_espace(mot,2) = 7,prochain_espace(mot,7) = 9,prochain_espace(mot,9) = 14 (fin de la chaine comme un espace).
Faire une fonction qui teste la fonction précédente.
Faire une fonction separe(chaine) qui prend une chaine en paramètre et qui va retourner les différents mots qui compose la chaine (on suppose que les mots sont séparés par des espaces). Par exemple separe("bonjour à tous") doit donner le tuple (bonjour","à","tous"). Il faut bien sur utiliser la fonction procahin espace et utiliser le slicing.
Faire une fonction qui teste la version précédente.
Solutions
phpMyVisites | Open source web analytics