Bienvenue sur python.gecif.net | LE SITE POUR APPRENDRE A PROGRAMMER EN PYTHON | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Voici les types de données présentés sur cette page : Rappels Nous connaissons déjà quelques types de variables de base :
Lorsqu'une variable est créée, Python garde en interne le type exact de cette variable. Pour connaître le type d'une variable il faut utiliser la fonction type de Python. Exemples : >>> a=3 D'après les informations renvoyées par la fonction type on constate que :
La fonction int() permet de convertir une valeur en nombre entier : >>> int(5.42) La fonction float() permet de convertir une valeur en nombre décimal (nombre à virgule) : >>> float(5) La fonction str() permet de convertir un objet en chaîne de caractères : >>> str(87) La fonction list() permet de convertir un objet en liste : >>> list(range(5))
Les booléens Une variable Booléenne est une variable qui ne peut prendre que 2 valeurs : True ou False Le terme "booléen" vient du nom du mathématicien britannique George BOOLE qui a inventé la logique au 19ème siècle. L'adjectif "booléen" peut être considéré comme un synonyme de "logique" signifiant "qui est soit vrai soit faux". Une variable booléennes peut être initialisé en utilisant les mots clés True et False qui s'écrivent avec une majuscule : >>> a=True On remarque que les variables logiques, ou booléennes, sont étiquetés bool si on les teste avec la fonction type. Une variable booléennes peut également être initialisée par le résultat d'un test qui renvoie soit vrai (True) soit faux (False) : >>> a=5>3 La fonction bool() permet de convertir une valeur en booléen qui vaudra soit True soit False : >>> bool(1) On remarque qu'une valaur non nulle est toujours converti en True. Seule une valeur nulle est convertie en False par la fonction bool().
Les ensembles
Un ensemble est un type composé contenant une collection d'objets. Un ensemble se définit entre accolades. Exemple : >>> e={1,2,3,4} Si on teste le type de la variable e Python nous donne le type set : >>> type(e) La fonction print peut afficher la totalité d'un ensemble : >>> print(e) Très important : contrairement à une liste un ensemble ne peut pas contenir plusieurs fois le même élément : >>> e={2,5,6,3,5,4,1,5,4,2,3,6,2,1,4,5,5,4,2} Un ensemble est un type itérable, c'est-à-dire que placé dans une boucle for, il fournira un par un chacun de ses éléments : >>> for i in {1,2,3,4}: Attention : contrairement à une liste, dans un ensemble les éléments ne sont pas ordonnés. Cela veut dire que par exemple les ensemble {1,2,3,4} et {4,2,3,1} sont strictement identiques pour Python : >>> {1,2,3,4}=={2,4,3,1} Il en résulte que lors de l'extraction des éléments d'un ensemble par une boucle for l'ordre dans lequel les éléments sont renvoyés n'est pas garanti : >>> e={'a',1,'b',2,'c',3} Enfin, comme le montre l'exemple précédent, un ensemble peut contenir des objets de différents types (nombres entiers, nombres décimaux ou chaîne de caractères) : >>> e={3.14,"bonjour",4000,"Python",6789.5432,0} On constate encore une fois dans l'exemple précédent que l'ordre des éléménts enregistrés dans l'ensemble n'est pas garanti : la notion d'ordre n'existe pas pour les ensembles.
L'opérateur in permet de tester l'appartenance d'un élément à un ensemble : >>> e={1,2,3,4} La fonction len permet de connaître le nombre d'éléments enregistrés dans un ensemble : >>> e={1,2,3,4} La fonction set permet de convertir une liste (ou tout autre objet composé) en un ensemble : >>> liste=[1,2,3,4] La méthode add permet d'ajouter un élément à un ensemble : >>> e={1,2,3,4} La méthode remove permet de supprimer un élément dans un ensemble : >>> e={1,2,3,4}
Python possède plusieurs opérateurs permettant d'effectuer les opérations mathèmatiques classiques sur les ensembles, tellles que l'union ou l'intersection. Imaginons un ensemble e1 contenant les éléments 1, 2, 3 et 4, et un ensemble e2 contenant les éléments 3, 4, 5 et 6. Voici la représentation graphique de ces deux ensembles :
Les éléments 3 et 4 appartiennent à la fois à e1 et à e2 mais ne sont représentés qu'une seule fois.
L'opérateur & calcule l'intersection de 2 ensembles : e1&e2 renvoie un nouvel ensemble contenant les éléments appartenant aux 2 ensembles à la fois (sans doublons) : >>> e1={1,2,3,4} L'intersection renvoie un ensemble contenant les éléments appartenant à la fois à e1 et à e2 :
Remarque : l'intersection de deux ensembles est similaire au ET logique (e1 ET e2)
L'opérateur | calcule l'union de 2 ensembles : e1|e2 renvoie un nouvel ensemble contenant les éléments appartenant à au moins un ensemble (sans doublons) : >>> e1={1,2,3,4} L'union de deux ensembles renvoie un ensemble comprenant les éléments appartenant au premier, au deuxième, ou aux deux ensembles. L'union renverra alors un ensemble contenant tous les éléments de e1 et de e2 réunis :
Remarque : l'union de deux ensembles est similaire au OU logique (e1 OU e2 ou les 2)
L'opérateur ^ calcule la différence symétrique de 2 ensembles : e1^e2 renvoie un nouvel ensemble contenant les éléments appartenant soit à e1, soit à e2, mais n'appartenant pas à la fois à e1 et à e2 : >>> e1={1,2,3,4} La différence symétrique sélectionne les éléments appartenant exclusivement à un seul ensemble (pas aux 2) :
Remarque : la différence symétrique de deux ensembles est similaire au OU-Exclusif logique (e1 et pas e2 OU e2 et pas e1 : exclusivement un seul) On peut également constater que la différence symétrique correspond à l'union à qui on a enlevé l'intersection : différence symétrique = union - intersection e1^e2 = (e1|e2)-(e1&e2) En voici une illustration : >>> e1={1,2,3}
L'opérateur - calcule la différence de 2 ensembles : e1-e2 renvoie un nouvel ensemble contenant les éléments de e1 qui n'appartiennent pas à e2 : >>> e1={1,2,3,4} La différence n'est pas commutative : e1-e2 ne donne pas le même résultat que e2-e1 Voici graphiquement ce que sélectionne la différence e1-e2 :
Et voici graphiquement ce que sélectionne la différence e2-e1 :
De plus la différence n'est pas associative : (e1-e2)-e3 ne donne pas le même résultat que e1-(e2-e3). Exemple : >>> e1={1, 2, 3} Sans parenthèse on effectue les opérations "différence" dans l'ordre de l'expression (de gauche à droite) Remarque : la différence de deux ensembles est similaire à la soustraction en mathématique (e1 moins e2 n'est pas égal à e2 moins e1)
Comme pour tous les opérateurs, il y a un ordre de priorité entre les opérateurs appliqués aux ensembles. Testons la priorité des opérateurs deux à deux afin d'en déduire l'ordre de priorité des 4 opérateurs & | ^ et - .
>>> e1={1,2,3,4} Conclusion : & est prioritaire devant | (tout comme en logique où le ET est prioritaire devant le OU)
>>> e1={1,2,3} Conclusion : ^ est prioritaire devant |
>>> e1={1,2,3} Conclusion : & est prioritaire devant ^ Remarque : comme & est prioritaire devant ^, et comme ^ est prioritaire devant |, on en déduit que & est forcément prioritaire devant |
>>> e1={1,2,3,4} Conclusion : - est prioritaire devant & On en déduit que la différence (-) est prioritaire devant tous les opérateurs logiques (& | ^).
Comme - est prioritaire devant &, et comme & est prioritaire devant |, on en déduit que - est forcément prioritaire devant | Démonstration : >>> e1={1,2,3,4} Conclusion : - est prioritaire devant |
Comme - est prioritaire devant &, et comme & est prioritaire devant ^, on en déduit que - est forcément prioritaire devant ^ Démonstration : >>> e1={1,2,3,4} Conclusion : - est prioritaire devant ^
Voici l'ordre des priorités des 4 opérateurs sur les ensembles :
Dans une expression sans parenthèse utilisant plusieurs opérateurs, Python les interpréte dans l'ordre de leur priorité (et non dans l'ordre de l'expression). Exemple : l'expression e1 | e2 & e3 ^ e4 - e5 sans parenthèse sera interprétée dans l'ordre suivant e1 | ( (e2 & e3) ^ (e4 - e5) )
L'opérateur < représente le symbole de l'inclusion : e1<e2 est booléen (il vaut soit True soit False). e1<e2 renvoie vrai si e1 est un sous-ensemble de e2, ce qui peut également s'écrire :
>>> e1={3,8}
Une variable de type ensemble est utilisable avec les syntaxes rappelées dans le tableau suivant :
Les tuples Les tuples sont des séquences d'objets non modifiables et s'écrivent entre parenthèses : >>> t=(1,2,3,4) Les éléments d'un tuple sont accessibles par un index commençant à 0 et écrit entre crochets : >>> t=(1,2,3,4) Contrairement à une liste, un tuple est non modifiable. Si on essaye de modifier un élément dans le tuple après la création du tuple on obteint une erreur : >>> t=(1,2,3,4) Tout comme pour les chaînes de caractères ou les listes la fonction len permet de connaître le nombre d'éléments enregistrés dans un tuple : >>> t=(1,2,3,4) Tout comme pour les chaînes de caractères ou les listes l'opérateur in permet de tester si un élément appartient à un tuple ou pas : >>> 2 in (1,2,3) Le tuple vide existe, il s'écrit () : >>> t=() Pour créer un tuple contenant un seul élément il faut faire suivre l'élément unique par un virgule afin que Python ne confonde pas le tuple avec une simple expression mathématique : >>> t=(5,) Remarque : sans la virgule finale, l'expression (5) serait convertie naturellement en un nombre entier de valeur 5 (et non en un tuple) : >>> t=(5) Tout comme pour les chaînes de caractères ou les listes l'opérteur + permet de concaténer les tuples et permet de créer un tuple à partir d'autres : >>> (1,2)+(3,4) Tout comme pour les chaînes de caractères ou les listes l'opérteur * permet de multiplier un tuple et permet de générer rapidement un tuple répétitif : >>> 7*(3,) La fonction tuple() permet de convertir un objet en tuple : >>> tuple([1,2,3,4]) Enfin il faut savoir que les paranthèses autour du tuple ne sont pas obligatoires lors de sa création : >>> t=1,2,3
Les dictionnaires Les dictionnaires sont des collections d'objets auquels on accède par une clé, et non par un index numérique. Voici un apperçu rapide de la syntaxe des dictionnaires en Python (toujurs à tester dans la console) : Création d'un dictionnaire vide : >>> dico={} Remarque : le dictionnaire vide s'écrit {}, qui est bien un dictionnaire (et non un ensemble vide). Dans un dictionnaire, chaque valeur enregistrée doit être référencée par une clé unique. Exemples : Ajout de la valeur "dupont" avec la clé "nom" : >>> dico["nom"]="dupont" Ajout d'autres éléments dans le dictionaire : >>> dico["prénom"]="pierre" Affichage des éléments du dictionnaire : >>> print(dico["prénom"],dico["nom"],"a",dico["age"],"ans.") Création directe d'un dictionnaire contenant 3 éléments : >>> dico={'nom':'durand','prenom':'paul','age':18} La méthode keys() permet d'obtenir l'ensemble des clés du dictionnaire : >>> dico.keys() La méthode values() permet d'obtenir l'ensemble des valeurs du dictionnaire : >>> dico.values() L'opérateur in permet de tester si une clé est présente dans le dictionnaire : >>> 'nom' in dico La méthode items() renvoie les paires clé/valeur sous forme de tuples : >>> dico.items() La méthode clear() vide le dictionaire : >>> dico.clear() Appliquée à un dictionnaire, la fonction list renvoie la liste des clés : >>> list({'a': 1, 'b': 2, 'c': 3}) Appliquée à un dictionnaire, la fonction len renvoie le nombre de paires clé/valeur enregistrées dans le dictionnaire : >>> dico={'a': 1, 'b': 2, 'c': 3}
Les dictionnaires : En Python, un dictionnaire est un type composé (contenant plusieurs éléments), modifiable, et dont chaque valeur est référencée par une clé (et non par un index numérique). Un dictionniare peut être vu comme une collection de paires clé/valeur (appelée chacune "élément").
Voici enfin pour récapitulatif la différence entre les 5 types composés de Python. On précise que :
Les fichiers Le type "fichier" permet à Python d'accéder à des données par l'intermédiaire d'un fichier enregistré physiquement sur le disque dur. Pour accéder à un fichier il existe 2 modes d'accès différents :
Imaginons que nous disposions sur le disque dur d'un fichier texte nommé fichier.txt et dont le contenu est le suivant : Ceci est un fichier texte Créez ce fichier texte dans EduPython (par un simple copier/coler des 4 lignes ci-dessus), enregistrez-le en UTF-8 dans votre répertoire de travail et réalisez les expériences suivantes dans la console de Python : Pour accéder à un fichier il faut commencer par créer un descripteur de fichier avec la fonction open() de Python. Le premier paramère de la fonction open() est le nom du fichier à lire, le second est 'r' pour 'lecture seule' (read) : fic=open('fichier.txt','r') On obtient alors un descripteur de fichier (nomé ici fic) qui est un objet contenant différentes méthodes permettant d'accéder au fichier. Parmi ces méthodes, la méthode read() renvoie tout le fichier sous forme d'une chaîne de caractères unique : >>> s=fic.read() La méthode readlines() lit tout le fichier et renvoie une liste contenant chacune des lignes : >>> fic=open('fichier.txt','r') La méthode close() permet de fermer le fichier correctement après son utilisation : fic.close()
Voici quelques problèmes possibles (et leurs solutions à connaître) lors de la lecture d'un fichier texte en Python :
>>> fic=open('fichier.txt','r') Dans ce cas il faut indiquer à Python le répertoire courant dans lequel le fichier est enregistré. Pour cela il faut importer le module os de Python permettant de connaître et de modifier le répertoire courant : >>> import os La méthode getcwd() du module os permet de connaître le répertoire courant dans lequel Python recherchera les fichiers. La méthode chdir() du module os permet de changer le répertoire courant.
Le fichier texte est enregistré en utilisant un certain jeu de caractères (en principe ANSI ou UTF-8). Mais par défaut à la lecture brute du fichier, Python lira une suite d'octets sans les interpréter en tant que codes UTF-8. Il conviendra alors de procéder parfois à un transcodage, en utilisant les fonctions appropriées et vues dans le traitement et l'encodage des chaînes de caractères. Mais pour éviter des problèmes d'encodage des caractères accentués, le plus simple en un premier temps est d'encoder le fichier texte en ANSI. Dans EduPython on configure le jeu de caractères utilisé pour enregistrer un fichier texte en allant dans le sous-menu Format de fichier dans le menu Edition :
Si le fichier texte à lire est encodé en ANSI, alors la lecture des caractères accentués est directe et ne pose pas de problèmes particuliers : fic=open('fichier.txt','r') Et voici le résultat affiché dans la console de Python : ['Ceci est un fichier texte\n', 'Il a été édité dans Edupython\n', 'Il est codé en ANSI\n', 'Fin du fichier\n'] Si maintenant le fichier texte est encodé en UTF-8, un décodage suplémentaire est nécessaire. Tout d'abord dans EduPython il fait configurer consciemment en UTF-8 le format de fichier avant de l'enregistrer : Ensuite il faut procéder à une succession de transcodage et de "nettoyage" des données lues, en lisant le fichier texte en tant que fichier binaire (paramètre 'rb' dans open) : fic=open('fichier.txt','rb') Et voici le résultat affiché dans la console de Python : ['Ceci est un fichier texte', 'Il a été édité dans Edupython', 'Il est codé en UTF-8', 'Fin du fichier']
Par défaut, la fonction open() de Python utilise donc le jeu de caractères ANSI (page de code utilisée par Windows) lors de l'ouverture d'un fichier texte. Rappel concernant le jeu de caractères ANSI :
Mais on peut préciser à la fonction open() le jeu de caractères à utiliser pour décoder le fichier texte lors de sa lecture. Pour cela il faut ajouter un 3ème paramètre (en plus du nom du fichier et du mode d'accès) de la forme encoding='' Les 6 lignes suivantes ouvrent toutes le fichier en considérant qu'il est encodé en ANSI, et sont donc pratiquement équivalentes : fic=open('fichier.txt','r',encoding='cp1252') La page de code utilisée par défaut par la fonction open() est cp1252 : en l'absence du paramètre endoding les octets du fichier texte seront décodés par le jeu de caractères cp1252 (appelé ANSI dans EduPython et dans Windows). Si maintenant on veut ouvrir un fichier texte qui est endocé en UTF-8, sans vouleur "décoder à la main" des octets lus, il suffit de préciser à la fonction open() que le fichier est encodé en UTF-8. La ligne à utiliser est alors la suivante : fic=open('fichier.txt','r',encoding='utf-8') Repartons avec le fichier fichier.txt encodé en UTF-8 dans EduPython :
En précisant encoding='utf-8' en paramètre de la fonction open() la lecture du fichier est désormais directe sans problème de décodage des caractères accentués : # lecture d'un fichier texte en UTF-8 : Et voici le résultat affiché dans la console de Python : ['\ufeffCeci est un fichier texte\n', 'Il a été édité dans Edupython\n', 'Il est codé en UTF-8\n', 'Fin du fichier\n'] On remarque que le premier caractère du fichier est le caractère unicode de point de code U+FEFF (il s'agit d'un espace insécable). En effet, tout fichier texte codé en UTF-8 commencera toujours par les 3 octets \xef\xbb\xbf (codage en UTF-8 du caractère unicode de point de code U+FEFF indiquant que le fichier est encodé en UTF-8) avant les caractères enregistrés dans le fichier. Il convient alors de supprimer ce caractère U+FEFF au début de la première ligne, par exemple en affichant les caractères à partir du n°1 (et non du n°0 qui est U+FEFF) : fic=open('fichier.txt','r',encoding='utf-8') Et voici le résultat affiché dans la console de Python : Ceci est un fichier texte En testant la valeur des 3 premiers octets d'un fichier il est alors possible de déterminé si le fichier est encodé en UTF-8 ou pas : # test des 3 premiers octets d'un fichier binaire : Remarque : l'encodage utf-8 peut également s'écrire utf8 en Python (sans le trait d'union). Les 2 lignes suivantes sont donc identiques : fic=open('fichier.txt','r',encoding='utf8')
Nous partons du fichier texte suivant nommé fichier.txt, contenant 3 lignes et encodé en ANSI : Créez ce fichier texte et réalisez les expériences suivantes dans la console de Python : Ouvrons le fichier dans la console en y connectant le descripteur fic : >>> fic=open('fichier.txt','r') Appelons la méthode read() de l'objet fic afin de lire tout le fichier : >>> fic.read() On obtient en retour les 3 lignes, c'est-à-dire le fichier complet : 'Ce fichier texte contient 3 lignes\nIl est codé en ANSI\nDernière ligne' Remarque : les retours à la ligne sont représentés par le caractère ASCII \n de code 10 : >>> ord('\n') Essayons de relire le fichier en appellant à nouveau la méthode read() : >>> fic.read() Et là on obtient une chaîne vide : '' Explication : lorsque Python accède à un fichier il utilise pour se repérer dans le fichier "un curseur" correspondant à la position courante de lecture dans le fichier. Juste après l'ouverture du fichier par open() le curseur est en position 0, c'est-à-dire au début du fichier. Après la lecture complère du fichier le curseur est en position finale, c'est-à-dire à la fin du fichier. Or la méthode read() renvoie le texte compris entre la position courante du curseur et la fin du fichier. Pour régler la position du curseur il faut utiliser la méthode seek() liée au descripteur de fichier fic. Par exemple pour remettre le curseur au début du fichier il faut appeler fic.seek(0) : >>> fic.seek(0) Sans paramètre particulier, la méthode read() renvoie tout le texte compris entre la position courante du curseur et la fin du fichier. Si on veut lire seulement quelques caractères dans le fichier on peut alors passer en paramètre à la méthode read() le nombre de caractères à lire. Par exemple fic.read(16) pour lire seulement 16 caractères : >>> fic.seek(0) Nous venons de lire 16 caractères à partir du début du fichier. Le curseur, initialement placé en position 0 par seek(0) a donc avancé de 16 positions. Quelle est donc actuellement sa position courante ? Pour connaître la position courante du curseur de lecture dans un fichier sans la modifier il faut faire appel à la méthode tell() : >>> fic.tell() Sans surprise le curseur est actuellement en position 16. Cela signifie que la prochaine lecture avec read() partira de la position 16. Lisons maintenant 18 caractères : on obtient alors les 18 caractères suivant dans le fichier (à partir de la position 16) : >>> fic.read(18) Voici pour rappel le contenu de notre fichier texte : Ce fichier texte contient 3 lignes\n Comment extraire la chaîne de caractères 'codé en ANSI' à partir de ce fichier texte ? Notre chaîne contenant 12 caractères à partir de la position 42 il suffit de positionner le curseur sur le caractère n°42 avec seek(42) puis de demander la lecture de 12 caractères seulement avec read(12) : >>> fic.seek(42) Problème : comment obtenir seulement les 2 dernières lignes du fichier sachant que la première ligne a une taille de 35 caractères ? Solution : on déplace le curseur en position 35 puis on lit tout le fichier de cette position jusqu'à la fin du fichier : >>> fic.seek(35) Ne pas oublier à la fin du traitement de fermer le fichier par la méthode close() : >>> fic.close()
Pour accéder à un fichier en écriture il faut préciser 'w' en second paramètre de la fonction open() (w pour write) : fic=open('fichier_neuf.txt','w') La méthode write() de l'objet fic permet alors d'écrire dans le nouveau fichier nommé ici fichier_neuf.txt : >>> fic.write('Bonjour') Remarque : la méthode write() renvoi le nombre d'octet écrit dans le fichier. Pour que les données soient réellement écrite sur le disque dur il faut bien fermer le fichier par la méthode close() : >>> fic.close() Voici à cet instant le contenu du fichier fichier_neuf.txt : Bonjour Pour ajouter du texte à la fin du fichier il faut le ré-ouvrir avec le paramère 'a' (pour ajouter) et non avec 'w' qui écraserait le fichier existant : fic=open('fichier_neuf.txt','a') Ajoutons du texte à la fin du fichier : >>> fic.write('Au revoir') Fermons le fichier : >>> fic.close() Voici à cet instant le contenu du fichier fichier_neuf.txt : BonjourAu revoir On constate que la méthode write() associées aux fichiers écrit chaque chaîne de caractères dans le fichier sans insérer de retour à la ligne. Pour séparer physiquement chaque ligne dans le fichier il faut insérer un caractère '\n' à la fin de chaque chaîne de caractères. La méthode writelines() permet d'écrire dans le fichiers tous les éléments d'une liste. Démonstration : Créons un nouveau fichier en écrasant le fichier existant (paramètre 'w') : fic=open('fichier_neuf.txt','w') Créons une liste à 3 éléments (des chaînes de caractère finissant par '\n') : >>> liste=['Bonjour\n','Ceci est un fichier texte fait par Python\n','Fin du fichier\n'] Écrivons chacune de ces 3 lignes dans le fichier avec un seul appel à la méthodes writelines() : >>> fic.writelines(liste) Fermons le fichier : >>> fic.close() Voici à cet instant le contenu du fichier fichier_neuf.txt : Bonjour Remarque : par défaut la méthode write() de Python utilise l'encodage ANSI pour écrire dans un fichier texte : fic=open('fic.txt','w') Et voici le résultat affiché dans la console : ['Ce fichier a été créé par Python\n', 'Il est encodé en ANSI par défaut\n'] Si on écrit des chaînes de caractères accentuées dans un fichier texte, leur relecture ne nécessite aucun décodage particulier.
Grâce à la fonction open() de Python et aux méthodes read(), write() et close() liées aux descripteurs de fichiers vous savez désormais lire et écrite dans un fichier texte à partir d'un programme en Python afin d'enregistrer des données de manière durable sur le disque dur.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|