python - IRMA - Université de Strasbourg
Transcription
python - IRMA - Université de Strasbourg
PIP: Certification python http://www.python.org Marcela Szopos, Michel Mehrenberger, Laurent Navoret, Pierre Navaro Szopos-Mehrenberger-Navoret-Navaro (UDS) Université de Strasbourg 28 mars 2015 Python 28 mars 2015 1 / 174 But : Interface graphique en Python. Volume horaire : 13h cours intégré et 13h TD 13 Séances S1,S2,S4,S6,S8,S10 : 6 seances de cours, groupe complet S3,S5,S7,S9,S11,S12 : 6 seances de TP, groupe dédoublé (L. Navoret/M. Mehrenberger) S13 : TP noté Évaluation continue intégrale : 1ère session : contrôle continu (TP, mini projet), coefficient 1 ; 2ème session : épreuve orale. Pour qui ? M1 Calcul Scientifique et Mathématiques de l’Information ; M1 Mathématiques Fondamentales, parcours Recherche. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 2 / 174 Séances de cours Slides de M. Szopos : section I a X Slides complémentaires : section XI ⇒ Matériel disponible sur moodle The Python Tutorial : à consulter/télécharger sur internet Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 3 / 174 Séances de TP Sujet de TP papier Questions à répondre sur papier Questions sur fichier(s), dossier... Pour le TP noté : Sujet papier Rendre un seul fichier TP_Nom_Prenom.py par email ou clé usb Rendre feuille(s) pour les questions sur papier (questions préliminaires à la programmation, résultats, commentaires) Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 4 / 174 Mini-projet Sujet parmi une liste de titres Citer les sources Par binôme Rendu : répertoire Nom1_Nom2 (ordre alphabétique) contenant Rapport Nom1_Nom2.pdf (pas slides) contenant La description et motivation du sujet La méthode utilisée Les résultats obtenus Fichiers et éventuellement sous-répertoires avec commentaires, README pour l’utilisation/présentation Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 5 / 174 Execution de python Méthode 1 : interactif Lancer python ou ipython Pour faire des petits calculs/vérifications Attention : pas de sauvegarde Ctrl+D ou quit() pour sortir Méthode 2 : dans un fichier Sauvegarder un fichier fichier.py Utilisation d’un éditeur adapté (Ex : pycharm) Executer ce fichier (dans la console, dans l’éditeur, en mode interactif...) Méthode 3 : web Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 6 / 174 I. INTRODUCTION Historique I ∼ 1990 : première version du langage, due à Guido Van Rossum (Centrum voor Wiskunde en Informatica (CWI), Amsterdam, Pays-Bas). Licence : Python Software Foundation License http://docs.python.org/2/ license.html http://fr.wikipedia.org/wiki/Python_langage Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 7 / 174 I. INTRODUCTION Utilisation I En entreprise : Google Groups Web Interface (Guido van Rossum y a travaillé, 2005 – 2012) ; Nasa Workflow Automation Software ; Zope Web Application server etc. Comme langage de commande de différents logiciels libres : Blender (logiciel de modélisation 3D) ; LibreOffice (bureautique) ; ParaView (logiciel de visualisation de données numériques) etc. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 8 / 174 I. INTRODUCTION Utilisation I Dans le monde académique, sous forme de bibliothèques scientifiques : Calcul : NumPy, SciPy, PyIMSL Studio, Sympy, SAGE Visualisation : pydot, maplotlib, pyngl, MayaVi ; Simulation : simPy ; Chimie : PyMOL, MMTK, Chimera, PyQuante ; Biologie : Biopython etc. Voir aussi : Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 9 / 174 I. INTRODUCTION Utilisation II http://www.scipy.org/Topical_Software http: //www.enthought.com/products/epdlibraries.php Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 10 / 174 I. INTRODUCTION Avantages I Python : langage de programmation moderne. Programmation structurée (à l’aide de fonctions). Programmation orientée objet (interaction de briques logicielles élémentaires appelées “objets”). Python : logiciel libre. www.python.org Python : logiciel portable (Windows, Linux, Mac OS). Installation très simple, exemple (Ubuntu) : apt-get install python Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 11 / 174 I. INTRODUCTION Quelques caractéristiques I Langage interprété : un programme est traduit en langage-machine au moment de son exécution ; en opposition avec les langages compilés (par exemple FORTRAN, C, C++), où le programme est traduit en langage-machine une fois pour toutes. Langage de haut-niveau : orienté autour du problème à résoudre ; les programmes sont écrits en utilisant des mots usuels (très souvent de l’anglais) et des symboles mathématiques familiers ; à comparer avec des langages de bas niveau, où le codage se rapproche du langage machine. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 12 / 174 I. INTRODUCTION Performances (merci à Pierre Navaro) I Python n’est pas rapide ... mais : Ce n’est pas toujours vrai. Il y a des modules performants en C/C++/Fortran. (Numpy) C’est le programmeur qui devient plus efficace. Ce qu’il faut optimiser, c’est le temps jusqu’au bout du projet. Conseils de programmation Ecrivez votre programme en Python d’Äôabord. Si c’est assez rapide, soyez contents. Sinon, optimisez les parties critiques (et rien d’autre). L’optimisation trop précoce est souvent source d’erreurs. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 13 / 174 I. INTRODUCTION Exécution d’un programme Python I Méthode 1 : en tapant les lignes du code une à une dans l’interpréteur (comme dans Matlab/Octave/Scilab). % python Python 2.7.3 (default, Aug 1 2012, 05:14:39) [GCC 4.6.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> quit Use quit() or Ctrl-D (i.e. EOF) to exit >>> quit() Le (+) : facile pour une utilisation ponctuelle. Le (-) : fastidieux si l’on veut ré-exécuter le programme (il faut tout re-taper). Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 14 / 174 I. INTRODUCTION Exécution d’un programme Python Méthode 2 : utiliser un programme d’édition de texte pour sauver le programme dans un fichier (extension ’.py’). Quels éditeurs de texte (libres) ? Emacs, Vim : puissants, mais nécessitent une prise en main préalable. Gedit sous GNOME ou Kate sous KDE. éditeurs dédiés à Python : DrPython, Eric3, SPE. sous Windows (si aucun des éditeurs cités ci-dessus n’est installé) : le bloc-notes. Étapes : taper le programme, le sauvegarder dans un fichier nommé prog.py, saisir la commande execfile(’prog.py’) pour l’exécuter dans l’interpréteur Python. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 15 / 174 I. INTRODUCTION La “calculatrice” Python I Addition et soustraction : >>> 20+80 100 >>> 6−5 1 Multiplication : >>> 2 * 5 10 Puissance : >>> 5 * * 2 25 D i v i s i o n vs . d i v i s i o n sans r e s t e , n i decimales vs . Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 16 / 174 I. INTRODUCTION La “calculatrice” Python II d i v i s i o n avec decimales : >>> 21/3 7 >>> 23/3 7 >>> 2 3 . 0 / 3 . 0 7.6666... Reste de l a d i v i s i o n : >>> 49%10 9 A f f i c h a g e du r e s u l t a t a l ’ ecran : >>> p r i n t "1 + 2 e s t une a d d i t i o n " 1 + 2 e s t une a d d i t i o n Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 17 / 174 I. INTRODUCTION La “calculatrice” Python III Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 18 / 174 I. INTRODUCTION Commandes I TABLE: Opérations Python commande + * / % ** Szopos-Mehrenberger-Navoret-Navaro (UDS) nom addition multiplication division reste puissance Python exemple 4+5 4*5 18/3 19%3 2**4 sortie 9 20 6 5 16 28 mars 2015 19 / 174 I. INTRODUCTION Commandes II La priorité (ordre) des opérations est respectée (mêmes règles qu’en maths) : 1 parenthèses () 2 puissance ** 3 multiplication *, division et reste 4 addition + et substraction - Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 20 / 174 I. INTRODUCTION Priorité des opérations Un exemple simple : Code Listing 1 – Exemple 1 >>> 1 + 2 * 3 7 >>> (1 + 2) * 3 9 Une remarque importante : un programme source est destiné à l’être humain ! Pour en faciliter sa lecture, il doit être judicieusement commenté. Un commentaire commence par le caractère # et s’étend jusqu’à la fin de la ligne. Code Listing 2 – Exemple 2 >>> # Voici un commentaire >>> 9+2 # en voici un autre 11 Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 21 / 174 I. INTRODUCTION Les expressions booléennes Deux valeurs possibles : False, True. Opérateurs de comparaison : ==, !=, >, >=, <, <=. Code Listing 3 – Exemple 3 >>> 2 > 8 # False >>> 2 <= 8 < 15 # True Opérateurs logiques (concept de shortcut) : not, or, and. Code Listing 4 – Exemple 3 >>> (3==3) or (9 >24) # True (des le premier membre) >>> (9 > 24) and (3==3) # False (des le premier membre) Les opérateurs logiques et de comparaisons sont à valeurs dans False, True. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 22 / 174 II. VAR LOOPS Les données et les variables Variable C’est un nom donné à une valeur. Informatiquement, c’est une référence à une adresse mémoire. Remarques : Les noms des variables sont conventionnellement écrits en minuscule ; ils commencent par une lettre ou le caractère souligné (_), puis, éventuellement, des lettres, des chiffres ou encore du caractère _. Ils doivent être différrents des mots réservés de Python : import keyword print "Liste des mots-cle :", keyword.kwlist Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 23 / 174 II. VAR LOOPS L’affectation Affectation On affecte une variable par une valeur en utilisant le signe = ; dans une affectation, le membre de gauche reçoit le membre de droite. Remarque : Affecter n’est pas comparer ! l’affectation a un effet mais n’a pas de valeur : >>>a=b >>> la comparaison a une valeur mais n’a pas d’effet : >>> a==b False >>> Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 24 / 174 II. VAR LOOPS Instructions d’affectation : différentes formes a=10 # forme de base a+=1 # # # # meme chose que a = a + 1, si a est avantage : si a est une expression a besoin d’une seule evaluation de forme standard : a est evalue deux deja connue; complique, on a ; fois. b = c = 10 # cibles multiples # (affectation de droite a gauche) d, e, f = 1.5, 2.5, 3.5 # affectation de tuple # (par position) g, h = h, g # echange les valeurs de g et h m, n = [5,7] # affectation de liste (par position). Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 25 / 174 II. VAR LOOPS Typage Python détecte automatiquement le type des variables : # definition d’un entier valant 1 a=1 b=a/2 print b ??? type(b) ??? # definition d’un nombre reel a=1.0 b=a/2 print b ??? type(b) ??? Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 26 / 174 II. VAR LOOPS Typage Python détecte automatiquement le type des variables : # definition d’un entier valant 1 a=1 b=a/2 print b 0 # division euclidienne sur les entiers, de 1 par 2. type(b) <type ’int’> # definition d’un nombre reel a=1.0 b=a/2 print b 0.5 # division classique sur les reels. type(b) <type ’float’> Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 27 / 174 II. VAR LOOPS Les entrées / sorties L’instruction input permet de saisir une entrée au clavier. Comme c’est une évaluation, elle effectue un typage dynamique. >>> n = input("Entrez un entier : ") Entrez un entier : 7 >>> type(n) <type ’int’> >>> n = input("Entrez un entier : ") Entrez un entier : 1.1 >>> type(n) <type ’float’> L’instruction print permet d’afficher des sorties à l’écran : >>> a=2 >>> b=5 >>> print("La somme a+b est : "), a+b La somme a+b est : 7 Le séparateur virgule permet d’empêcher le retour à la ligne. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 28 / 174 II. VAR LOOPS Instructions conditionnelles But : Contrôler une alternative. Code Listing 5 – La syntaxe de IF - ELIF - ELSE if {conditions}: {executer ce code} elif {conditions}: {executer ce code} elif {conditions}: {executer ce code} else: {executer ce code} Remarques : Il est possible, après un IF de tester autant de conditions que l’on souhaite avec des ELIF (y compris 0) ; par contre, il ne peut y avoir qu’un seul ELSE à la fin. Le caractère : est obligatoire à la fin de chaque ligne contenant IF, ELIF ou ELSE. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 29 / 174 II. VAR LOOPS Instructions conditionnelles Trouver, par exemple, le minimum de deux nombres : x, y =4, 3 # Ecriture classique : if x<y: min=x else: min=y # Utilisation de l’operateur ternaire : min = x if x < y else y Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 30 / 174 II. VAR LOOPS Instructions conditionnelles Un autre exemple : nom=input("Introduire un nom : ") if nom == "Marie": print "Bonjour Marie !" elif nom == "Pierre": print "Salut Pierre !" elif nom == "Michel": print "Salut Michel !" else: print "Nouveau prenom" Question : Saisissez un flottant. S‚Äôil est positif ou nul, affichez sa racine, sinon affichez un message d‚Äôerreur. Utiliser : # import from math import sqrt Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 31 / 174 II. VAR LOOPS Boucle WHILE But : Répéter une portion de code. Code Listing 6 – La syntaxe de WHILE while {condition a laquelle la boucle continue}: {code execute dans la boucle} # indentation necessaire, d’habitude 4 espaces; {code qui ne sera pas execute dans la boucle} # car il n’est pas indente. Code Listing 7 – Exemple x = 10 while x != 0: x = x - 1 print ("X decroit, valeur non nulle egale a "), x print ("La boucle est finie, x est nul") Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 32 / 174 II. VAR LOOPS Boucle WHILE Question 1 : Que fait l’exemple précédent ? commenter le résultat. Question 2 : Commenter l’exemple suivant. Code Listing 8 – Exemple n = input("Entrez un entier [1 .. 10] : ") while (n < 1) or (n > 10): n = input("Entrez un entier [1 .. 10], S.V.P. : ") Question 3 : Initialisez deux entiers : a = 0 et b = 10. (i) Écrire une boucle affichant et incrémentant la valeur de a tant qu’elle reste inférieure à celle de b. (ii) Écrire une autre boucle décrémentant la valeur de b et affichant sa valeur si elle est impaire. Boucler tant que b n’est pas nul. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 33 / 174 II. VAR LOOPS Indentation Le code doit obligatoirement être indenté ! Remarques : La tabulation sert à délimiter les blocs de code. C’est une bonne pratique dans tout langage. Code Listing 9 – Indentation >>> a=2 >>> b=3 File "<stdin>", line 1 b=3 ^ IndentationError: unexpected indent Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 34 / 174 II. VAR LOOPS Indentation Un exemple plus complet. Commenter les 3 niveaux d’indentation. Code Listing 10 – Exemple x = 10 while x > 0: print x if x > 5: print "Nombre plus grand que 5" elif x % 2 != 0: print "C’est un nombre impaire" print "Il n’est pas plus grand que 5" else: print "Ce nombre n’est pas plus grand que 5" print "Il n’est pas impaire, non plus" x = x - 1 print "nous avons diminue x de 1" print "on continue la boucle tant que x reste superieur a 0" print "Maintenant x n’est plus superieur a 0" print "la boucle est finie." Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 35 / 174 III. LISTS FOR Les listes : définition et exemples Liste Collection hétérogène, ordonnée et modifiable d’éléments, séparés par des virgules, et entourée de crochets. Code Listing 11 – Créer une liste fruits = [’figue’, ’raisin’, ’abricot’, ’poire’] Opérations de base : >>> print fruits[2] # abricot >>> fruits[1]=13 >>> print fruits # [’figue’, 13, ’abricot’, ’poire’] >>> print fruits[0:2] # [’figue’, 13] Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 36 / 174 III. LISTS FOR Les listes : initialisation Utilisation de la répétition et de l’instruction ’range()’ : Code Listing 12 – Fonction range >>> debut = [] # liste vide >>> repet = [0.0] * 3 # [0.0, 0.0, 0.0] >>> liste_1=range(4) # [0, 1, 2, 3] >>> liste_2=range(4,10) # [4, 5, 6, 7, 8, 9] Liste de listes : >>> liste_3=[liste_1,liste_2] >>> print liste_3 # [[0, 1, 2, 3], [4, 5, 6, 7, 8, 9]] Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 37 / 174 III. LISTS FOR Les listes : indiçage Accès à des éléments ou informations sur la liste : >>> print fruits # [’figue’, ’abricot’, ’poire’, ’pomme’, 18] >>> fruits[1:3] # [’abricot’, ’poire’] >>> fruits[:2] # [’figue’, ’abricot’] >>> fruits[:] # [’figue’, ’abricot’, ’poire’, ’pomme’, 18] Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 38 / 174 III. LISTS FOR >>> fruits[-1] # 18 >>> len(fruits) # 5 >>> 18 in fruits # True Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 39 / 174 III. LISTS FOR Les listes : méthodes Pour ajouter une valeur à †une liste, utiliser la fonction ’append()’ : Code Listing 13 – Fonction append >>> fruits.append(18) >>> print fruits # [’figue’, 13, ’abricot’, ’poire’, ’pomme’, 18] Pour effacer une valeur d’une liste, utiliser la fonction ’del’ : Code Listing 14 – Fonction del >>> del fruits[1] >>> print fruits # [’figue’,’abricot’, ’poire’, ’pomme’, 18] Plus généralement, pour afficher les méthodes de la classe “liste” : help(list) Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 40 / 174 III. LISTS FOR Les listes : techniques de “slicing” Insertion d’éléments Dans le membre de gauche d’une affectation, il faut obligatoirement indiquer une tranche pour effectuer une insertion. Le membre de droite doit lui-même être une liste. Code Listing 15 – Insertion >>> print fruits # [’figue’,’abricot’, ’poire’, ’pomme’, 18] >>> fruits[2:2]=[’orange’] # insertion en 3ieme position >>> print fruits #[’figue’, ’abricot’, ’orange’, ’poire’, ’pomme’, 18] Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 41 / 174 III. LISTS FOR Les listes : techniques de “slicing” Suppression/remplacement d’éléments Mêmes remarques : une tranche dans le membre de gauche, une liste dans le membre de droite. Code Listing 16 – Suppression/remplacement >>> print fruits # [’figue’,’abricot’, ’orange’, ’poire’, ’pomme’, 18] >>> fruits[1:3]=[] # effacement par affectation d’une liste vide >>> print fruits # [’figue’, ’poire’, ’pomme’, 18] >>> fruits[2:4]=[1.5,2.5] # remplacement >>> print fruits # [’figue’, ’poire’, 1.5, 2.5] Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 42 / 174 III. LISTS FOR Les n-uples : définition et exemples N-uples Collection hétérogène, ordonnée et non-modifiable d’éléments, séparés par des virgules, et entourée de parenthèses. Code Listing 17 – Créer un n-uple parametres = (200, ’pression’, 10, ’vitesse’) Remarques : À la différence des listes, les n-uples, une fois créés, ne peuvent être modifiés : on ne peut plus y ajouter d’objet ou en retirer ; Leur parcours est plus rapide que celui des listes ; Ils sont utiles pour définir des constantes, paramètres etc. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 43 / 174 III. LISTS FOR Les dictionnaires : définition et exemples Dictionnaire Collection de couples clé : valeur entourée d‚Äôaccolades. Code Listing 18 – Créer un dictionnaire annuaire = { ’Bureau Marie’ : 201 , \ ’Bureau Pierre’ : 202 , ’Bureau Alain’ : 203 , \ ’Bureau Jeanne’ : 204} Remarques : On les appelle aussi "tableaux associatifs" ; Les indices sont appelés "clés". ; d[Nom] affiche l’élément dont la clé est Nom ; d.keys() affiche les clés ; d.items() affiche les éléments du dictionnaire. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 44 / 174 III. LISTS FOR Boucle FOR But : Répéter une portion de code pour chaque valeur d’une séquence (chaîne, liste ou n-uple). Code Listing 19 – La syntaxe de FOR for {valeur} in {sequence}: {code execute dans la boucle} # indentation necessaire, d’habitude 4 espaces; {code qui ne sera pas execute dans la boucle} # car il n’est pas indente. Code Listing 20 – Exemples for lettre in "bonjour": print lettre, # b o n j o u r for i in [1,2,3]: print i, # 1 2 3 Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 45 / 174 III. LISTS FOR Autres techniques pour les boucles Pour les tableaux de très grande taille, préférez xrange à range : $ python -m timeit ’for i in range(1000000):’ ’ pass’ 10 loops, best of 3: 39.8 msec per loop $ python -m timeit ’for i in xrange(1000000):’ ’ pass’ 100 loops, best of 3: 15.7 msec per loop Utilisation du générateur enumerate : liste = [1,2,3,5,7,11,13] for index, elem in enumerate (liste): print index, elem, Question : Que fait l’exemple précédent ? commenter le résultat. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 46 / 174 III. LISTS FOR Les listes en compréhension : définition et exemples Liste en compréhension Expression qui permet de générer une liste de manière très compacte. Elle est équivalente à une boucle for qui construirait la même liste en utilisant la méthode append(). Code Listing 21 – Exemple, premiere forme : resultat_1 = [x+1 for x in range(5)] # a le meme effet que : resultat_1 = [] for x in range(5): resultat_1.append(x+1) Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 47 / 174 III. LISTS FOR Les listes en compréhension : exemples Code Listing 22 – Exemple, deuxieme forme : resultat_2 = [x+1 for x in range(5) if x > 2] # a le meme effet que : resultat_2 = [] for x in range(5): if x > 2: resultat_2.append(x+1) Code Listing 23 – Exemple, troisieme forme : resultat_3 = [x*y for x in range(5) for y in range(2)] # a le meme effet que : resultat_3 = [] for x in range(5): for y in range(2): resultat_3.append(x*y) Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 48 / 174 III. LISTS FOR Les listes en compréhension Question : Que font les exemples précédents ? commenter les résultats. Question : Utilisez une liste en compréhension pour ajouter 3 à chaque élément d’une liste d’entiers de 0 à 5, mais seulement si l’élément est supérieur ou égal à 2. Question : Utilisez une liste en compréhension pour obtenir la liste [’ad’, ’ae’, ’bd’, ’be’, ’cd’, ’ce’] à partir des chaînes "abc" et "de". Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 49 / 174 IV. FUNC Les fonctions : définition et exemples Fonction Groupe d‚Äôinstructions regroupé sous un nom et s’executant à la demande de l’utilisateur, lors de l’appel. La liste des fonctions Python existantes est disponible en ligne : http://docs.python.org/2/library/functions.html Exemple : >>> abs(x) # Return the absolute value of a number. The argument # may be a plain or long integer or a floating point # number. If the argument is a complex number, its # magnitude is returned. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 50 / 174 IV. FUNC Les fonctions : syntaxe Code Listing 24 – L’operateur DEF def nom_fonction(liste des parametres): """Documentation de la fonction.""" { code execute dans la fonction } # indentation necessaire return {valeur retournee dans le programme principal} { code qui ne sera pas execute dans la fonction } # car il n’est pas indente. Remarques : Dans la définition précédente, nom_fonction est le nom qui sera utilisé ultérieurement pour appeler la fonction ; Le bloc d’instructions est obligatoire. S’il ne fait rien (ou le code n’est pas encore écrit), on utilise l’instruction pass. La documentation est fortement conseillée. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 51 / 174 IV. FUNC Les fonctions : exemples Utilisation sans liste de paramètres : def somme(): """ somme des 10 premiers entiers""" s=0 for x in range(11): s+=x return s # appel de la fonction print ("La somme est :"), somme() # La somme est 55 help(somme) # Help on function somme in module __main__: # somme() # somme des 10 premiers entiers Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 52 / 174 IV. FUNC Passage des arguments Passage par affectation Chaque argument de la définition de la fonction correspond, dans l’ordre, à un paramètre de l’appel. La correspondance se fait par affectation. Exemple, plusieurs paramètres, pas de retour : def table(base, debut, fin): """ !!! A COMPLETER !!! """ n = debut while n <= fin: print n,x,base,=,n*base, n += 1 # exemple d’appel : table(7, 2, 11) Question : Que fait l’exemple précédent ? commenter. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 53 / 174 IV. FUNC Un ou plusieurs paramètres, utilisation du retour from math import pi def cube(x): return x**3 def volumeSphere(r): return 4.0 * pi * cube(r) / 3.0 # Saisie du rayon et affichage du volume rayon = input("Le rayon de la sphere :")) print ("Volume de la sphere ="),volumeSphere(rayon) Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 54 / 174 IV. FUNC Fonction avec appel récursif def fibo(n): """ Retourne le nombre de Fibonacci n """ if n == 0 or n == 1: return n else: return fibo( n - 1 ) + fibo( n - 2 ) # Appel de la fonction print fibo(9) Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 55 / 174 IV. FUNC Fonction avec un nombre d’arguments arbitraire Fonction à nombre variable de paramètres : def Somme(*args): """ Retourne la somme de n-uple """ S = 0 for nombre in args: S += nombre return S # Exemples d’appel : print Somme(35) # 35 print Somme(12, -36, 30) # 6 Fonction à nombre variable de paramètres nommés : def myfunc(**kwargs): print kwargs myfunc(a=4, b=’python’, pi=3.14) # {’a’: 4, ’b’: ’python’,’pi’: 3.14} Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 56 / 174 IV. FUNC Fonctions Question : Ecrire une fonction VolCyl qui retourne le volume d’un cylindre. Les paramètres sont le rayon R et la hauteur H. Tester cette fonction par des appels avec différents arguments. Question : Ecrire une fonction SolEq pour calculer les solutions réelles de l’équation ax 2 + bx + c = 0. Le résultat de la fonction sera un n-uple : sur la première position, on affiche le nombre de racines réelles (0, 1 ou 2) et sur les positions suivantes les racines réelles ainsi calculées. Tester pour (1, −3, 2), (1, −2, 1) et (1, 1, 1). Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 57 / 174 IV. FUNC Portée des objets Portée Les noms des objets sont créés lors de leur première affectation, mais ne sont visibles que dans certaines régions de la mémoire. Remarques : Portée globale : celle du module __main__. Un dictionnaire gère les objets globaux : l’instruction globals() fournit les couples variables : valeur ; Portée locale : les objets internes aux fonctions (et aux classes) sont locaux. Les objets globaux ne sont pas modifiables dans les portées locales. L’nstruction locals() fournit les couples variable : valeur. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 58 / 174 IV. FUNC Exemple de portée (1/3) # x et fonc sont affectes dans le module : globaux def fonc(y): # y et z sont affectes dans fonc : locaux # dans fonc : portee locale z = x + y return z x = 99 print fonc(1) # resultat : ? Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 59 / 174 IV. FUNC Exemple de portée (2/3) # x et fonc sont affectes dans le module : globaux def fonc(y): # y, x et z sont affectes dans fonc : locaux x = 3 # ce nouvel x est local et masque le x global z = x + y return z x = 99 print fonc(1) # resultat : ? Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 60 / 174 IV. FUNC Exemple de portée (3/3) # x et fonc sont affectes dans le module : globaux def fonc(y): # y et z sont affectes dans fonc : locaux global x # permet de modifier x a la ligne suivante x += 2 z = x + y return z x = 99 print fonc(1) # resultat : ? Question : Quel sont les résultats dans les trois exemples précédents ? Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 61 / 174 IV. FUNC Les fonctions map et zip : définition et exemples zip permet de parcourir plusieurs séquences en parallèle : Code Listing 25 – ZIP : L1 = [1, 2, 3] L2 = [4, 5, 6] for (x, y) in zip(L1, L2): print x, y, ’--’, x + y # 1 4 -- 5 # 2 5 -- 7 # 3 6 -- 9 map applique une méthode sur une ou plusieurs séquences et peut être beaucoup plus rapide qu’une boucle for : Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 62 / 174 IV. FUNC Code Listing 26 – MAP : from math import factorial map(factorial,range(4)) # [ 1, 1, 2, 6] Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 63 / 174 IV. FUNC Utilisation de MAP Question : En partant d’une liste de n éléments (l=range(n)), on veut produire une nouvelle liste qui contient les valeurs e + 1 pour tous les éléments e de la liste de départ. Exemple : [0, 1, 2, . . .] −→ [1, 2, 3, . . .]. Proposer : Une version avec une boucle for ; Une version avec map ; Une version avec une liste de compréhension. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 64 / 174 V. MODULES FICHIERS Les modules : définition. Module Fichier indépendant permettant d’élaborer des bibliothèques de fonctions ou de classes. Remarques : Avantage : on peut sauvegarder du code pour pouvoir le réutiliser ultérieurement. On donne généralement au nom du fichier ainsi créé l’extension .py. La documentation (fortement conseillée !) et les tests peuvent être intégrés au module. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 65 / 174 V. MODULES FICHIERS Les modules : utilisation Import d’un module : deux syntaxes possibles. La commande import <nom module> importe la totalité des objets du module. import math La commande from <nom module> import obj1, obj2 ... n’importe que les objets obj1, obj2 ... du module. from math import pi, sin, log Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 66 / 174 V. MODULES FICHIERS Les modules : exemple Dans un fichier Fibo.py : def fib(n): """ n-ieme terme de la suite de Fibonacci""" a, b = 0, 1 while b < n: print b a, b = b, a+b Appel de la fonction fib : Méthode 1 : import Fibo Fibo.fib(1000) Méthode 2 : from Fibo import fib fib(1000) Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 67 / 174 V. MODULES FICHIERS Exécution d‚Äôun module Python def print_fib(n): """ !!! A COMPLETER !!! """ a, b = 0, 1 while b < n: print b, a, b = b, a+b def list_fib(n): """ !!! A COMPLETER !!! """ result,a,b =[],0,1 while b < n: result.append(b) a, b = b, a+b return result if __name__ == ’__main__’: print_fib(100) print list_fib(100) Question : Que fait l’exemple précédent ? commenter. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 68 / 174 V. MODULES FICHIERS Modules disponibles 1 Bibliothèque standard, avec des modules couvrant des domaines très divers (maths, administration système, manipulation de fichiers etc.) http://docs.python.org/3/py-modindex.html 2 Nombreux modules (environ 41.000 ! ! ! à ce jour) développés par la communauté Python https://pypi.python.org/pypi Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 69 / 174 V. MODULES FICHIERS Le module math Le module math permet d’importer les fonctions et les constantes mathématiques usuelles. commande Python pi, e, exp(x) log(x), log(x,a) pow(x,y), floor(x), abs(x), factorial(n) sin(x), cos(x), tan(x), asin(x), ... sinh(x), cosh(x), tanh(x), asinh(x), ... constante / fonction math π, e = exp(1), exp(x) ln(x), loga (x) x y , [x], |x|, n! fonctions trigonométriques fonctions hyperboliques Exemples : Méthode 1 : import math math.cos(math.pi / 4.0) Méthode 2 : from math import * cos(pi / 4.0) Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 70 / 174 V. MODULES FICHIERS Le module random Le module random propose diverses fonctions permettant de générer des nombres (psedo-)aléatoires qui suivents différentes distributions mathématiques. random.randrange(p, n, h) # choisit un entier aleatoirement dans range(p,n,h) random.randint(a, b) # choisit un entier N aleatoirement tel que # a <= N <= b. random.choice(seq) # choisit un aleatoirement dans la sequence seq random.random() # renvoie un decimal aleatoire dans [0,1[ random.uniform(a, b) # choisit un reel N aleatoirement, tel que # a <= N <= b si a <= b et b <= N <= a si b < a. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 71 / 174 V. MODULES FICHIERS Le module decimal Un exemple surprenant : >>> 1.1 + 2.2 3.3000000000000003 >>> 0.1 + 0.1 + 0.1 - 0.3 5.551115123125783e-17 Question : Pourquoi ? À comparer avec >>> from decimal import * >>> Decimal(’1.1’) + Decimal(’2.2’) Decimal(’3.3’) >>> Decimal(’0.1’) + Decimal(’0.1’) + Decimal(’0.1’) - Decimal(’0.3’) Decimal(’0.0’) Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 72 / 174 V. MODULES FICHIERS Chemin de recherche d’un module Python Recherche dans sys.path : dans le répertoire courant ; dans PYTHONPATH si défini (même syntaxe que PATH) ; dans un répertoire par défaut (sous Linux : /usr/lib/python) Remarque : Si l’on importe un module personnel qui n’est pas dans le répertoire où se trouve le fichier à exécuter, un message d’erreur est renvoyé, disant que ce module est inconnu. Solution : Utiliser le module sys, qui contient des variables spécifiques au système et et permet l’accès aux options passées en ligne de commande : écrire au début du fichier dans lequel on souhaite importer le module. import sys sys.path.append(’le/chemin/de/mon/module/’) import mon_module Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 73 / 174 V. MODULES FICHIERS Ouverture et fermeture des fichiers Le type fichier est un type prédéfini de Python. Principaux modes d’ouverture : f1 = open("monFichier", "r") # ouverture en lecture seule f2 = open("monFichier", "w") # ouverture pour ecriture : si le fichier n’existe pas, # il est cree, sinon son contenu est ecrase f3 = open("monFichier", "a") # ouverture pour ajout : si le fichier n’existe pas, # il est cree, sinon l’ecriture s’effectue a la suite # du contenu deja existant f4 = open("monFichier", "+") # ouverture pour lecture et ecriture Une seule méthode de fermeture : f1.close() Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 74 / 174 V. MODULES FICHIERS Exemples Méthodes d’écriture : f = open("fichier.txt", "w") s = ’toto’ f.write(s) # ecrit la chaine s dans f l = [’a’, ’b’, ’c’] f.writelines(l) # ecrit les chaines de la liste l dans f f.close() Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 75 / 174 V. MODULES FICHIERS On peut aussi utiliser le "print étendu" : f = open("fichier.txt", "a") print >> f, "abcd" # ecrit dans f en mode ajout f.close() Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 76 / 174 V. MODULES FICHIERS Lecture sequentielle f = open("fichier.txt", "r") s = f.read() # lit tout le fichier --> string s = f.read(n) # lit au plus n octets --> string s = f.readline() # lit la ligne suivante --> string s = f.readlines() # lit tout le fichier --> liste de strings for ligne in f: print ligne # bon procede parcours d’un fichier f.close() Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 77 / 174 V. MODULES FICHIERS Le module pickle Plus que du stockage, il permet la conservation des types : import pickle a, b = 5, 2.83 f = open("Fichier.txt", "w") # en ecriture pickle.dump(a, f) pickle.dump(b, f) f.close() f = open("Fichier.txt", "r") # en lecture t = pickle.load(f) print t, type(t) t = pickle.load(f) print t, type(t) # 5 <type ‚Äôint‚Äô> # 2.83 <type ‚Äôfloat‚Äô> f.close() Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 78 / 174 V. MODULES FICHIERS Manipulation des modules / fichiers Question 1 : Que font les fonctions pickle.dump et pickle.load dans l’exemple précédent ? Question 2 : Écrire une fonction qui renvoie le nombre de lignes d’un fichier. Question 3 : Créer un fichier texte contenant une suite aléatoire de chiffres (on pourra utiliser la fonction randint() du module random). Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 79 / 174 VI. NUMPY NumPy : introduction NumPy Le module incontournable du calcul scientifique avec Python. Remarques : S’installe comme un module Python standard. Contient les fonctions de manipulation des tableaux pour le calcul numérique. Bibliothèque mathématique importante. import numpy as np # les noms numpy sont accessibles avec le prefixe np # inutile d’importer math dans la suite. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 80 / 174 VI. NUMPY Les tableaux NumPy ndarray Collection indexable, contenant des éléments du même type et de la même taille. Remarques : Contrairement aux listes, ils contiennent des objets de types identiques, comme des flottants, ou des entiers. Comparés aux listes simples, les objets fournis par NumPy sont optimisés pour le calcul numérique. La manipulation est similaire à tout autre objet Python. Les dimensions et parcours sont modifiables, les indexations souples. http: //docs.scipy.org/doc/numpy/reference/arrays.ndarray.html Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 81 / 174 VI. NUMPY Création de tableaux Différentes méthodes : par le contenu : a=np.array([1,3,5,7,9,11,13,17]) # liste de valeurs par la dimension (une liste : dimension 1, une liste de listes : dimension 2, une liste de listes de listes : dimension 3 etc.) : a=np.array([0.1, 0.0, 0.2]) b=np.array([[1,2,3],[4,5,6]]) par le type d’elément : a=np.array([0.1, 0.0, 0.2],dtype=’f’) b=np.array([[1,2,3],[4,5,6]],dtype=’i’) # dtype est optionnel dans toutes les creations de # tableaux et fixe par defaut a float Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 82 / 174 VI. NUMPY Création de tableaux Différentes méthodes (suite) : comme fonction de ces indices : def initfunction(i,j): return 100+10*i+j c=np.fromfunction(initfunction,(5,3)) à partir d’un fichier : a=np.ones((3,5,7)) np.save("data.npy",a) b=np.load("data.npy") Question : Que font les exemples précédents ? commenter. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 83 / 174 VI. NUMPY Les tableaux NumPy structurés (Record arrays) http://docs.scipy.org/doc/numpy/reference/routines. array-creation.html np.empty(N,dtype=’int’) # tableau vide de N entiers np.empty(N,dtype=’float’) #tableau vide de N reels Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 84 / 174 VI. NUMPY np.zeros(N) # tableau de N zeros np.ones((N,M)) # tableau de dimension (N,M) de uns np.zeros_like(a) # tableau de zeros de meme dimension et type qu’un # tableau a (idem np.ones_like, np.empty_like). np.arange(M,N,P) #tableau allant de M a N avec pas P (M et P optionnels, # les valeurs par defaut sont M=0 et P=1) Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 85 / 174 VI. NUMPY Modification du profil d’un tableau Les dimensions d’un tableau et/ou le nombre de dimensions peuvent être changés : flat : vue 1D d’un tableau sans modification : np.eye((3)).flat[:] # A COMPLETER shape : n-uplet des dimensions d’un tableau a=ones((3,5,7)) a.shape # A COMPLETER modification des dimensions, en conservant la longueur totale : a=np.ones((4,6)) a=a.reshape(8,3) # A COMPLETER Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 86 / 174 VI. NUMPY Copie et référence b=a.copy() # copie d’un tableau a dans un tableau b b=a # ne copie pas les elements, mais cree juste une # reference, i.e. si a est modifie, b l’est aussi. Exécuter les scripts Python suivants ; commenter. a = np.ones((4,3)) b = a.transpose() b[0,1] = 10 print a a = np.arange(12) b = a.reshape((4,3)) b[0,1] = 10 print a Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 87 / 174 VI. NUMPY Référencer les éléments d’un tableau a=np.arange(24).reshape(2,3,4) # A COMPLETER Accès à un élément dans le tableau : a[0][2][1] # A COMPLETER Syntaxe avec implémentation optimisée pour l’accès : a[0,:-1] # A COMPLETER La syntaxe fonctionne pour la référence et l’assignation : b=a[0:2] a[0:2]=9 # A COMPLETER Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 88 / 174 VI. NUMPY Opérations Opérations mathématiques : toutes les opérations arithmétiques et fonctions classiques s’appliquent terme à terme pour un tableau a : a=np.eye(3) 2*a+1 a**2 1+np.sin(a) # utilisation du sin de numpy Opération globales : a.max() # maximum global a.max(0) # maximum de chaque ligne a.max(1) # maximum de chaque colonne Même chose pour : a.min() a.sum() a.prod() a.mean() # # # # minimum somme produit moyenne Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 89 / 174 VI. NUMPY Calcul numérique matriciel Les matrices sont des tableaux à deux dimensions, les vecteurs des tableaux à une dimension. Création de matrices : np.diag(v) # matrice avec le vecteur v sur la diagonale. np.diag(np.arange(N)) np.diag(np.ones(N)) np.diag(v,i) # matrice avec le vecteur v sur la ieme diagonale # superieure. np.diag(v,-i) # matrice avec le vecteur v sur la ieme diagonale # inferieure. np.identity(n) # matrice identite de taille n Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 90 / 174 VI. NUMPY Opération sur des matrices Utilisées dans numpy.linalg : np.dot(A,B) # produit des matrices A et B np.inner(x,y) # produit scalaire des vecteurs x et y np.linalg.det(A) # determinant de la matrice A np.linalg.inv(A) # inverse de la matrice A np.linalg.solve(A,b) # solution x du systeme lineaire Ax=b Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 91 / 174 VI. NUMPY np.linalg.eigvals(A) # valeurs propres de la matrice A np.linalg.eig(A) # valeurs et vecteurs propres de A Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 92 / 174 VI. NUMPY Différentiation et intégration numérique Intégrale du vecteur y avec la formule des trapèzes ; par défaut avec un pas de 1. Les abscisses ou le pas peuvent être donnés : np.trapz(y) Différences divisées de y : np.diff(y) Gradient d’un tableau à N dimensions : gradient(f, *varargs) Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 93 / 174 VI. NUMPY Utiliser les tableaux Question 1 : un tableau trié. Écrire une fonction partition(n) qui construit un tableau 1d x avec n éléments tels que x0 = 0 ≤ x1 ≤ x2 ≤ . . . ≤ xn−1 = 1 et où les xi , i ∈ {1, . . . , n − 2} sont obtenus au hasard uniforme sur [0, 1]. Question 2 : matrice du laplacien 1d discret. Écrire une fonction mat_lap1d(n) qui, étant donné l’entier n, renvoie la matrice suivante : −1 . . . 0 −1 2 . . . A= .. .. . . −1 0 . . . −1 2 Szopos-Mehrenberger-Navoret-Navaro (UDS) 2 Python . 28 mars 2015 94 / 174 VII. MATPLOTLIB Matplotlib : introduction Matplotlib Module qui permet de générer des graphes depuis Python (très riche en types de graphiques 2D). Remarques : Les (+) : bon rendu graphique, export immediat en .png, .pdf etc. Les (-) : peu adaptée pour les animations, interactivité quasi-inexistante. import matplotlib as mpl # les noms matplotlib sont accessibles avec le # prefixe mpl Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 95 / 174 VII. MATPLOTLIB Description de Matplotlib Les possibilités : Courbes 1D ; Graphiques 2D scalaire et vecteurs ; Formats : png, eps, pdf, svg ... Insertion des formules Latex. Les sous espaces : pyplot : tous les graphiques ; mlab : imite quelques fonctionalités MATLAB ; pylab : module global regroupant mlab, pyplot et numpy. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 96 / 174 VII. MATPLOTLIB Comment utiliser Matplotlib en pratique ? Ne rien apprendre par cœur ! Aller sur http://matplotlib.org Chercher le type de figure que vous voulez. Copier le code source (attention au règles du copyright, citez vos sources !). Adaptez-le si besoin. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 97 / 174 VII. MATPLOTLIB Un premier exemple from pylab import * debut = -2 * pi fin = 2 * pi pas = 0.1 x = arange(debut,fin,pas) y = cos(x) plot(x,y) # genere un graphique avec des lignes et prend comme # valeurs en abscisse (x) et en ordonnees (y) Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 98 / 174 VII. MATPLOTLIB xlabel(’angle (rad)’) ylabel(’cos(angle)’) # donne un nom aux axes title(’Fonction: y = cos(x)’) # definit le titre du graphique grid() # affiche une grille en filligrane show() # active l’affichage a l’ecran du graphique Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 99 / 174 VII. MATPLOTLIB Un autre exemple : utilisation de subplot import numpy as np import matplotlib.pyplot as plt x = np.array([0,1,2,3,4,5,6,7,8,9]) y = x* x plt.figure() plt.subplot(211) plt.plot (x,y,color=’r’) plt.title(’Titre 1’,color=’g’) plt.subplot(212) plt.plot(x,y,marker=’o’) plt.title (’Titre 2’,color=’b’) plt.show() Question : Que fait le script précédent ? commenter. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 100 / 174 VII. MATPLOTLIB L’objet figure import numpy as np import matplotlib.pyplot as plt x = np.arange(0, 10, 0.2) y = np.sin(x) fig = plt.figure() # Nouvelle figure ax = fig.add_subplot(111) # un subplot dans la figure l1, l2 = ax.plot(x, np.sin(x), ’-’, x,np.cos(x),’+’) # deux plots sur l’axe Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 101 / 174 VII. MATPLOTLIB fig.legend((l1, l2), (’sin’, ’cos’), ’upper left’) # legende dans le coin de haut a gauche ax.set_xlabel(’t’) # ’t’ sur l’axe des x ax.set_ylabel(’$\phi$’) # $\phi$ sur l’axe des y (utilisation de Latex) plt .show() Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 102 / 174 VII. MATPLOTLIB Le couple meshgrid - contourf from pylab import * nx = 32 ny = 32 x = linspace(0,1,nx) y = x.copy() X, Y = meshgrid(x,y) F = sin(pi*X)*cos(pi*Y) cs = contourf(X,Y,F) cb = colorbar(cs) show() Question : Que fait le script précédent ? commenter. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 103 / 174 VII. MATPLOTLIB Utilisation de mplot3d from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm import matplotlib.pyplot as plt import numpy as np fig = plt.figure() ax = Axes3D(fig) X = np.arange(-5, 5, 0.25) Y = np.arange(-5, 5, 0.25) X, Y = np.meshgrid(X, Y) R = np.sqrt(X**2 + Y**2) Z = np.sin(R) surf = ax.plot_surface(X,Y,Z,rstride=1,cstride=1, cmap=cm.jet,linewidth=0,antialiased=False) ax.set_zlim3d(-1.01, 1.01) fig.colorbar(surf) plt.show() http://matplotlib.org/mpl_toolkits/mplot3d/api.html Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 104 / 174 VII. MATPLOTLIB Résolution d’une équation différentielle de premier ordre On considère le problème de Cauchy ( u 0 (t) = u(t) ∀ t ∈ [0, 5] (1) u(0) = 1. 1) Calculer la solution exacte de (2). 2) On notera h le pas de temps supposé constant et uj , j = 0, 1, 2, . . . les valeurs approchées de u(tj ), où tj = j h. (a) Ecrire le schéma d’Euler implicite et le schéma d’Euler explicite correspondants à (2). (b) Ecrire le code Python correspondant. (c) Représenter sur le même graphique la solution exacte et les deux solutions numériques ainsi obtenues. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 105 / 174 VII. MATPLOTLIB Améliorer l’interactivité Remarque Plusieurs possibilités : Tkinter, PyQt, PyGTK etc. Tkinter “Tool kit interface” : bibliothèque graphique qui facilite la construction de GUI (Graphic User Interface) simples. Exemple : from Tkinter import * fenetre=Tk() cv=Canvas(fenetre,width=200,height=200) cv.pack() cv.create_line(10,50,100,150) # dessine le segment MN avec M(10,50) et N(100,150) fenetre.mainloop() Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 106 / 174 VII. MATPLOTLIB Tkinter : Comment ça marche ? http://docs.python.org/2/library/tkinter.html Importer Tkinter. Configurer et positionner les widgets (=composantes graphiques) utilisés. Entrer dans la boucle principale de gestion des événements. from Tkinter import * base = Tk() texte = Label(base,text="Bienvenue !",fg="red") texte.pack() bouton = Button(base,text="Quit",command=base.destroy) bouton.pack() base.mainloop() Question : Que font les deux exemples précédents ? commenter. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 107 / 174 VIII. SCIPY Scipy : introduction Scipy Module contenant des algorithmes très utilisés en calcul scientifique : fft, méthodes directes ou itératives pour résoudre des systèmes linéaires, intégration numérique etc. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 108 / 174 VIII. SCIPY Remarques : Dans la suite, on utilise : import numpy as np import scipy as sp On peut le voir comme une extension de Numpy : >>> np.sqrt(-1) # __main__:1: RuntimeWarning: invalid value # encountered in sqrt # nan >>> sp.sqrt(-1) # 1j Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 109 / 174 VIII. SCIPY Description de Scipy http://docs.scipy.org/doc/scipy/reference/ scipy.constants : Constantes physiques et mathématiques ; scipy.fftpack : Transformée de Fourier Discrète ; scipy.integrate : Intégration et équations différentielles ; scipy.interpolate : Interpolation ; scipy.linalg : Algèbre linéaire ; scipy.optimize : Optimisation et recherche de racines ; scipy.signal : Traitement du signal ; scipy.sparse : Matrices creuses ; scipy.stats : Fonctions statistiques ; etc. ... Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 110 / 174 VIII. SCIPY Fonctions spéciales : scipy.special from scipy import special Ce paquet de SciPy contient par exemple : Les fonctions d’Airy, de Bessel, Gamma, Beta, ... >>> sp.special.gamma(4) # 6.0 (prolongement de la fonction factorielle a # l’ensemble des nombres complexes) Les fonctions et intégrales elliptiques ; La fonction d’erreur et l’intégrale de Fresnel ; Les polynômes de Legendre, de Chebyshev, de Jacobi, d’Hermite, ... Quelques outils de statistique. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 111 / 174 VIII. SCIPY Interpolation : scipy.interpolate from scipy import interpolate Interpolation 1D : interp1d(x,y,kind=’linear’) # avec kind=’zero’, ’linear’, ’quadratic’, ’cubic’, # ’nearest’, ’slinear’ (’linear’ par defaut). Trouver le polynôme passant au plus près d’un ensemble de points : BarycentricInterpolator, KroghInterpolator, PiecewisePolynomial (si l’on a également les dérivées) ; Interpolation 2D : interp2d, griddata ; Interpolation par splines. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 112 / 174 VIII. SCIPY Un exemple import pylab as pl from scipy.interpolate import interp1d x # y # = 5 = x f0 = f1 = f2 = f3 = f4 = xnew ynew sp.linspace(-1, 1, num=5) points regulierement espaces entre -1 et 1. (x-1.)*(x-0.5)*(x+0.5) et y sont des tableaux numpy interp1d(x,y, kind=’zero’) interp1d(x,y, kind=’linear’) interp1d(x,y, kind=’quadratic’) interp1d(x,y, kind=’cubic’) interp1d(x,y, kind=’nearest’) = sp.linspace(-1, 1, num=40) = (xnew-1.)*(xnew-0.5)*(xnew+0.5) pl.plot(x,y,’D’,xnew,f0(xnew),’:’, xnew, f1(xnew),’-.’, xnew,f2(xnew),’-.’,xnew ,f3(xnew),’s--’, xnew,f4(xnew),’--’,xnew, ynew, linewidth=2) pl.legend([’data’,’zero’,’linear’,’quadratic’, ’cubic’,’nearest’,’exact’],loc=’best’) pl.show() Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 113 / 174 VIII. SCIPY Interpolation 1D 0.5 0.0 0.5 data zero linear quadratic cubic nearest exact 1.0 1.51.0 0.5 Szopos-Mehrenberger-Navoret-Navaro (UDS) 0.0 Python 0.5 1.0 28 mars 2015 114 / 174 VIII. SCIPY Un autre exemple from scipy.interpolate import interp2d x,y=sp.mgrid[0:1:20j,0:1:20j] #create the grid 20x20 z=sp.cos(4*sp.pi*x)*sp.sin(4*sp.pi*y) #initialize the field X,Y=sp.mgrid[0:1:100j,0:1:100j] #create the interpolation grid 100x100 T1=interp2d(x,y,z,kind=’linear’) T2=interp2d(x,y,z,kind=’cubic’) T3=interp2d(x,y,z,kind=’quintic’) pl.figure(1) pl.subplot(221) #Plot original data pl.contourf(x,y,z) pl.title(’20x20’) pl.subplot(222) #Plot linear interpolation pl.contourf(X,Y,T1(X[:,0],Y[0,:])) pl.title(’100x100 linear’) pl.subplot(223) #Plot cubic interpolation pl.contourf(X,Y,T2(X[:,0],Y[0,:])) pl.title(’100x100 cubic’) pl.subplot(224) #Plot quintic interpolation pl.contourf(X,Y,T3(X[:,0],Y[0,:])) pl.title(’100x100 quintic’) plt.show() Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 115 / 174 VIII. SCIPY Interpolation 2D 20x20 1.0 1.0 0.8 0.8 0.6 0.6 0.4 0.4 0.2 0.2 0.00.0 1.0 0.2 0.4 0.6 0.8 100x100 cubic 1.0 0.00.0 1.0 0.8 0.8 0.6 0.6 0.4 0.4 0.2 0.2 0.00.0 0.2 0.4 0.6 Szopos-Mehrenberger-Navoret-Navaro (UDS) 0.8 1.0 0.00.0 Python 100x100 linear 0.2 0.4 0.6 0.8 1.0 0.2 0.4 0.6 0.8 1.0 100x100 quintic 28 mars 2015 116 / 174 VIII. SCIPY Intégration : scipy.integrate from scipy import integrate Intégration numérique de fonctions (intégrales définies) : >>> x2=lambda x: x**2 >>> integrate.quad(x2,0.,4.) # (21.333333333333336, 2.368475785867001e-13) # resultat, borne superieure pour l’erreur. Plusieurs options quad : intégrale simple, dblquad : intégrale double, tplquad : intégrale triple etc. Intégration numérique de données discrètes : trapz (dans Numpy), simps : méthode de Simpson composite etc. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 117 / 174 VIII. SCIPY Intégration numérique On souhaite calculer une approximation numérique de l’intégrale Z 5 x ln x dx. 1 (a) Ecrire la méthode composite des trapèzes pour calculer l’intégrale précédente et le code Python correspondant. (b) Comparer le résultat obtenu avec la solution analytique, ainsi qu’avec le résultat fourni par scipy.integrate. Commenter. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 118 / 174 VIII. SCIPY Résolution d’équations différentielles : scipy.odeint import scipy as sp import scipy.integrate as spi Exemple : l’oscillateur de van der Pol y10 (t) = y2 (t) y20 (t) = 1000 1 − y12 (t) y2 (t) − y1 (t). def vdp1000(y,t): dy=sp.zeros(2) dy[0]=y[1] dy[1]=1000.*(1.-y[0]**2)*y[1]-y[0] return dy t0=0 tf=3000 N=300000 dt=(tf-t0)/N tgrid=sp.linspace(t0,tf,num=N) y=spi.odeint(vdp1000,[2.,0.],tgrid) import pylab as plt plt.plot(tgrid,y[:,0]) plt.show() Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 119 / 174 VIII. SCIPY Résolution d’équations différentielles Question 1 : Que fait l’exemple précédent ? Compléter le script afin d’afficher le portrait de phase correspondant. Question 2 : Dans le cours précédent, vous avez résolu l’équation différentielle suivante ( u 0 (t) = u(t) ∀ t ∈ [0, 5] (2) u(0) = 1. par les schémas d’Euler implicite et explicite. Comparer les résultats avec la méthode fournie par scipy.integrate. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 120 / 174 VIII. SCIPY Optimisation : scipy .optimize from scipy import optimize Résolution de problèmes d’optimisation et optimisation sous contrainte en utilisation des algorithmes “standard”. Plusieurs options : leastsq : moindres carrés, minimize : minimisation avec ou sans contraintes, algorithme de Broyden-Fletcher-Goldfarb-Shanno (BFGS) etc. Résolution de F (X ) = 0 : import scipy.optimize as spo def f(x): out = [x[0]*sp.cos(x[1]) - 4 ] out.append ( x [ 1 ] * x [ 0 ] - x [ 1 ] - 5 ) return out x0 = spo.fsolve(f,[1,1]) print x0 , f (x0) Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 121 / 174 IX. SCIPYII Les bibliothèques de Scipy http://docs.scipy.org/doc/scipy/reference/ scipy.constants : Constantes physiques et mathématiques ; scipy.fftpack : Transformée de Fourier Discrète ; scipy.integrate : Intégration et équations différentielles ; scipy.interpolate : Interpolation ; scipy.linalg : Algèbre linéaire ; scipy.optimize : Optimisation et recherche de racines ; scipy.signal : Traitement du signal ; scipy.sparse : Matrices creuses ; scipy.stats : Fonctions statistiques ; etc. ... Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 122 / 174 IX. SCIPYII Algèbre linéaire : scipy.linalg La bibliothèque scipy.linalg Contenu : des outils d’algèbre linéaire (matrices pleines ou bandes). Remarque : parties en commun avec Numpy. Algèbre linéaire de base : norm, inv , solve, det, lstsq, pinv ,matrix_power, dans Numpy ; en plus dans SciPy : résolution de systèmes linéaires à matrices bandes + une autre méthode de calcul pour la pseudo-inverse, utilisant la décomposition svd (au lieu de lstsq). Valeurs propres : dans Numpy , eig (H), eigvals(H) (H matrice hermitienne) ; dans SciPy : en plus les mêmes méthodes pour des matrices bandes. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 123 / 174 IX. SCIPYII Algèbre linéaire : scipy.linalg Décompositions : les méthodes qr, svd, cholesky communes avec Numpy ; les méthodes lu, lu_solve, orth, schur, hessenberg (plus quelques variantes) ajoutées dans SciPy . Code Listing 27 – Decompostion de Cholesky A = LLt , L triangulaire inf. np.linalg.cholesky([[1,2], [1,9]]) #array([[ 1. , 0. ], # [ 1. , 2.82842712]]) sp.linalg.cholesky([[1,2], [1,9]]) #array([[ 1. , 2. ], # [ 0. , 2.23606798]]) sp.linalg.cholesky([[1,2], [1,9]], lower=True) #array([[ 1. , 0. ], # [ 1. , 2.82842712]]) Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 124 / 174 IX. SCIPYII Fonctions de matrices : expm, sinm, sinhm etc..., calcul de la matrice signe signm, de la racine carrée d’une matrice sqrtm. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 125 / 174 IX. SCIPYII Algèbre linéaire : scipy.linalg Décomposition LU, deux possibilités : Version écrite pour Scipy : P,L,U=sp.linalg.lu(A) Version LAPACK (getrf) : LU,Piv=sp.linalg.lu_factor(A) Question : Comparer ces deux méthodes pour la matrice bande suivante : 1. 3. 0. 0. 0. 2. 1. −4. 0. 0. A = 6. 1. 2. −3. 0. . 0. 1. 4. −2. −3 0. 0. 6. −3. 2. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 126 / 174 IX. SCIPYII Algèbre linéaire : Ax = b Exemple pour A matrice précédente et b = [1, 1, 1, 1, 1]t : b=sp.ones(5) print "x=", sp.linalg.lu_solve((LU,Piv),b) # LAPACK (getrs) print "x=", sp.linalg.solve(A,b,sym_pos=False) # LAPACK (gesv ou posv si matrice symetrique) Exemple pour une matrice bande et même b : A=sp.array([ [0.,3.,-4.,-3.,-3.], [1.,1.,2.,-2.,2.], [2.,1.,4.,-3.,0.], [6.,1.,6.,0.,0.] ]) print "x=", sp.linalg.solve_banded((2,1),A,b) # LAPACK (gbsv) Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 127 / 174 IX. SCIPYII Matrices spéciales SciPy et NumPy mettent à disposition plusieurs fonctions pour créer des matrices souvent utilisées dans les calculs. Matrice de Vandermonde (matrice avec une progression géométrique dans chaque colonne) : np.vander([1, 2, 3, 5],3) # N=3, 1ere colonne x^(N-1), 2nde colonne x^(N-2) ... array([[ 1, 1, 1], [ 4, 2, 1], [ 9, 3, 1], [25, 5, 1]]) Matrice circulante (on passe d’une colonne à l’autre par permutation circulaire scipy.linalg import circulant circulant([1, 2, 3 ,4]) array([[1 4 3 2] [2 1 4 3] [3 2 1 4] [4 3 2 1]]) Matrices par blocs diagonales, triangulaires, de Hilbert, de Toeplitz etc. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 128 / 174 IX. SCIPYII Matrices creuses : scipy.sparse import scipy.sparse as spsp http: //docs.scipy.org/doc/scipy/reference/sparse.html Le stockage des matrices creuses peut être effectué aux formats suivants : csc_matrix : Compressed Sparse Column format ; csr_matrix : Compressed Sparse Row format ; bsr_matrix : Block Sparse Row format ; lil_matrix : List of Lists format ; dok_matrix : Dictionary of Keys format ; coo_matrix : COOrdinate format ; dia_matrix : DIAgonal format. Python Szopos-Mehrenberger-Navoret-Navaro (UDS) 28 mars 2015 129 / 174 IX. SCIPYII Stockage CSC des matrices creuses Exemple : la matrice A donnée par : 1 0 4 A = 0 0 5 . 2 3 6 row = sp.array([0,2,2,0,1,2]) col = sp.array([0,0,1,2,2,2]) data = sp.array([1,2,3,4,5,6]) Mcsc1 = spsp.csc_matrix((data,(row,col)),shape=(3,3)) print Mcsc1.todense() Question : Comment la matrice A est-elle stockée dans l’exemple suivant ? indptr = sp.array([0,2,3,6]) indices = sp.array([0,2,2,0,1,2]) data = sp.array([1,2,3,4,5,6]) Mcsc2=spsp.csc_matrix((data,indices,indptr),shape=(3,3)) print Mcsc2.todense() Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 130 / 174 IX. SCIPYII Stockage CSC des matrices creuses Avantages : Opérations arithmétiques efficaces : csc + csc, csc ∗ csc, ... "Slicing" efficace selon les colonnes ; Produit matrice vecteur efficace. Inconvénients : "Slicing" selon les lignes moins efficaces qu’avec une matrice de type csr ; Conversion coûteuse à d’autres formats de matrices creuses (par rapport aux formats lil et dok). Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 131 / 174 IX. SCIPYII Stockage CSR des matrices creuses Exemple : la matrice A donnée par : 1 0 4 A = 0 0 5 . 2 3 6 row = sp.array([0,0,1,2,2,2]) col = sp.array([0,2,2,0,1,2]) data = sp.array([1,2,3,4,5,6]) Mcsr1 = spsp.csr_matrix((data,(row,col)),shape=(3,3)) print Mcsr1.todense() Question : Comment la matrice A est-elle stockée dans l’exemple suivant ? indptr = sp.array([0 ,2 ,3 ,6]) indices = sp.array([0 ,2 ,2 ,0 ,1 ,2]) data = sp.array([1,2,3,4,5,6]) Mcsr2=spsp.csr_matrix((data,indices,indptr),shape=(3,3)) print Mcsr2.todense() Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 132 / 174 IX. SCIPYII Stockage CSR des matrices creuses Avantages : Opérations arithmétiques efficaces : csr + csr, csr ∗ csr, ... "Slicing" efficace selon les lignes ; Produit matrice vecteur efficace. Inconvénients : "Slicing" selon les colonnes moins efficaces qu’avec une matrice de type csc ; Conversion coûteuse à d’autres formats de matrices creuses (par rapport aux formats lil et dok). Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 133 / 174 IX. SCIPYII Les formats dédiés a l’assemblage lil_matrix : format agréable pour l’assemblage, mais il faut convertir dans un autre format avant de calculer. dok_matrix : format idéal pour un assemblage incrémental et la conversion vers un autre format est efficace. coo_matrix : conversion tres rapide vers les formats csc/csr. Remarque : Ce ne sont pas des formats “adaptés” au calcul (les opérations arithmétiques peuvent être lentes), il est conseillé de les convertir après. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 134 / 174 IX. SCIPYII Matrices creuses : scipy.sparse.linalg http://docs.scipy.org/doc/scipy/reference/sparse. linalg.html speigen, speigen_symmetric, lobpcg : calcul de valeurs et vecteurs propres (ARPACK). svd : décomposition en valeurs singulières (ARPACK). Résolution de Ax = b : méthodes directes (UMFPACK si présent ou SUPERLU) ou itératives ; les formats csc/csr sont conseillés. Algorithmes de minimisation : lsqr. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 135 / 174 IX. SCIPYII Matrices creuses : Factorisation LU import import import import scipy as sp scipy.sparse as spsp scipy.linalg as spl scipy.sparse.linalg as spspl N=50 un=sp.ones(N) w=sp.rand(N+1) A=spsp.spdiags([w[1:],-2*un,w[:-1]],[-1,0,1],N,N) A=A.tocsc() b = un op=spspl.splu(A) print op x=op.solve(b) print spl.norm(A*x-b) Question : Commenter le script précédent. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 136 / 174 IX. SCIPYII Matrices creuses : Gradient conjugué Exemple pour résoudre le même système : global k k=0 def f(xk): global k print "iteration ",k," residu=",spl.norm(A*xk-b) k=k+1 x,info=spspl.cg(A,b,x0=sp.zeros(N),tol=1.0e-12, maxiter=N,M=None,callback=f) A l’exécution : iteration iteration ... iteration iteration 0 residu= 2.71695646088 1 residu= 1.23113341645 25 residu= 1.34905427044e-11 26 residu= 5.41798161014e-12 Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 137 / 174 IX. SCIPYII Matrices creuses : Gradient conjugué préconditionné Exemple pour résoudre le même système : pc=spspl.spilu(A,drop_tol=0.1) xp=pc.solve(b) spl.norm(A*xp-b) def mv(v): return pc.solve(v) lo = spspl.LinearOperator((N,N),matvec=mv) k=0 x,info=spspl.cg(A,b,x0=sp.zeros(N),tol=1.e-12, maxiter=N,M=lo,callback=f) A l’exécution : iteration iteration ... iteration iteration 0 1 residu= 0.327201220193 residu= 0.00973829257822 7 8 residu= 7.15477674159e-11 residu= 3.67681615701e-12 Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 138 / 174 X.1 WRAPPER Interfaçage : introduction Python : www.python.org Avantages : Langage simple, interprété avec une syntaxe claire. Facile à programmer et la gestion de la mémoire est automatique. Open source, gratuit et portable. Dispose de nombreux modules pour le calcul scientifique. Inconvénient principal : Trop lent pour les taches numériques intensives. Solution : Interfacer avec C / C++ ou Fortran. Taches de pré et post-traitement en Python. Parties numériques intensives en Fortran ou C / C++. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 139 / 174 X.1 WRAPPER f2py : introduction f2py “Fortran to Python interface generator” : module permettant de convertir un code Fortran en modules et fonctions Python. Remarque : f2py nécessite l’installation de Numpy. Trois méthodes pour créer une interface sont possibles : Interfacer des subroutines simples sans écrire de code supplémentaire. Ajouter des directives pour f2py dans le fichier source Fortran pour un interfaçage plus complexe. Écrire un fichier d’interface décrivant les subroutines et les données à interfacer. f2py génère automatiquement un fichier d’interface simple qu’on peut ensuite éditer et modifier. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 140 / 174 X.1 WRAPPER Exemple de subroutine simple Calcul de la norme : norme.f90 (Fortran 90/95 format libre). subroutine norme (a, b, c) real(8), intent(in) :: a, b real(8), intent(out) :: c c= sqrt (a*a+b*b) end subroutine norme Génération de l’interface Python avec f2py : f2py -c norme.f90 -m vect --f90flags=-O3 --fcompiler=gnu95 Appel depuis un shell Python : >>> import vect >>> vect.norme(3,4) # 5.0 Documentation générée automatiquement par f2py : >>> print vect.norme.__doc__ norme - Function signature : c = norme(a,b) Required arguments : a : input float b : input float Return objects : c : float Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 141 / 174 X.1 WRAPPER Ajout de directive f2py dans le source Fortran Remarque : Les ajouts dans le code source Fortran permettent de préciser le rôle et la définition des variables d’entrés-sorties. Sont utilisés : Les attributs du F90 : intent(in), dimension(2,3). Les attributs spécifiques : !f2py intent(hide), depend(a). subroutine norme_array(a,c,n) integer :: n real(8),dimension(n),intent(in) :: a !f2py optional , depend(a) :: n=len(a) real(8),intent(out) :: c real(8) :: sommec integer :: i sommec = 0 do i=1,n sommec=sommec+a(i)*a(i) end do c=sqrt (sommec) end subroutine norme_array Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 142 / 174 X.1 WRAPPER Liste Python ou tableau numpy en argument >>> from vect import * >>> a=[2,3,4] #Une liste Python >>> norme_array(a) # 5.3851648071345037 >>> from numpy import * >>> a=arange(2,5) # Un tableau numpy >>> norme_array(a) # 5.3851648071345037 Documentation générée automatiquement par f2py : >>> print norme_array.__doc__ norme_array - Function signature : c = norme(a,[n]) Required arguments : a : input rank-1 array(’d’) with bounds (n) Optional arguments : n := len(a) input int Return objects : c : float Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 143 / 174 X.1 WRAPPER Utilisation du module distutils setup.py from numpy.distutils.core import setup, Extension ext = Extension(name=’vect’, sources=["norme.f90"], extra_compile_args=[’-O3’]) setup(name=’vect’, version=’1.0’, description=’norm functions’, author=’Laurent’, author_email=’[email protected]’, url=’’, ext_modules=[ext]) #python setup.py build_ext --inplace Ajouter dans le module vect la fonction norme_array Ecrire un fichier test_vect qui teste les différentes fonctions du Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 144 / 174 X.1 WRAPPER Utilisation d’un fichier signature On peut générer automatiquement un fichier signature f2py vecteur.f90 -h vecteur.pyf Contenu de vecteur.pyf ! -*- f90 -*! Note: the context of this file is case sensitive. subroutine norme_array(a,c,n) ! in norme.f90 real(kind=8) dimension(n),intent(in) :: a real(kind=8) intent(out) :: c integer optional,check(len(a)>=n), depend(a) :: n=len(a) end subroutine norme_array ! This file was auto-generated with f2py (version:2). ! See http://cens.ioc.ee/projects/f2py2e/ Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 145 / 174 X.1 WRAPPER Interfaçage C / C++ : motivation Conjecture de Syracuse : http://fr.wikipedia.org/wiki/Conjecture_de_Syracuse 1 Choisir u0 . 2 Si uk pair, uk +1 → 3 Si uk impair, uk +1 → 3uk + 1. uk 2 ; La conjecture affirme que, pour tout u0 > 0 , il existe un indice k tel que uk = 1 ; le plus petit indice avec cette propriété est appelé temps de vol. Les programmes suivants calculent les temps de vol f (u0 ) pour 1 ≤ u0 ≤ N, N fixé. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 146 / 174 X.1 WRAPPER Programme C syracuse.c #include <sys/time.h> #include <stdlib.h> #include <stdio.h> long syracuse(long n) { long compteur = 0L ; while (n > 1){ if ((n&1)==0) n /= 2; else n = 3*n+1; compteur ++; } return compteur ; } int main() { const long N = 1000000; double t1, t2; long i , *flights ; flights = (long*)malloc(N*sizeof(long)); for (i = 0; i <N; i++) flights[i] = syracuse(i+1); return EXIT_SUCCESS; } Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 147 / 174 X.1 WRAPPER Programme Python def syrac_python(n) : compteur=0 x=n while (x!=1) : if ((x&1)==0) : x /= 2 else: x=3*x+1 compteur += 1 return compteur if __name__ == "__main__": N = 1000000 flights = [syrac_python(i) for i in range(1,N+1)] $ gcc -O3 syrac.c $ time ./a.out real 0m0.313s user 0m0.310s sys 0m0.002s Szopos-Mehrenberger-Navoret-Navaro (UDS) $ time python syrac_python.py real 0m34.082s user 0m32.709s sys 0m0.130s # + simple, 100 x plus lent ... Python 28 mars 2015 148 / 174 X.1 WRAPPER Interfaçage avec C / C++ : C-types ctypes Bibliothèque Python permettant d’accéder aux fonctions et symboles d’une bibliothèque externe (en particulier, codée en C). https://docs.python.org/2/library/ctypes.html Remarques : Plus rapide que le Python pur. Permet d’appeler des fonctions définies dans des fichiers DLL sous Windows. La syntaxe diffère suivant les systèmes d’exploitation. Syntaxe différente du reste du code Python. il faut apprendre un nouveau langage. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 149 / 174 X.1 WRAPPER Ctypes : exemple C long syracuse(long n) { long compteur = 0L ; while (n > 1) { if ((n&1)==0) n /= 2; else n = 3*n+1; compteur++; } return compteur ; } /* gcc -fPIC -shared -O3 \ -o syrac.so syrac.c */ Szopos-Mehrenberger-Navoret-Navaro (UDS) Python import time from ctypes import * syrac_ctypes= CDLL("./syrac_ctypes.so") N=1000000 t0 = time.time() flights = [syrac_ctypes.syracuse(i) for i in range(1,N+1)] t1 = time.time() print "Ctypes elapsed time %s"%(t1-t0) # elapsed time 0.891623973846 Python 28 mars 2015 150 / 174 X.1 WRAPPER Interface d’une fonction C avec f2py f2py Module qui permet aussi d’interfaçer le C et le Python. C long syracuse(long n) { long compteur = 0L ; while (n > 1){ if ((n&1)==0) n /= 2; else n = 3*n+1; compteur ++; } return compteur ; } Szopos-Mehrenberger-Navoret-Navaro (UDS) syrac.pyf python module syrac_c interface subroutine syracuse(n,f) intent(c) :: syracuse intent(c) integer(8), intent(in) :: n integer(8), intent(out) :: f end subroutine syracuse end python module syrac_c Python 28 mars 2015 151 / 174 X.1 WRAPPER Le programme Python test_syrac.py from numpy import * import time N=10000000 import syrac_f2py t0 = time.time() flights = [syrac_f2py.syracuse(i) for i in range(1, N+1)] t1 = time.time() print "f2py-C elapsed time %s"%(t1-t0) Compilation et exécution : $ f2py -c syrac.c -m syrac_f2py syrac_f2py.pyf --opt=-O3 $ python test_syrac.py # f2py-C elapsed time 8.69262194633 Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 152 / 174 X.1 WRAPPER Utilisation du module distutils setup.py from numpy.distutils.core import setup, Extension ext2 = Extension(name=’syrac_f2py’, sources=[’syrac.pyf’, "syrac.c"] setup(name=’syrac_f2py’, version=’1.0’, description=’syrac functions’, author=’Laurent’, author_email=’[email protected]’, url=’’, ext_modules=[ext2]) #python setup.py build_ext --inplace Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 153 / 174 X.1 WRAPPER Interfaçage C / C++ et Python : autre possibilités Swig “Simplified Wrapper and Interface Generator“ : logiciel permettant de connecter le C/C++ avec des langages de scripts tels que : Tcl, Perl, Python, Ruby, PHP etc. ou d’autres langages de programmation comme Java. http://www.swig.org/ Cython Langage hybride C/Python qui permet d’améliorer la création de modules compilés plus performants (non abordé ici). Szopos-Mehrenberger-Navoret-Navaro (UDS) http://cython.org/ Python 28 mars 2015 154 / 174 X.1 WRAPPER Swig : exemple Fichier d’interface swig syrac.i de la fonction dans syrac.c %module syracuseC %{ extern long syracuse(long n); %} extern long syracuse(long n); Création d’un fichier syrac_wrap.c : swig -python syrac.i Compilation de la librairie dynamique : $gcc ‘python2.6-config --cflags‘ -fPIC \ -shared -O3 -o _syrac_swig.so syrac_wrap.c syrac.c Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 155 / 174 X.1 WRAPPER Performances de swig Python from numpy import * import time import syracuseC syracuse = syracuseC.syracuse N=1000000 flights = empty((N),int) t1 = time.time() flights[:] = map(syracuse, xrange(1,N+1)) t2 = time.time() print "elapsed time %s"%(t2-t1) $ python test_syrac.py # elapsed time 0.870338201523 Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 156 / 174 X.1 WRAPPER Utilisation du module distutils setup.py from numpy.distutils.core import setup, Extension ext3 = Extension(name=’_syrac_swig’, sources=[’syrac_wrap.c’, ’syrac.c’], extra_compile_args=[’-O3’]) setup(name=’syrac_swig’, version=’1.0’, author="Laurent", description="swig syracuse", ext_modules=[ext3], py_modules=["syrac_swig"]) #python setup.py build_ext --inplace Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 157 / 174 XI. SCRIPTS Hello world program Code dans un fichier #fichier hw.py import sys,math r = float(sys.argv[1]) s = math.sin(r) print("Hello world! sin("+str(r)+")="+str(s)) Execution python hw.py 1.4 Résultat Hello world! sin(1.4)=0.9854497299884601 Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 158 / 174 XI. SCRIPTS Exercice Tâche Ecrire un script qui renvoie une note aléatoire avec un chiffre après la virgule Code #Execution: python note_aleatoire.py #Renvoie une note aleatoire #avec un chiffre apres la virgule import random as r note = r.uniform(0,20) print("%.1f" % note) Résultat 4.3 Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 159 / 174 XI. SCRIPTS Calculatrice >>> 23//3 #division entiere 7 >>> 23./3. #division reelle 7.666666666666667 >>> 23%3 #reste 2 >>> 3.11+2.08 #addition 5.1899999999999995 >>> _-5.19 #_ est le dernier element -8.881784197001252e-16 >>> [2**k for k in xrange(10)] [1, 2, 4, 8, 16, 32, 64, 128, 256, 512] Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 160 / 174 XI. SCRIPTS Variables Les variables permettent de stocker des données. Le nom des variables ne peut pas commencer par un chiffre, ni par certains mots-clés >>> import keyword >>> a=keyword.kwlist >>> a[0] #premier mot-cle ’False’ >>> a[len(a)-1] #dernier mot-cle ’yield’ >>> a=10;a+=1;a >>> 11 >>> a=1;b=2;[a,b]=[b,a];a,b #echange >>>(2, 1) Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 161 / 174 XI. SCRIPTS Types et comparaisons Les opérateurs de comparaisons sont is,is not,==,!=,<,>,<=,>=. >>> ({3,3.} == {3}) and ({3,3.} is not {3}) True Les types sont nombreux >>> a=[3,3.,True,[3,True],{3,3.},(3,3)] >>> [type(i) for i in a[0:3]] [<class ’int’>, <class ’float’>, <class ’bool’>] >>> [type(i) for i in a[3:6]] [<class ’list’>, <class ’set’>,<class ’tuple’>] Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 162 / 174 XI. SCRIPTS Script avec boucles, fonctions et fichiers Indentation obligatoire #python fdata.py fin.dat fout.dat import sys, math try: infilename = sys.argv[1] outfilename = sys.argv[2] except: print("Usage:",sys.argv[0], "infile outfile") sys.exit() infile = open(infilename, ’r’) outfile = open(outfilename, ’w’) Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 163 / 174 XI. SCRIPTS Script avec boucles, fonctions et fichiers def myfunc(y): if y>=0.: return y**5*math.exp(-y) else: return 0. #Lit infile ligne par ligne #puis ecrit les valeurs transformees for line in infile: pair = line.split() x = float(pair[0]) y = float(pair[1]) fy = myfunc(y) outfile.write(’%g %12.5e\n’ % (x,fy)) infile.close() outfile.close() Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 164 / 174 XI. SCRIPTS On aura stocké dans ’fin.dat’ 0.0 0.5 1.0 2.5 3.2 4.3 8.3333 -0.25 On obtient dans ’fout.dat’ 0 1.36775e+01 0.5 1.99469e+01 1 9.66004e+00 2.5 0.00000e+00 Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 165 / 174 XII. CLASSES Programmation Objet avec Python En programmation procédurale il y a une séparation stricte entre code et données. En programmation objet les opérations sont des propriétés des données. Une classe python est composée d’attributs et de méthodes. Instance : Création d’un objet, appel de la méthode nommée __init__. Héritage : Un objet qui dérive d’un autre objet possède les mêmes attributs et les mêmes méthodes. Quand une méthode est appelée, une référence vers l’objet principal est passé en tant que premier argument. Par convention ce premier argument est toujours : self. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 166 / 174 XII. CLASSES Une classe Python Définition class MaClasse: def __init__(self, i, j): self.i = i; self.j = j def write(self): print MaClasse: i=self.i, j=self.j L’argument self est obligatoire pour la définition. Utilisation >>> obj1 = MaClasse(6,9) >>> print obj1.i, obj1.j 6 9 >>> obj1.write() MaClasse: i= 6 j= 9 Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 167 / 174 XII. CLASSES Héritage Définition de la sous classe class MaSousClasse(MaClasse): def __init__(self, i, j, k): MaClasse.__init__(self,i,j) self.k = k def write(self): print ’MaSousClasse: i=’,self.i,’j=’,self.j, \ ’k=’, self.k Utilisation >>> obj1 = MaClasse(6,9) >>> obj1.write() MaClasse: i= 6 j= 9 >>> obj2 = MaSousClasse(6,9,12) >>> obj2.write() MaSousClasse: i = 6 j= 9 k = 12 Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 168 / 174 XII. CLASSES Une classe qui s’utilise comme une fonction Définition class F: def __init__(self, a=1, b=1, c=1): self.a=a; self.b=b; self.c=c def __call__(self, x, y): return self.a+self.b*x+self.c*y*y Appel >>> f = F(a=2,b=4) >>> v = f(2,1) + f(1.2,0) >>> print v 17.8 Pratique lorsque l’on souhaite séparer les paramètres d’une fonction (a,b,c) des variables indépendantes (x,y). Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 169 / 174 XII. CLASSES Surcharge des opérateurs Une classe vecteur class Vecteur: dimension = 2 def __init__(self, x=0, y=0): self.x=x self.y=y def __eq__(self, vB): return (self.x==vB.x) and (self.y==vB.y) def __add__(self, vB): return Vecteur(self.x+vB.x,self.y+vB.y) def __sub__(self, vB): return Vecteur(self.x-vB.x,self.y-vB.y) def __mul__(self, c): if isinstance(c,Vecteur): return self.x*c.x+self.y*c.y else: return Vecteur(c*self.x,c*self.y) Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 170 / 174 XII. CLASSES Surcharge des opérateurs (suite) Manipulation >>> U = Vecteur(); U.x,U.y = 0,1 >>> V = Vecteur(); V.x,V.y = 1,0 >>> print U, V <__main__.Vecteur instance at 0x2b8ee0> <__main__.Vecteur instance at 0x2b >>> W = U+V >>> print W <__main__.Vecteur instance at 0x2b8f80> >>> Vecteur.dimension=3 >>> print 'Dimension de U=' + str(U.dimension) Dimension de U=3 >>> print 'Dimension de V=' + str(V.dimension) Dimension de V=3 >>> U.dimension=4 >>> print 'Dimension de V=' + str(V.dimension) Dimension de V=3 >>> Vecteur.dimension=5 >>> print 'Dimension de U=' + str(U.dimension) Dimension de U=4 >>> print 'Dimension de V=' + str(V.dimension) Dimension de V=5 Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 171 / 174 XII. CLASSES Créer une classe Python nommée Vecteur, que l’on utilisera pour décrire un vecteur plan. Ces paramètres sont x et y . Implémenter l’addition __add__, la soustraction __sub__, la multiplication __mul__ par un vecteur ou un scalaire et la représentation __repr__. Ne pas oublier le constructeur __init__. Attention votre multiplication n’est pas commutative par dÈfaut, il faut implémenter la méthode __rmul__. Créer une classe nommée Particule, dont les paramètres sont les vecteurs position et vitesse. Implémenter une méthode "deplace(dt)" pour calculer la nouvelle position d’une particule après un pas de temps dt. Créer ensuite une classe Ion dérivant de Particule avec un paramètre supplémentaire "masse". Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 172 / 174 XII. CLASSES Classes abstraites Les classe abstraites ne peuvent pas être instanciées Ne peuvent exister que si elles ont des sous-classes On définit un concept commun à plusieurs objets (interface) ´ Cette interface doit être la même ; permet d’Èviter de faire des tests sur tous les types possibles. from abc import ABCMeta, abstractmethod class BaseClass(object): __metaclass__=ABCMeta @abstractmethod def printHello(self): pass class GermanClass(BaseClass): def printHello(self): print("Hallo") class FrenchClass(BaseClass): def printHello(self): print("Bonjour") x = GermanClass() x.printHello() y = FrenchClass() y.printHello() Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 173 / 174 XII. CLASSES Ecrire une classe abstraite pour interpoler une fonction de [a, b] dans R. Szopos-Mehrenberger-Navoret-Navaro (UDS) Python 28 mars 2015 174 / 174