Vous pouvez me contacter via Facebook pour questions & suggestions :
Page Facebook relative à mon site
Avant d'aborder ces trois types de séquences, je voudrais revenir rapidement sur les modules.
Comment importer un module, utilisez les outils de ce module ?
Pour activer, par exemple, les modules math puis random on peut écrire : "from math import*" puis "from random import *"
Or si vous avez consulté d'autres sources documentaires, vous avez pu lire les instructions "import math" ou "import random".
Les deux solutions sont correctes !
Et si vous oubliez de préfixer les fonctions vous aurez un message d'erreur.
La console ne comprend pas la commande sqrt(25) mais comprend la commande math.sqrt(25).
N'en concluez pas que la première solution est la meilleure car plus courte. C'est vrai, si vous n'activez qu'un module.
Mais si vous importez plusieurs modules, il faut mieux utiliser la deuxième solution.
En effet il est alors possible qu'il ait des ambiguïtés ... Deux modules employant le même mot pour désigner deux fonctions différentes ...
Un seul exemple : dans les deux module time & datetime il existe une fonction qui porte le même nom : time() ...
La deuxième solution a aussi un avantage, je peux utiliser un alias (de préférence un mot court) qui servira de préfixe.
Exemple :
Vous donnerez un alias à un module importé lorsque le nom de ce dernier est long tel "datetime" ou "statistic".
Mais comment connaitre la liste des fonctions d'un module et le rôle de chacune ?
Pour découvrir toutes les fonctions d'un module il suffit de l'importer puis de taper la commande help(nomModule).
Pour avancer d'une page dans la liste tapez sur "espace".
La commande dir(nomModule) se contente d'afficher la liste des fonctions.
Avant d'aborder d'autres structures itérables qui existent en Python (tuples, dictionnaires et ensembles), je voudrais vous montrer quelques traitements complémentaires que l'on peut effectuer sur une liste.
Le code correspondant :
Pour importer le module "random" j'ai employé la syntaxe "import nomModule". Donc je dois ensuite préfixer les fonctions.
Notez la syntaxe pour extraire de façon aléatoire un élement : random.choice(nomListe)
Il peut s'avérer utile de convertir une liste en chaine.
À saisir dans la console Python :
machaine = " - ".join(maliste) : la méthode join() a une syntaxe étrange ...
Elle convertit ici une liste en chaine. Les crochets et les guillemets internes sont supprimés, les virgules sont ici remplacées par des "-".
Si je veux des espaces ll suffit d'écrire : : machaine = " ".join(maliste)
Donc pour convertir une chaine en liste il faut utiliser la méthode split() et pour convertir une liste en chaine il faut utiliser la méthode de liste join()
Dans la suite de commandes ci-dessous j'utilise différentes méthodes de manipulation de listes.
Attention, ne confondez pas la fonction générique sorted() avec la méthode de liste sort(). La fonction sorted() peut s'appliquer à n'importe quel type de séquence (liste, tuple, dictionnaire, chaine,etc.) et cette fonction native ne modifie pas la série d'origine à la différence de la méthode sort().
Les commmandes ci-dessous portent sur les tris de listes.
Ci-dessus j'ai appliqué à des listes la méthode de liste : sort(). Notez qu'à chaque fois la liste d'origine est modifiée.
Dans un chapitre précédent j'ai évoqué cette séquence. J'ai montré qu'une fonction pouvait retourner un tuple (plusieurs valeurs séparées par des virgules).
Commandes à saisir :
On peut se demander à quoi ça peut bien servir ce type de données ? En fait un tuple ça peut être très utile dans certains cas précis.
À droite du signe "=" c'est un tuple (j'aurais pu encadrer de parenthèses).
Donc en une seule instruction j'ai créé et initialisé plusieurs variables.
Il s'agit d'une piqure de rappel. Voir chapitre 4 - les fonctions.
Exemple :
Une fonction permet de retourner le périmètre et l'aire d'un rectangle à partir de la longueur et de la largeur.
Dans la fonction les variables sont lo (comme longueur), la (comme largeur), p (comme périmètre), a (comme aire),
Dans la fonction "rectangle" le mot "return" est suivi d'un tuple à deux éléments : p,a.
Notez l'appel de la fonction avec à gauche du signe "=" un tuple à deux éléments.
la variable "perimetre" reçoit le périmètre ; la variable "aire" récupère la surface,
Exemple :
Notez bien la syntaxe r1,r2 = r2,r1 ; de chaque côté du signe "=" on a un tuple.
Dans un programme il peut y avoir des variables qui ne doivent pas être modifiées après avoir été initialisées.
C'est ce qu'on appelle des constantes. Il suffit donc d'initialiser ces variables particulières à partir d'un tuple.
Exemple :
La variable "taux_tva" contient un tuple avec deux éléments ; Chaque élément a un indice.
Les taux de TVA sont exprimés pour 100 €, donc je dois diviser par 100 pour obtenir la TVA.
Notez que je n'arrive pas à modifier le contenu du premier élément du tuple.
Écrivez la fonction qui a partir du rayon retourne la circonférence et l'aire d'un cercle.
Donc un argument à passer lors de l'appel de la fonction et deux valeurs retournées par cette fonction.
Je peux appliquer le "slicing" et la méthode index() à un tuple.
Un tuple est une structure itérable :
Un tuple ne peut être modifié. Donc pas de méthodes disponibles pour ajouter, retirer, modifier les items.
Un dictionnaire n'est pas une séquence d'éléménts simples mais une suite de paires "clé:valeur".
Un paire "clé:valeur" s'appelle aussi un item.
Les dictionnaires sont délimités par des accolades. Un dictionnaire c'est l'équivalent d'un tableau associatif dans d'autres langages (PHP, JS).
Vous pouvez utiliser un dictionnaire pour réaliser un carnet d'adresses, dans lequel on accède à chaque contact en saisissant son nom.
A tapez dans l'interpréteur :
Je crée un dictionnaire nommé "mon_inventaire" qui comprend 4 paires de clé-valeur.
Pour accéder à une valeur il faut préciser la clé. Syntaxe : nomDictionnaire [clé]. Ainsi j'apprends que j'ai 5 pantalons.
machaine =" - ".join(mon_inventaire) : création d'une chaine à partir du dictionnaire, avec la méthode join() ; seules les clés sont conservées
dans la chaine de destination.
mon_inventaire["pulls"] = 10 : ajout d'un cinquième paire au dictionnaire
del(mon_inventaire["vestes"]) suppression d'une paire du dictionnaire
Attention un dictionnaire est une séquence non pas d'éléments simples mais d'items c'est à dire de paires "clé:valeur".
Il faut appliquer la méthode items() pour afficher les paires "clé:valeur".
Exécution de ce programme :
Remarques :
Pour afficher uniquement les clés il suffirait d'écrire :
for cle in carnet.keys():
Pour afficher uniquement les valeurs il suffirait d'écrire :
for valeur in carnet.values()
Nous avons donc trois méthodes pour parcourir un dictionnaire : items(), keys(), values().
Commandes à saisir dans l'interpréteur :
Je vous montre aussi que l'on peut appliquer à un objet dict les fonctions len() & del().
Pour supprimer l'item ayant la clé "5" j'aurai pu aussi employer la méthode de classe pop() : mondico.pop(5)
Décidément Python n'est pas avare en structures de données ; vous connaissiez les listes et les tuples et vous venez de voir les dictionnaires.
Et bien depuis la version 3 de Python, il existe un nouveau type de séquence : les ensembles (ou "set" en anglais).
Il ne faut pas confondre les ensembles avec les dictionnaires.
Certes dans les deux cas les délimiteurs sont des accolades. Mais dans un ensemble il n'y a que des éléments simples alors que dans un dictionnaire
il y a des paires de "clé:valeur".
Puisqu'un ensemble est une séquence de valeurs comme une liste, quel est l'intérêt pratique de cette nouvelle structure ???
À la différence d'une liste, un ensemble ne peut pas contenir une même valeur plusieurs fois. En d'autres termes il ne peut y avoir de doublons
Il existe plusieurs façons de créer un ensemble.
Pour créer un ensemble vide, il faut écrire : nomEnsemble = set()
Si vous tentez de saisir des doublons dans un ensemble, l'interpréteur ne signale aucune erreur mais élimine les doublons de la séquence.
Il faut donc impérativement utiliser la fonction native set().
Dans la liste d'origine il y avait un doublon ; doublon qui a disparu dans l'ensemble.
La chaine "anguille" comprend deux "l".
Dans la chaine "lotte de mer" il y a aussi des doublons.
Dans les "sets" ensemble2 et ensemble3 les doublons ont disparu.
Notez que l'existence de doublons dans la source ne provoque jamais d'erreurs d'exécution lorsqu'on appelle la fonction set()
Il faut donc imbriquer la fonction range() dans la fonction set().
Maintenant que vous savez créé un ensemble de différentes manières, voyons les manipulations sur ce type de données.
On a pu ajouter la lettre "i' à l'ensemble. Par contre la tentative d'ajout de la lettre "l" a échoué puisque cette valeur existait déjà dans le "set".
Constatez qu'il n'y a toujours pas de "plantage" de la commande.
On peut donc appliquer les opérateurs "in" et "not in" à un ensemble.
Un 'set' est une structure itérable donc elle peut être parcouru par une boucle FOR.
"ensemble4" est vidé grâce à la méthode clear()
Je supprime la lettre "i" de l'ensemble puis je demande la suppression d'un élément qui n'existe pas ; l'interpréteur ne lève pas d'exception avec la méthode discard() mais signale une erreur avec la méthode remove().
Le nouveau ensemble ("set_union") est bien l'union de "set1" et "set2" ; les valeurs communes aux deux ensembles d'origine ne sont présentes qu'une fois.
Le nouvel ensemble ("set_inter") ne comprend que les éléments qui étaient communs aux deux ensembles d'origine : 5,6,7,8,9.
Donc nous pouvons produire une chaine à partir d'un ensemble.
La méthode 'join()' peut donc s'appliquer à des listes, des tuples, des dictionnaires et des ensembles pour produire une chaine.
Deux plongeurs donnent la liste des poissons qu'ils ont pu observer dans un lac.
Vous devez en déduire la liste des poissons de ce biotope (sans doublons).
Deux espèces ont été signalées par les deux plongeurs.
Un ensemble n'est pas une séquence : un élément n'a pas d'indice.
Donc on ne peut pas "slicer" un ensemble ni appliquer la méthode index().
Démonstration :
Nous avons des erreurs lorsque l'on tente de slicer ou faire une recherche (méthode index()) dans un set.
Vous vous souvenez du programme qui consistait à tirer au sort cinq cartes.
Je disais même que ce programme "trichait" puisqu'une même carte pouvait être tirée 2 fois.
En utilisant un ensemble à la place d'une liste, 'pour construire la main du joueur), nous n'aurons plus ce problème !
Notez les commentaires multi-lignes : encadrés par trois guillemets
Notez que la fonction len() fonctionne pour tous les types de structures (liste, tuple, dictionnaire, ensemble).
Par contre pour ajouter un élément à un ensemble, la méthode est add() (et non pas append()).
Et oui, il y a encore un petit problème. Si la même carte est tirée au sort deux fois, l'ensemble ne comprend alors que 4 cartes (puisque les doublons sont interdits).
Il faudrait imaginer que dans ce cas (N cartes < à 5) il y ait un nouveau tirage.
C'est possible à condition de créer une fonction "tirage_carte" et d'appeler cette fonction dans le programme principal jusqu'à ce que
le nombre de cartes dans la main soit de 5. C'est ce qu'on appelle faire de la programmation structurée.
Et oui, élaborer un programme parfait c'est parfois un long chemin ...