Révisions : programmation en langage python Retrouvez tout le cours de première année (et plus) sur le site : http://pcsi.kleber.free.fr/IPT/index.html 1. Modules Les modules sont des bibliothèques de programmes. Exemples : math numpy pyplot pylab module de fonctions mathématiques usuelles (qui ne figurent pas dans le noyau python) module de programmes pour calculs numériques sur des tableaux module de programmes pour représentations graphiques, sous-module de matplotlib module de programmes pour représentations graphiques (quasi-équivalent de pyplot) Importation d’un module : import math Pour obtenir de l’aide sur un module importé (ou sur une fonction quelconque en général) : help(math) Pour utiliser une fonction du module importé : math.sin(1.3) Utilisation d’un alias : import math as m m.sin(1.3) On peut simplifier l’appel des fonctions (ou n’importer qu’une seule fonction) : from math import * (from math import sin) sin(1.3) Mais dans ce cas il faut faire attention aux fonctions portant les mêmes noms en provenance de modules différents : le dernier import écrase le précédent… 2. Les types python a) Types d’objets simples Type entier : pas de limitation de taille type(25) int Opérations sur les entiers : 2+3 2**3 2-3 25//3 abs(-3) 25%3 2*3 divmod(25,3) Type flottant type(25.0) 3e4 float # notation exponentielle Opérations sur les réels : comme sur les entiers sauf pour la division. 1/3 # précision finie d’une quinzaine de décimales Type booléen type(3>5) bool Deux valeurs possibles : True False Opérations sur les booléens : - opérateurs logiques not and or - opérateurs de comparaison == != < > <= >= # égal à # différent de # relation d’ordre Type complexe : la partie imaginaire est suffixée par j type(5+3j) (3+4j).real (3+4j).imag (3+4j).conjugate() abs(3+4j) complex # real est un attribut du complexe (sa partie réelle) # conjugate est une méthode de l’objet de type (ou de classe) complex # la fonction abs calcule le module du complexe Type chaine de caractère : une chaine de caractères s’écrit entre guillemets 'chaine' ou "chaine" type("chaine") str Opérations élémentaires : len("chaine de caractères") "chaine "+"de "+"caractères" 20 "chaine de caractères" # concaténation Extraction de caractères (ils sont numérotés à partir de zéro) : "chaine de caractères"[2] "chaine de caractères"[2:4] "chaine de caractères"[-1] 'a' 'ai' 's' # on compte à l’envers b) Types de conteneurs Type n-uplet (tuple en anglais) : Il s’agit d’une suite d’éléments de types quelconques encadrés par () type((1,3,'a')) () tuple (1,) (5,3) Un tuple est non mutable, les opérations possibles sont limitées à : t=(1,’a’,False) t[0] t[-1] t[2:3] t[1:3] len(t) t+t # accès aux éléments # extraction de sous-tuples # concaténation Type liste : Il s’agit d’une suite d’éléments de types quelconques encadrés par [] type([True,5,4,5]) list Une liste est un objet mutable, on peut en modifier le nombre et la valeur de ses éléments. Opérations sur les listes : L=[12.0,"aa",2,3,5] len(L) L[0] L[1:3] L+[True,"bon"] L.append(50) L.insert(2, 60) L.pop(3) del(L[0:3]) G=L.copy() L[i]=x L[i:j+1]=t L[i:j+1] L.count(x) L.reverse() # affectation # accès aux éléments et extraction de sous-listes # concaténation # insère 50 à la fin de la liste L, L est modifiée # insère 60 en position 2 à la liste L, L est modifiée # renvoie L[3] et le supprime dans L, L est modifiée # supprime la tranche d’éléments d’index de 0 à 2, L est modifiée # copie la liste L et l'affecte à G # l'élément d'indice i est remplacé par x, L est modifié # la tranche d'éléments d'indice i à j est remplacée par t, L est modifiée # construit une nouvelle liste avec les éléments d'indice compris entre i et j # compte le nombre d'occurrences de x dans L # renverse L en place, L est modifiée Type ensemble : Il s’agit d’un ensemble d’éléments de types quelconques encadrés par {} type({2,'a',9}) set Par définition il n’y a pas deux éléments identiques dans un ensemble ! Opérations sur les ensembles : s={1,2,3,4} len(s) s.add(x) s.remove(x) 3 in s s.union({7,8},{'a','b'}) s.intersection({1,5},{1,8}) s.copy() # cardinal de s # insère la valeur de x en modifiant s # supprime la valeur de x en modifiant s # test d'appartenance # retourne un nouvel ensemble réunion de s et des arguments # retourne un nouvel ensemble intersection de s et des arguments # construit un nouvel ensemble contenant les mêmes éléments que s Type tableau numpy (numpy.ndarray) On peut construire des tableaux à partir de listes Python avec numpy.array : import numpy as np type(np.array([1,2,3]) np.ndarray Les objets sont convertis en un type commun, tous les éléments sont de même type. a=np.array([1,2.0,3]) len(a) array([1.,2.,3.]) 3 Un tableau numpy est un objet mutable. a[1]=6 a array([1.,6.,3.]) Outils de construction de tableaux : a=np. arange(1,3) a np.arange(1,10,2) array([1,2,3]) array([1,3,5,7,9]) np.linspace(0,1,5) array([0, 0.25, 0.5, 0.75, 1. ]) # construit un tableau d'entiers entre 1 et 9 # de pas 2 # construit un tableau de 5 points répartis # uniformément entre 0 et 1 Outils de construction de matrices : a=np.ones((2,3)) array([[ 1., 1., 1.], [ 1., 1., 1.]]) array([[ 0., 0., 0.], [ 0., 0., 0.]]) b=np.zeros((2,3)) # construit une matrice de 1 de taille 2-3 # construit un tableau de 0 de taille 2-3 Calculs sur les tableaux : t=np.linspace(0,1,50) C=np.cos(t) S=np.sin(t) # calcule un tableau dont les éléments sont les cosinus des éléments de t Différences entre tableau numpy et liste python : • Tous les éléments d’un tableau numpy sont de même type, ce n’est pas nécessaire pour une liste. • + est l’opérateur de concaténation sur deux listes (pas nécessairement de même dimension), c’est un opérateur d’addition des éléments qui se correspondent sur deux tableaux numpy de même dimension. • On peut effectuer directement la transformation de tous les éléments d’un tableau numpy par une fonction numpy sans passer par une affectation sur chaque élément dans une boucle (cf dernier exemple). Cela simplifie beaucoup l’écriture des calculs sur les tableaux (vecteurs, matrices). • On peut extraire un élément d’une matrice Mi , j par M[i,j] ou M[i][j] pour un tableau numpy, mais seulement par M[i][j] pour une liste. • L’affichage d’un tableau numpy représentant une matrice est plus lisible que celui de la liste correspondante. 3. Conversion de type float(2) float('1.2') int(2.1) int('256') str(2) bool('True') list('Bonjour') list((1,5,True)) Tableau_numpy=numpy.array([2,3,5]) list(Tableau_numpy) tuple([1,5,2]) 4. Variables et affectation Une variable est un nom associé à l'adresse mémoire d'une donnée. Exemple : 25 ← donnée a ----------> 01100101 տ adresse variable ր Lors d’une affectation variable=valeur, on associe à la variable l’adresse de la valeur. a=12 b=a a=13 print(a) print(b) Un objet de type simple est non mutable. Une deuxième affectation fait pointer la variable vers une autre adresse. Les tuples et les chaines sont également des objets non mutables : on ne peut pas changer la valeur d’un élément d’un tuple ou d’une chaine (ne supportent pas l’affectation). Par contre les listes, les ensembles, les tableaux numpy sont mutables. Affectation multiple, échange de variables : x,y=10,11 x,y=y,x 5. Instructions conditionnelles La structure d’une instruction conditionnelle est la suivante : if condition1 : instructions1 elif condition2 : instructions2 else : instructions3 6. Boucles inconditionnelles Une boucle inconditionnelle est un bloc d’instructions répétées un nombre déterminé de fois. Exemples : for element in range(i,j,h) : instructions # element prend toutes les valeurs entières entre i et j avec un pas h for element in conteneur : instructions # element prend toutes les valeurs dans un conteneur # conteneur peut être une chaine, un tuple, une liste, un ensemble… 7. Boucles conditionnelles La structure d’une boucle conditionnelle est : while condition : instructions Exemple : a=0 while a<7 : a=a+1 print(a) 8. Fonctions ou procédures La structure d’une fonction ou procédure est la suivante : def <nom>(arg1,arg2,...) : instructions Exemple : def f(x) : if x>0 : return x+3 else : None On peut aussi utiliser la mini syntaxe sur une ligne avec le mot clé lambda : f=lambda a,b,c : a+10*b+10*10*c 9. Entrées et sorties Affichage à l’écran print("Commentaire 1 : ",variable1,"\n","Commentaire 2 : ",variable2,sep='') Lecture ou écriture de données dans un fichier Le fichier donnees.txt contient les lignes suivantes (coordonnées de points) : 10 2 5 354 529 - lecture des données du fichier : f=open('donnees.txt','r') L=[] for ligne in f: x,y,z=ligne.split() L.append([int(x),int(y),int(z)]) f.close() # split est une méthode des objets de type chaine - écriture de données dans un fichier : Exemple : ajouter un quatrième point (1 7 6) dans le fichier précédent f=open('donnees.txt','r') L=f.readlines() f.close() L.append('1 7 6\n') f=open('donnees.txt','w') f.writelines(L) f.close() 10. Structure d’un programme python ## Gestion du système from os import chdir chdir('D:\Travaux\TD1') ## Import des modules import time import numpy as np ## Définition des fonctions def cherchemax(Y): n=len(Y) maxi=0 indice=0 for i in range(0,n): if(Y[i]>maxi): indice=i maxi=Y[i] return indice,maxi # Pour définir le chemin du répertoire par défaut ; attention aux ' # Pour pouvoir déclencher le chronomètre # Y est une liste d’entiers naturels ## Script principal Y=[5,2,8,1,4] indice,maxi=cherchemax(Y) print("Le plus grand élément de L vaut: ",maxi,"\n","Son index est : ",indice,sep='')