Skip to content

I. Le type tableau


TP : Introduction aux tableaux

Créer un nouveau fichier, et l'enregistrer dans votre dossier NSI, dans un nouveau dossier seq5, sous le nom TP_Introduction_Tableaux.py. Répondre aux questions dans votre cahier de TP.

Jusqu'à présent, nous avons manipulé des valeurs stockées dans des variables une par une. Mais les programmes traitent en général plus qu'une ou deux données à la fois.

  1. On veut stocker les moyennes d'un petit groupe de 5 élèves. Au lieu d'utiliser 5 variables de type float, on les regroupe dans une seule. Taper dans votre éditeur l'instruction initialisant la variable :

    moyennes = [10.2, 15.7, 7.3, 18.1, 9.5]
    
    Exécuter le code et vérifier le contenu de moyennes en tapant son nom dans la console.

  2. Quel est le type de cette variable ? Appeler la fonction type dans la console avec la variable moyennes en entrée pour le savoir.

  3. Ce type Python correspond en fait à une structure de tableau. Pour accéder aux différents éléments, on utilise leur indice, qui donne leur position par rapport aux autres. Pour avoir l'élément d'indice 0, on écrit :

    >>> moyennes[0]
    
    Quel est-il ?

  4. Pour trouver l'indice des éléments, on compte de 1 en 1, donc en commençant à 0.
    a. Quel doit être l'élément d'indice 1 ?
    b. Le vérifier en remplaçant 0 par 1 dans l'instruction précédente.

  5. Pour l'exemple du tableau moyennes, remplir la correspondance entre la valeur de ses différents éléments et leur indice (rajouter des lignes pour avoir tous les éléments):

    indice moyennes[indice]
    0
    1



  6. Quelle instruction faut-il taper pour obtenir la valeur 18.1 ?

  7. La fonction len(nom_du_tableau) donne le nombre d'élément dans un tableau, autrement dit sa longueur. Que donne ici l'instruction suivante (dans la console) ?

    >>> len(moyennes)
    

  8. Déduire de la question 5 quel est l'indice du dernier élément du tableau moyennes, en fonction de sa longueur donnée par len(moyennes).

  9. Taper l'instruction suivante :

    >>> moyennes[-1]
    
    a. Quelle valeur renvoie-t-elle ? b. En déduire à quel indice positif, l'indice -1 est-il équivalent.

  10. On s'est trompé sur la valeur de la première moyenne du tableau. La corriger avec l'instruction suivante (dans l'éditeur) :

    moyennes[0] = 11.0
    
    Vérifier que la correction a été faite.

  11. Dans un tableau, on peut stocker autre chose que des nombres. Créer le tableau suivant, en le déclarant dans l'éditeur :

    fruits = ['poire', 'cerise', 'pomme', 'abricot']
    

  12. Remplir la correspondance entre les éléments du tableau fruits et leurs indices (rajouter les lignes nécessaires) :

    indice fruits[indice]
    0
    1



  13. En déduire l'instruction pour obtenir la valeur 'cerise'.

  14. Compléter le code suivant (le tester dans l'éditeur et compléter sur votre cahier) pour afficher la valeur de l'ensemble des éléments de fruits :

    for i in range(......):
        print(fruits[......])
    

  15. Quelle instruction permet de modifier le dernier élément de fruits pour lui affecter la valeur 'pêche' ?


Cours

Les types de bases manipulés jusqu'à présent ne permettent pas de manipuler des ensembles de valeurs, appelés en informatique des collections. Pour stocker des éléments d'un même type, on peut utiliser un tableau.

A. Définition

Un tableau est une collection d'éléments de même type, de taille fixée, stockés les uns à la suite des autres, dont la valeur est accessible grâce à leur indice.

En Python, on utilise le terme plus général de liste pour représenter des tableaux.

B. Création

On déclare un nouveau tableau en séparant ses éléments par des virgules, l'ensemble étant entouré de crochets. [] est un tableau vide.

Exemple

Pour stocker l'ensemble des nombres premiers inférieurs à 10, on peut utiliser un tableau appelé ici tab_premiers :

tab_premiers = [2, 3, 5, 7]
Les différents éléments sont stockés côte à côte dans la mémoire. Compléter le schéma suivant avec les valeurs de tab_premiers :

Solution

C. Indexation

Les éléments d'un tableau tab sont indexés à partir de 0, jusqu'à la taille du tableau - 1 (en Python : len(tab)-1). On accède à l'élément d'indice i avec la syntaxe tab[i].

Exemple :

Pour l'exemple de tab_premiers, associer chaque élément du tableau à son indice. Vérifier que l'indice du dernier élément correspond à len(tab_premiers)-1.

élément indice
2
3
5
7
Solution
élément indice
2 0
3 1
5 2
7 3
On a bien len(tab_premiers)-1 = 4-1 = 3, indice du dernier élément de tab_premiers.

Quelle instruction permet d'afficher la valeur 3 ? La valeur de l'élement d'indice 2 ?

Solution

tab[1] affiche la valeur 3.
tab[2] affiche la valeur de l'élément d'indice2`.

D. Modification

Il est possible de modifier la valeur d'un élément d'un tableau t après sa création, en lui affectant une nouvelle valeur avec la syntaxe t[i] = v.

Exemples

  • Une erreur a été faite lors de la déclaration de tab_premiers :
        tab_premiers = [1, 3, 5, 7]
    
Ecrire l'instruction permettant de rectifier cette erreur.
tab_premiers[0] = 2

E. Parcours

Pour accéder à chacun des éléments les uns à la suite des autres, on peut utiliser une boucle bornée. Il y a deux manières de le faire :

E.I. Parcours par indice

Syntaxe

for i in range(len(t)):
    print(t[i])
###

Exemple

Un tableau t de taille 10 a été initialisé avec uniquement des 0. On veut en fait qu'il contienne l'ensemble des chiffres de 0 à 9.

Ecrire une boucle permettant de modifier les valeurs de t.
for i in range(len(t)):
    t[i] = i

E.II. Parcours par valeur

Syntaxe

for e in t:    # cette syntaxe est possible car caracteres est une séquence
    print(e)
###

F. Création par compréhension

Pour créer des tableaux dont la taille peut être grande de manière automatique, on peut utiliser la création par compréhension. Cette méthode utilise une boucle et peut aussi intégrer une condition.

Exemples

  • t1 = [2**i for i in range(6)] crée un tableau avec les puissances de 2 de 0 à 5. C'est-à-dire t1 vaut ...
Solution

t1 vaut [1, 2, 4, 8, 16].

  • Indiquer ce que contient t2 : t2 = [i+5 for i in range(5)]
Solution

t2 vaut [5, 6, 7, 8, 9].

  • Créer un tableau t3 par compréhension stockant les valeurs au carré des nombres de 1 à 5.
Solution

t3 = [i**2 for i in range(1,6)]

  • Indiquer ce que contient t4 : t4 = [i for i in range(10) if i%2 == 0]
Solution

t4 vaut [0, 2, 4, 6, 8].

G. Les tableaux à 2-dimensions

Un tableau à deux dimensions, appelé matrice, est un tableau dont chaque élément est aussi un tableau. On accède à un élément par son numéro de ligne i et son numéro de colonne j : si elle s'appelle mat, cela correspond à mat[i][j].

Exemple :

mat = [[2,8,1], [3,9,0]] a deux éléments, d'indice 0 et 1. Ces éléments comportent eux trois éléments.

  • Compléter le tableau suivant :
indice élément
0
1
Solution
indice élément
0 [2,8,1]
1 [3,9,0]
  • Le représenter sur le schéma suivant, et ajouter les numéros de ligne et de colonne :

    Solution

  • Quelle instruction permet d'accéder à l'élément 3 ? L'élément 2 ?

    Solution

    mat[1][0] permet d'accéder à 3 et mat[0][0] à 2.


TP : La bibliothèque matplotlib

Codes de correction

Pour ce TP, créer un dossier TP_Matplotlib dans votre dossier NSI, dossier seq5, et enregistrer un nouveau fichier pour chaque tracé.

La bibliothèque matplotlib (pour "mathematic plot library") sert à représenter des données sous la forme de graphiques, on utilise son module pyplot. Avant de commencer, écrire l'import de la librairie en haut du fichier Python :

from matplotlib.pyplot import * 

A. Graphiques simples

  1. Pour représenter des abscisses, notées x, en fonction d'ordonnées, notées y, on utilise des tableaux. Par exemple :

    Code

    x = [0, 1, 2, 3]
    y = [3, 4, -1, 2]
    plot(x, y)     # on trace x en fonction de y
    show()        # on montre le graphique
    

    Exécuter ce code dans un fichier graphe1.py. Le graphique doit apparaître à l'écran.

  2. On peut changer l'apparence des points (couleur et forme) en rajoutant un paramètre à la fonction plot. Essayez le code avec les différents appels suivant de la fonction :

    Code

    plot(x, y, 'r')   
    plot(x, y, 'rs')   
    plot(x, y, 'b') 
    plot(x, y, 'bo') 
    

    Noter ce qui change à chaque fois.

  3. Plutôt que de rentrer les valeurs des abscisses et ordonnées à la main dans le tableau, on peut créer des tableaux automatiquement avec la compréhension.
    a. La compréhension utilise une boucle entre les crochets pour affecter directement une valeur à chaque élément du tableau.
    [i for i in range(10)] crée le tableau [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    On peut manipuler les paramètres du range ou bien faire des opérations sur la variable i pour créer d'autres tableau. Quelle instruction permet de créer par compréhension le tableau [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] ? La tester dans la console.

    b. On veut représenter la fonction \(f(x) = 3x\). Recopier le code suivant dans un fichier graphe2.py et le compléter avec le tableau des y pour obtenir les bonnes valeurs.

    Code

    x = [i for i in range(100)]  # permet de représenter 100 points
    y = ...            # à compléter - y doit être de taille 100 aussi 
    plot(x, y)     # vous pouvez rajouter le 3ème paramètre qui vous convient le mieux
    show()        
    

    Ne pas oublier de faire l'import de la bibliothèque en début de fichier.

  4. On peut représenter des fonctions plus complexes. Dans un fichier graphe_cos.py, importer la fonction cos de la bibliothèque math avec l'instruction from math import cos placée en début de fichier. Compléter l'instructions remplissant le tableaux ordonnees pour représenter la fonction \(f(x) = cos(x)\).

    Code

    abscisses = [i for i in range(100)]
    ordonnees = ...    # à compléter - y doit être de taille 100 aussi
    plot(abscisses, ordonnees)
    show()
    

B. Diagramme en barres et histogrammes

  1. Le code est similaire pour représenter des diagrammes en barres : il faut une variable x associée à une variable y qui correspond à la hauteur des barres. On utilise la fonction bar à la place de la fonction plot. Exécuter le code suviant, dans un fichier barres.py :

    Code

    x = [3, 5, 6, 7]
    y = [4, 1, 3, 4]
    bar(x, y)
    show()
    

    Le modifier pour avoir les valeurs 1, 2, 3, 4 et 5 en ordonnée y, associées aux abscisses x allant de 3 à 7.

  2. La fonction hist permet de représenter des histogrammes. Il faut lui donner en paramètre une liste de valeurs, et le nombre de groupes à tracer parmi ces valeurs, et la fonction représente le nombre de fois qu'apparaîssent les différentes valeurs dans chaque groupe.

    Par exemple, on peut tracer combien de fois on tombe sur chacun des chiffres de 1 à 6 en lançant un dé à 6 faces 100 fois, en utilisant la fonction randint de la bibliothèque random (il faut rajouter from random import randint au début du fichier). Compléter le code suivant, dans un fichier histogramme.py :

    Code

    liste =[randint(...) for _ in range(100)]
    hist(liste, 6)
    show()
    

C. Nuage de points

  1. La fonction scatter permet de représenter des nuages de points, dont on donne l'abscisse x et l'ordonnée y. Utiliser la compréhension pour créer les 2 listes x et y de taille 1000, en tirant à chaque fois au hasard un nombre entre 1 et 100. Enregistrer le code suivant dans un fichier nuage1.py.

    Code

    x = [ randint(...) for i in range(...)]
    y = ...
    scatter(x,y, c='red')  # il faut ici rajouter le nom de paramètre c pour changer la couleur
    show()
    
  2. On peut faire plusieurs graphiques sur un seul, il suffit d'appeler plusieurs fois la fonction de tracé (ici scatter) avant de faire appel à show.
    Générer 3 tirages différents pour x et y, et les représenter sur le même graphique en utilisant des couleurs différentes. L'enregistrer dans un fichier nuage2.py.

D. Camemberts

  1. Les camemberts (fonction pie) permettent de représenter la répartition de données entre différentes catégories. Les catégories ont un nom et une taille (un nombre de données).

    On veut représenter la répartition d'animaux : 15 animaux dans la catégorie Loup, 30 dans la catégorie Renard, 45 pour Belette et 10 pour Jument. Compléter les listes noms et tailles pour obtenir le graphique demandé. Enregistrer le code sous camembert.py.

    Code

    noms = ...
    tailles = ...
    pie(tailles, labels=noms)
    show()
    

TD

Exercice 1 :

Qu'affiche le programme suivant ?

Code

t = ["un", "trois", "deux"]
print(t[1], t[2])

Exercice 2 :

Comment accéder sans erreur au 5ème élément d'un tableau t dont on ne connaît pas encore la taille ?

Code

# proposition a
a = t[5]
# proposition b
if len(t) > 4:
    a = t[4]
# proposition c
if len(t) >= 5:
    a = t[4]
# proposition d
if len(t) > 4:
    a = t[5]
# proposition e
if len(t) == 5:
    a = t[4]
# proposition f
a = t[4]

Exercice 3 : les jours

  1. Ecrire une instruction Python stockant le nom des sept jours de la semaine dans un tableau nommé jours.

  2. Ecrire un programme permettant d'afficher le noms des sept jours, en utilisant une boucle et la fonction renvoyant la longueur d'un tableau.

Exercice 4 : ajouter des éléments à un tableau (sur ordinateur)

Un tableau est une structure de taille fixe. Dans certains cas, ce n'est pas pratique car on veut pouvoir rajouter des éléments au fur et à mesure.

  1. Il est possible de le faire avec l'opérateur +. Exécuter le code suivant :

    Code

    t = [-1, 0, 1, 2]
    t = t + [3]
    
    1. Ecrire un programme créant un tableau vide, et ajoutant successivement les valeurs 5, 10, 15 et 20.
  2. Ecrire une fonction multiples1000(n) prenant en paramètre un entier positif n et renvoyant un tableau contenant les multiples de n strictement inférieurs à 1000.

  3. Ecrire une fonction trie_pairs(t) prenant en paramètre un tableau d'entiers t et renvoyant un nouveau tableau ne contenant que les entiers pairs de t.

Exercice 5 : la compréhension

  1. Ecrire une instruction permettant de créer par compréhension un tableau contenant la table de multiplication de 6 (donc les valeurs allant de 1*6 à 9*6).

  2. Ecrire une instruction permettant de créer par compréhension un tableau à 2 dimensions contenant les tables de multiplication de tous les chiffres de 2 à 9.

    Code

    [[2, 4, 6, 8, 10, 12, 14, 16, 18],    # table de 2
    [3, 6, 9, 12, 15, 18, 21, 24, 27],   # table de 3
    ...                                   # etc
    [9, 18, 27, 36, 45, 54, 63, 72, 81]]  # table de 9
    

Exercice 6 : multiples

Ecrire une fonction multiples10(n) prenant en paramètre un entier positif n et renvoyant un tableau contenant les 10 premiers multiples non nuls de n.

On utilisera un tableau de taille 10, initialisé par compréhension avec des 0.

Exercice 7 : morpion

  1. Ecrire une instruction permettant de générer le tableau à 2 dimensions représentant le jeu du morpion ci-dessous.

  2. C'est au joueur ayant les 'X' de jouer. Ecrire l'instruction qui lui permet de gagner (il faut qu'il aligne 3 'X' !).

  3. Ecrire un programme parcourant tous les éléments du tableau à 2 dimensions les uns après les autres (il faut utiliser 2 boucles imbriquées).

Exercice 8 : QCM

  1. On dispose d'une liste définie par L = [15,17,12,23].
    Quelle est la valeur de L après l'instruction L[2] = 25 ?
    A [15,25,12,23]
    B [15,17,25,12,23]
    C [15,17,25,23]
    D [15,17,12,25,23]

  2. On définit ainsi une liste M :
    M = [['A','B','C','D'], ['E','F','G','H'], ['I','J','K','L']]
    Quelle expression vaut la chaîne de caractères 'H' ?
    A M[1][3]
    B M[3][1]
    C M(7)
    D M(8)

  3. Que vaut l'expression [ 2*k for k in range(5) ] ?
    A [0,2,4,6,8]
    B [2,4,6,8,10]
    C [1,2,4,8,16]
    D [2,4,8,16,32]

  4. On exécute le code suivant :

    Code

    A = [ [1,2,3], [4,5,6], [7,8,9] ]
    B = [ [0,0,0], [0,0,0], [0,0,0] ]
    for i in range(3):
        for j in range(3):
            B[i][j] = A[j][i]
    

    Que vaut B à la fin de l'exécution ? A rien du tout, le programme déclenche une erreur d'exécution
    B [ [3,2,1], [6,5,4], [9,8,7] ]
    C [ [1,4,7], [2,5,8], [3,6,9] ]
    D [ [7,8,9], [4,5,6], [1,2,3] ]