223 | 234 |
---|---|
1-4 |
@0 Préparer une présentation orale résumant 2 à 3 notions abordées lors de la dernière séance de cours :
Jusqu’à présent, nous avons manipulé des variables avec des types simples : int
, bool
, float
. Ce sont des conteneurs (ou structures) ne contenant qu’une seule valeur.
Nous avons aussi utilisé des variables de type str
qui :
Le type str
en Python est ce qu’on appelle une chaîne de caractère et appartient à la famille des structures de données appelées séquences, mais il n’est pas le seul. Il existe aussi les p-uplets et les tableaux.
Les séquences sont donc des types de variables qui permettent à l’utilisateur de stocker plusieurs données les unes après les autres. Ainsi, on peut effectuer sur une séquence, des actions comme examiner et manipuler les éléments stockés.
Définitions :
for
) sur celle-ci. Autrement dit on peut parcourir chaque élément d’une séquence à l’aide d’une boucle for
.Nous allons étudier plus particulièrement 2 types de séquences : les p-uplets et les tableaux (il en existe d’autres que nous évoquerons en terminale). Mais avant cela, revoyons déjà ce que permettent les séquences dites chaînes de caractères utilisées dans Python via le type str
.
Les variables str
sont utilisés pour créer et stocker des chaînes immutables (c’est-à-dire des variables qui ne changent pas une fois qu’ils sont créés). Python fournit une grande variété d’outils et de techniques de programmation que vous pouvez utiliser pour examiner et manipuler les chaînes de caractères.
nom="NSI"
for carac in nom
print (carac)
Ce qui produit:
N
S
I
nom="NSI"
print(nom[2])
Ce qui produit:
I
len()
renvoie la longueur d’une chaîne de caractères.
nom="NSI"
taille = len(nom)
print ("Le nom", nom, "a une longueur de", taille, "caractères.")
Ce qui produit:
Le nom NSI a une longueur de 3 caractères.
Remarque : Il existe de nombreuses fonctions associées aux chaînes de caractères que nous découvrirons au fil des besoins d’utilisation…
Nous allons, à présent, étudier plus particulièrement 2 types de séquences : les p-uplets et les tableaux qui possèdent beaucoup de similitudes avec les chaînes de caractères et aussi des différences à bien connaitre.
Définition : Un p-uplet est une séquence immutable. C’est-à-dire une suite indexée de valeurs (de n’importe quel type) que l’on ne peut pas modifier une fois crée.
En Python, un p-uplet est de type tuple
.
tuple
Un tuple
est défini à l’aide de parenthèses.
tuple
:
monTuple1=() # commentaire
monTuple2=(3,) # commentaire
monTuple3=(1,4,5,'moto',4.6)
monTuple4=monTuple2+monTuple3 # commentaire
print(monTuple4) # commentaire
print(type(monTuple1)) # commentaire
monTuple5=monTuple2*5 # commentaire
print(monTuple5) # commentaire
@1 Tester puis commenter les exemples ci-dessus, à l’aide de PythonTutor :
tuple
On accède à un élément d’un tuple
à l’aide de crochets.
tuple
:
monTuple=(3, 1,4,5,'moto',4.6)
print(monTuple[2]) # commentaire
print(monTuple[0]) # commentaire
print(monTuple[-1]) # commentaire
print(monTuple[2:4]) # commentaire
@2 Tester puis commenter les exemples ci-dessus, à l’aide de PythonTutor :
@3 On considère le tuple
suivant : monTuple=(1,4,5,'moto',(12,'nsi','génial'),4.6)
. Ecrire les lignes de code correspondant aux commentaires ci-dessous :
monTuple=(1,4,5,'moto',(12,'nsi','génial'),4.6)
# affiche moto
# affiche le dernier élément du tuple 4.6
# affiche (4,5)
# affiche ('nsi','génial')
tuple
Comme un tuple
est un immutable (voir définition plus haut), on ne peut pas réaffecter ses éléments, supprimer un élément ou encore en ajouter. Autrement dit, on peut réaffecter (ou “modifier”) un tuple
mais pas ses éléments.
monTuple=(1,4,5,'moto',4.6) # commentaires
monTuple[3]='vive la moto !' # commentaires
monTuple=('A','B', 3,14) # commentaires
monTuple=monTuple[0:2] # commentaires
@4 Tester puis commenter les exemples ci-dessus, à l’aide de PythonTutor :
@5 Compléter le code ci-dessous permettant d’afficher tous les éléments d’un tuple
à l’aide d’une boucle for
monTuple=(5,4,2,8,"moto")
for i in ... : # i parcourt tous les indices de la séquence "monTuple"
print(monTuple[i])
En réalité il est beaucoup plus simple de parcourir tous les éléments d’une séquence (ici d’un p-uplet). En effet en Python la boucle for
ne sert pas qu’à parcourir une séquence de nombres entiers, mais permet de parcourir n’importe quelle séquence, c’est-à-dire n’importe quel tuple
.
Comme un tuple
est itérable (voir défiition d’une séquence), on peut organiser une itération dessus. Autrement dit on peut parcourir chaque élément d’un tuple
à l’aide d’une boucle for
.
monTuple=(5,4,2,8,"moto")
for element in monTuple : # element prend à chaque tour les éléments de la séquence
print(element) #
Ainsi, la ligne for element in monTuple :
signifie littéralement :
element
monTuple
Reprenons la boucle for
du @4
monTuple=(5,4,2,8,"moto")
for i in range(len(monTuple)): # i parcourt tous les indices de la séquence "monTuple"
print(monTuple[i])
@6 Remplaçer monTuple[i]
par i
, puis tester puis commenter les exemples ci-dessus, à l’aide de PythonTutor :
Remarque : On peut donc en conclure que range(nombre) est un tuple
ou plutôt se comporte comme un tuple
.
@7 Créer une boucle for
affichant les entiers de 1 à 9 et commenter le code.
@8 Tester puis commenter les exemples ci-dessous, à l’aide de PythonTutor :
Remarque : On peut donc en conclure que la fonction toto() est un tuple
ou plutôt renvoie un tuple
au terme de son exécution.
def toto ():
return 1,2,3
print(toto())
print(type(toto()))
for i in toto() :
print(i)
Considérons s
une séquence de type tuple
:
Opérations/méthodes | Description |
---|---|
x in s |
Renvoie True si un élément de s est égal à x , False sinon |
x not in s |
Renvoie True si aucun un élément de s n’est égal à x , False sinon |
len(s) |
Renvoie le nombre d’éléments de s |
s == t |
Renvoie True si s et t sont de même type, ont la même longueur, et ont des éléments égaux deux à deux. |
s[i] |
Renvoie l’élément d’indice i de s . Le premier élément a pour indice 0 . |
s[i:j] |
Renvoie une partie de l’indice i à j non inclus |
s.index(x) |
Renvoie l’indice de la première apparition de x dans s |
s.count(x) |
Renvoie le nombre d’apparitions de x dans s |
s + t |
Renvoie une nouvelle séquence concaténation de s et t . |
n * t |
Renvoie une nouvelle séquence composée de la concaténation de t avec lui-même n fois. |
jours_1=('lundi','mardi','mercredi','jeudi','vendredi')
jours_2=('samedi','dimanche')
# Tester si samedi est un élément de jours_1
# Donner la longueur de jours_2
# Tester si jours_1 est égal à jours_2
# Donner la partie de jours_1 entre le deuxième élément et le quatrième élément
# renvoyer l'indice de dimanche dans jours_2
# Renvoyer le nombre de samedi dans jours_2
# Créer un tuple semaine par concaténation de jours_1 et de jours_2
@9 Compléter le code ci-dessus en utilisant les méthodes et les opérations du tableau pour réaliser les différentes actions précisées dans les commentaires. Tester le script sur un éditeur Python sur l’ordinateur ou en ligne comme Trinket ou Thonny Python
:
@10 Ecrire une fonction est_dans()
qui reçoit, en argument, un entier element
et un tuple d’entier tple
et renvoie un booléen indiquant la présence de element
dans tple
, puis tester :
@11 Ecrire une fonction tri()
qui accepte comme paramètre en entrée, trois nombres a
, b
et c
et renvoie en sortie ces trois mêmes nombres mais triés par ordre croissant.
def tri(a, b, c) :
...
return ...
print(tri(5, 9, 3.14))
def tri (a, b, c) :
if a<b:
if b<c:
tple=(a,b,c)
elif c<a :
tple=(c,a,b)
else :
tple=(a,c,b)
else :
...
return tple
print(tri(5, 9, 3.14))
Définition : Un tableau dynamique est une séquence mutable. C’est-à-dire une suite indexée de valeurs (de n’importe quel type) que l’on peut modifier.
list
.list
) sont dynamiques, cela veut dire qu’ils ont la particularité d’avoir une taille variable alors que les autres langages de programmation utilisent, par défaut, des tableaux de taille fixe.list
.Une list
est définie à l’aide de crochets.
tuple
convertis en list
:tab1=[] # ...
tab2=[3] # ...
tab3=[1,4,5,'moto',4.6]
tab4=tab2+tab3 # ...
print(tab4) # ...
print(type(tab1)) # ...
tab5=tab2*5 # ...
print(tab5) # ...
@12 Tester le script ci-dessus avec un éditeur Python sur l’ordinateur ou en ligne comme Trinket ou Thonny Python
, puis rédiger les commentaires associés.
On accède à un élément d’une list
à l’aide de crochets, comme pour le type tuple
.
tuple
mais en version list
:tab4=[3, 1,4,5,'moto',4.6]
print(tab4[2]) #
print(tab4[0]) #
print(tab4[-1]) #
print(tab4[2:4]) #
@13 Tester puis commenter les exemples ci-dessus.
list
Comme une list
est mutable (voir définition plus haut), on peut donc réaffecter ses éléments, supprimer un élément ou encore en ajouter.
list
:
mon_tableau=[5,4,"A",8,"moto"]
mon_tableau = mon_tableau + [35] # Ajoute un élément à la fin du tableau
mon_tableau += [36] # Ajoute un élément à la fin du tableau
print(mon_tableau)
mon_tableau[2]= 5 # Modifie l'élément d'indice 2
print(mon_tableau)
@14 Dans les exemples ci-dessus, quelle ligne aurait provoqué une erreur si la variable avait été de type tuple
au lieu de list
? Pourquoi ?
La ligne 7 modifie une partie du tableau (list) mon_tableau car un tableau (list) est mutable. On ne peut pas modifier l"intérieur" d’un tuple (le muter !)
list
Comme une list
est itérable (voir défiition d’une séquence), on peut organiser une itération dessus. Autrement dit on peut parcourir chaque élément d’une list
à l’aide d’une boucle for
.
@15 Compléter le code ci-dessous permettant d’afficher tous les éléments d’une list
à l’aide d’une boucle for
tab=[5,4,2,8,"moto"]
for ... in ... :
print(...)
Ainsi, la ligne for bidule in tab :
signifie littéralement :
bidule
(on choisi le nom de varaible que l’on veut, mais un nom de variable element
aurait été plus adapté)tab
@15 bis Compléter le code ci-dessous permettant de faire la même chose que le programme précédant mais en utilisant range
dans la boucle for
tab=[5,4,2,8,"moto"]
for ... in range(...) :
print(...)
indice
à la place de truc
mais cela fonctionne.for element in tab
mais cela fonctionne aussi !!!La création en extension consiste à ajouter à la fin d’une liste (un tableau) existante un élément, exemples :
tab=[3,8,"mot",True]
print(tab)
tab = tab + [1001]
print(tab)
On peut ainsi créer une liste (un tableau) à l’aide d’une boucle for
:
tab=[]
for i in range (11) :
tab = tab + [2**i]
print(tab)
On peut aussi utiliser la fonction extend
qui permet d’ajouter un tableau à la fin d’un tableau. Attention à la manière d’appeler cette fonction qui doit être précédée du nom du tableau séparé par un point mon_tableau.extend(tableau_a_ajouter)
.
Remarque : On comprend bien que extend
signifie extension à la fin !!!
@16 A l’aide de la fonction extend
, ré-écrire le code de création par extension ci-dessus :
On peut aussi utiliser la fonction append
qui permet d’ajouter un élément à la fin d’un tableau. Attention à la manière d’appeler cette fonction qui doit être précédée du nom du tableau séparé par un point mon_tableau.append(element_a_ajouter)
.
@17 A l’aide de la fonction append
, ré-écrire le code de création par extension ci-dessus :
Comprendre :
Créer un tableau (list) par compréhension c’est faire en sorte que la ou les boucles for
permettant de remplir le tableau soient comprises (compréhension) dans la déclaration (création) du tableau. Une sorte de ligne de code “tout-compris”… est-ce bien compris ? Pas de problème de compréhension particulier ? ;-)
tab1=[2*x for x in range(10)]
tab2=[2*x+1 for x in range(10)]
tab3=[x**2 for x in range(10)]
@18 Traduire les scrypts Python ci-dessus en script de création par extension :
tab1=[]
for x in range(10):
tab1 = tab1 + ...
print(tab1)
tab2=[]
...
print(tab2)
tab3=[]
...
print(tab3)
@19 Ecrire deux scripts Python qui créent la liste (tableau) des entiers de 0 à 100 de deux méthodes différentes :
@20 Traduire les 3 scripts de l’exercice @18
en 3 scripts utilisant la fonction append()
tab1=[]
for x in range(10):
tab1.append(...)
print(tab1)
tab2=[]
...
print(tab2)
tab3=[]
...
print(tab3)
@21 Comprendre la construction de tableau ci-dessous et écrire un script créant le même tableau (list
) par extension.
import random
liste=[random.randint(1,6) for i in range(1000)]
@22 Comprendre la construction de tableau ci-dessous et écrire une instruction réalisant le même tableau (list
) par compréhension.
tab=[]
for i in range (10) :
tab = tab + ['i' * i]
Attention aux confusions :
extend()
.append()
, ouextend()
, ou+
tout-compris
!)@23 Rédiger un script créant un tableau de 10 éléments prenant tous la valeur 7
Correction :
@24 Comprendre et expliquer la différence entre ['a'] * 5
et ['a' * 5]
. Puis remplacer 'a'
par 3
et compléter l’explication de la différence de construction de la liste (tableau).
['a'] * 5
génère une liste avec 5 éléments 'a'
donc ['a', 'a', 'a', 'a', 'a']
, alors que['a' * 5]
génère une liste de 1 élément composé de 5 caractères 'a'
donc ['aaaaa']
[3] * 5
génère une liste avec 5 éléments 3
donc [3, 3, 3, 3, 3]
, alors que[3 * 5]
génère une liste de 1 élément produit de par donc [15]
Création par compréhension veut dire “créer une liste en une seule ligne”, donc les méthodes ci-dessus sont des créations par extension aussi !
@25 Créer une fonction permettant de compter le nombre d’éléments d’une liste (sans utiliser la fonction len()
).
def compteElements (liste):
...
for element in liste :
...
return nbElements
tab=["a","b","c",56432243,43,1345,4,3,7]
print(compteElements(tab))
@26 Créer une fonction permettant de compter le nombre d’occurences (d’apparitions) d’un élément dans une liste (sans utiliser la fonction count()
).
def nombreOccurences(element,liste):
pass
return nbOccurences
tab=["a","b","c",56432243,43,1345,4,3,7,'b']
print(nombreOccurences('b',tab))
@27 Créer une fonction permettant trouver l’indice d’un élément donné dans une liste (sans utiliser la fonction index()
).
En trichant “un petit peu” avec l’aide de len()
on obtient :
def indiceElement (liste, recherche):
for indice in range(len(liste)) :
if liste[indice] == recherche:
return indice
tab=["a","b","c",56432243,43,1345,4,3,7,'b']
indiceElement(tab,'b')
def indiceElement (liste, recherche):
pass
tab=["a","b","c",56432243,43,1345,4,3,7,'b']
indiceElement(tab,'b')
@28 Créer une fonction permettant de supprimer un élément d’une liste, connaissant son indice.
Attention le programme ci-dessous fonctionne, correspond à une autre consigne !
def supprimeElement(liste, element):
newliste = []
for i in liste:
if i != element:
newliste += [i]
return newliste
tab=["a","b","c",56432243,43,1345,4,3,7,'b']
print(supprimeElement(tab,'b'))
def supprimeIndice(liste, indice) :
pass
tab=["a","b","c",56432243,43,1345,4,3,7,'b']
print(supprimeIndice(tab,1))
@29 Créer une fonction permettant d’inverser les éléments d’une liste, exemple : [1,2,3,4,5]
devient [5,4,3,2,1]
. Tester ensuite cette fonction à l’aide du simulateur PythonTutor.
def inverser(liste):
pass
maListe = [1,2,3,4,5]
print(inverser(maListe))
Important : On peut appliquer au type list
toutes les méthodes, fonctions et opérations du type tuple
.
Considérons s
une séquence de type list
:
Opérations/méthodes | Description |
---|---|
x in s |
Renvoie True si un élément de s est égal à x , False sinon |
x not in s |
Renvoie True si aucun un élément de s n’est égal à x , False sinon |
len(s) |
Renvoie le nombre d’éléments de s |
s == t |
Renvoie True si s et t sont de même type, ont la même longueur, et ont des éléments égaux deux à deux. |
s[i] |
Renvoie l’élément d’indice i de s . Le premier élément a pour indice 0 . |
s[i:j] |
Renvoie une partie de l’indice i à j non inclus |
s.index(x) |
Renvoie l’indice de la première apparition de x dans s |
s.count(x) |
Renvoie le nombre d’apparitions de x dans s |
s + t |
Renvoie une nouvelle séquence concaténation de s et t . |
n * t |
Renvoie une nouvelle séquence composée de la concaténation de t avec lui-même n fois. |
Attention : Le type list
possède en plus, des méthodes, fonctions et opérations spécifiques qui ne sont PAS applicables au type tuple
.
Opérations/méthodes | Description |
---|---|
s.append(x) |
Ajoute l’élément x à la fin de la liste s . Cela équivaut à s = s + [x] |
s.extend(l) |
Ajoute la liste l à la liste s . Est équivalent à s = s + l |
s[i] = x |
Modifie la liste et affecte la valeur x à la case d’indice i . Attention, cette case doit exister. |
s.insert(i,v) |
Insère l’élément x dans s à l’indice i . Cette méthode décale les indices suivants. |
s.remove(x) |
Supprime de la liste le premier élément dont la valeur est égale à x . |
s.pop(i) |
Enlève de la liste l’élément à la position i et renvoie sa valeur. En l’absence de i , c’est le dernier élément qui est supprimé et renvoyé. |
s.sort() |
Trie la liste. Attention, la liste est ainsi modifiée. |
s.reverse() |
Modifie la liste en inversant l’ordre des éléments de s . |
@30 Pour chaque exercice de @25
à @29
, proposer une ligne de script réalisant la même action à l’aide des “opérations spécifiques” au type list
et des “opérations communes” aux type list
et tuple
décrites ci-dessus.
@31 Tester avec le simulateur PythonTutor, le script ci-dessous puis expliquer pourquoi il ne permet pas réellement de “dupliquer” une liste.
liste = [1,2,3]
copie = liste
copie[1]=4
print(liste)
print(copie)
@32 Proposer une fonction duplique
qui duplique une liste mais permet que les deux listes soient indépendantes. Tester les instructions ci-dessous.
BONUS A l’aide de recherches sur Internet, compléter le tableau des “opérations spécifiques” au type list
ci-dessus des fonctions suivantes