Programmation sous Python L3 Sciences de la Terre Julia Pfeffer, Marine Lasbleis Monitrices et ATER à l’Ecole Nationale Supérieure de Lyon Automne 2012 Contact: [email protected] Pourquoi Python? Clarté du langage et élégance de la syntaxe → facilité de compréhension et de relecture des programmes C'est un langage orienté objet, actuellement le paradigme de programmation le plus répandu C'est un langage interprété → mise en œuvre est très simple. L'interpréteur, le logiciel qui permet à vos programmes de s'exécuter, est un logiciel libre, gratuit, et multiplateforme! Langage moderne et développement très rapide Il est assez plaisant car de « haut niveau ». Pour résumer … Ressources utiles Official Python website (www.python. org) Official SciPy website (www.scipy.org) Official Matplotlib website (www.matplotlib.org) Online lectures for scientific computing (www.scipy-lectures.github.com) Online lectures for figures publication (www.loria.fr/~rougier/teaching/matplotlib) Let’s get started … Installation sur votre ordinateur ◦ Sous Linux, l’interpréteur python est très souvent installé par défaut … pour vérifier python –V ◦ Sous Windows, l’installation devrait être très facile via le site officiel de Python Premières instructions avec Python Accéder à l’interpréteur: python vs ipython Premières instructions avec Python Ce que vous avez appris sous bash marche toujours! ◦ Se repérer dans l’arborescence: ls et pwd ◦ Complétion automatique: ◦ Historique: ◦ Quelle est la dernière commande que vous avez tapée commençant par l? Quelques nouveautés ◦ Les commentaires sont précédés de # ◦ Aide: help () ou ? ◦ Que fait la fonction pow? Premières instruction avec Python C’est bon? Essayez les commandes: ◦ 2+3 ◦ 5.95 * 6.55957 ◦ print « Hello! » Les opérateurs Python Python peut être utilisé comme une calculatrice ; Pour effectuer une addition, on l'écrit naturellement, en utilisant l'opérateur + ; Les nombres décimaux sont notés à l'anglaise, en utilisant le point plutôt que notre virgule ; La multiplication est effectuée par l'opérateur * (l'étoile, ou astérisque) ; On peut insérer ou non à loisir des espaces entre les valeurs et l'opérateur. Les chaînes de caractères, sont délimitées par le caractère guillemet " (ou double-quote) Les opérateurs Python Commande Nom Exemple Résultat + Addition 4+5 9 - Soustraction 8-5 3 * Multiplication 4*5 20 / Division 19/3 6 % Reste 19%3 1 ** Exposant 2**4 16 L’ordre de ses opérations est le même sous Python qu’en maths: 1. Parenthèses () 2. Exposants ** 3. Multiplication *, division /, et reste % 4. Addition + et soustraction - Ecrire un script Les programmes sont de simples documents texte! Ils se terminent par .py Exemple: ◦ Ouvrez IDLE > file > New Window #A simple program. print "Mary had a little lamb," print "it's fleece was white as snow;" print "and everywhere that Mary went", print "her lamb was sure to go” ◦ Save as Mary.py ◦ Run > Run module ou F5 Les variables Exemple de code – Les variables #variables demonstrated print "This program is a demo of variables" v = 1 print "The value of v is now", v v = v + 1 print "v now equals itself plus one, making it worth", v v = 51 print "v can store any numerical value, to be used elsewhere." print "for example, in a sentence. v is now worth", v print "v times 5 equals", v*5 print "but v still only remains", v print "to make v five times bigger, you would have to type v = v * 5", v = v * 5 print "there you go, now v equals", v, "and not", v / 5 Les variables Une variable possède un type, qui précise la nature de l'information qu'elle peut contenir. Testez: >>> x = 1 >>> print type(x) type() est une fonction. Le rôle de cette fonction est de donner le type du paramètre entre parenthèses. Testez: >>> x = 3.14 >>> print type(x) Les chaînes de caractère Les variables peuvent aussi contenir des chaînes de caractères placées entre « » La chaîne est considérée comme un tableau. L'utilisation des crochets [ ] nous permet d'indiquer l’élément à sélectionner. Le nombre donné entre les crochets est appelé l'indice de l'élément voulu. Par convention, les indices commencent à 0. Il est possible de donner des indices négatifs, la numérotation commence alors par la fin. Les chaînes de caractères s’assemblent avec des virgules , ou avec le signe + Les chaînes de caractère Exercice Soit s la chaîne «Bonjour monde!» - Faites un script qui permet d'insérer la chaîne «tous le» dans s entre «bonjour» et «monde» - Afficher s - Corriger le «tous» en «tout» et réafficher la chaîne Les chaînes de caractère Exercice Soit s la chaîne «Bonjour monde!» - Faites un script qui permet d'insérer la chaîne «tous le» dans s entre «bonjour» et «monde» - Afficher s - Corriger le «tous» en «tout» et réafficher la chaîne s="Bonjour monde!" s1=s[0:7]; s2=" tous le "; s3=s[8:14] S=s1+s2+s3 print S S=S[0:11]+"t"+S[12:22] print S Les boucles Les instructions contenues par exemple dans une boucle constituent un bloc d'instructions En python un bloc est défini par une indentation similaire pour une suite d'instructions. # cheerleading program word = raw_input("Who do you go for? ") Fin de la boucle for letter in word: call = "Gimme a " + letter + "!" print call print letter + "!" print "What does that spell?" print word + "!" Les fonctions Les fonctions sont des mini-programmes qui évitent de répéter une séquence d'instructions. function_name(parameters) >> Testez les fonctions range () et len () Vous pouvez définir votre propre fonction à l’aide du mot clef def: >>def function_name(parameter_1,parameter_2): {this is the code in the function} {more code} {more code} return {value to return to the ma put ":" at the in program} {this code isn't in the function because it isn't indented} #remember to end the line that starts with ‘def’ with ‘:’ Les fonctions L'idée consiste à définir des fonctions qui font ce pour quoi elles ont été créées, mais pas plus. Notre fonction calcule une chaîne de caractères mais ce n'est pas son rôle de l'afficher. Il nous faut donc un moyen pour « récupérer » ce que la fonction aura produit. On dit alors que la fonction va renvoyer un résultat, ce résultat étant la valeur de retour de la fonction. def somme(var1, var2) : resultat = var1 + var2 return resultat ma_variable = somme (2,3) print ma_variable « resultat » est une variable locale Dans le programme principal, la valeur de retour de la fonction est stockée dans «ma_variable» Listes et multiplets (« tupples ») Les listes sont ce qu’elles semblent être des listes de valeurs. Chacune est numérotée en partant de 0. >> cats = ['Tom', 'Snappy', 'Kitty', 'Jessie', 'Chester'] >> print cats[2] Vous pouvez ajouter ou enlever des valeurs à la liste. >> cats.append('Catherine') >> del cats[1] Les multiplets sont comme des listes mais vous ne pouvez pas modifier leur valeur. >> months=('January','February','March','April','May','June',\ 'July','August','September','October','November',' December') Programmer en sciences Installer les packages suivants ◦ Numpy et Scipy: calcul scientifique ◦ Matplotlib: publication de figures Les importer au début de chaque script! >> import numpy as np >> import scipy as sp >> import matplotlib as plt Il est possible de les importer avec cette syntaxe, au risque de générer des instabilités dans le programme! >> from numpy import * >> from scipy import * >> from matplotlib import * Le tableau: l’outil de base du calcul scientifique Manipulation fréquente d’ensembles ordonnés discrets : ◦ temps discrétisé d’une expérience/simulation ◦ signal enregistré par un appareil de mesure ◦ pixels d’une image, ... Le module Numpy permet de: ◦ créer d’un coup ces ensembles de données ◦ réaliser des opérations en “batch” sur les tableaux de données (pas de boucle sur les éléments). Tableau de données = numpy.ndarray La création de tableaux Numpy Un exemple pour commencer: >>> import numpy as np >>> a = np.array([0, 1, 2]) >>> b = np.array([[0., 1.], [2., 3.]]) Essayez de taper a et print a … Quelle différence? La création de tableaux Numpy Dans la pratique on rentre rarement les éléments un par un … ◦ Valeurs espacées régulièrement: arange(début, fin, saut) >>> import numpy as np >>> a = np.arange(10) >>> b = np.arange(1., 9., 2) ◦ On peut obtenir le même résultat en spécifiant le nombre de points: linspace (début, fin, nb de valeurs) >>> c = np.linspace(0, 1, 6) >>> d = np.linspace(0, 1, 5, endpoint=False) La création de tableaux numpy Quelques fonctions utiles pour créer des tableaux: ◦ ◦ ◦ ◦ ones () zeros () eye () dtype () Essayez! Indexage On peut accéder aux éléments des tableaux Numpy (indexer) d’une manière similaire que pour les autres séquences Python (list, tuple) >>> a = np.arange(10) >>> a array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> a[0], a[2], a[-1] (0, 2, 9) Attention ! L’indexage commence à partir de 0, comme pour les autres séquences Python (et comme en C/C++). En Fortran ou Matlab, l’indexage commence à 1. Tableaux multidimensionnels • Pour les tableaux multidimensionnels, l’indice d’un élément est donné par un n-uplet d’entiers >>> a = np.diag(np.arange(5)) >>>a array([[0, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 2, 0, 0], [0, 0, 0, 3, 0], [0, 0, 0, 0, 4]]) >>> a[1,1] >>> a[2,1] = 10 # deuxième ligne, première colonne >>> a >>> a[1] # première ligne Slicing Comme l’indexage, similaire au slicing des autres séquences Python: >>> a = np.arange(10) >>> a[2:9:3] # [début:fin:pas] Attention, le dernier indice n’est pas inclus >>> a[:4] On n’est pas obligé de spécifier à la fois le début (indice 0 par défaut), la fin (dernier indice par défaut) et le pas (1 par défaut): >>> a[1:3]# pas = 1 >>> a[::2]# début = 0, fin = 10 >>> a[3:] # fin=10, pas=1 En résumé … Opérations sur les tableaux x.max() max(x) x.min() min(x) x.std() std(x) x.mean() mean(x) x1=x.copy() x1=copy(x) x-=x.mean() x-=mean(x) #equivalent with x=x-x.mean() #equivalent with x=x-mean(x) First and last 10 entries of an array x = np.random.random(100) x[:10] x[-100:] x[2:5] La représentation graphique des données avec matplotlib Maintenant que nous avons nos premiers tableaux de données, nous allons les visualiser Matplotlib est un package de plot 2-D, on importe ces fonctions de la manière suivante >>> import pylab as py Tracé de courbes 1-D >>> a = np.arange(20) >>> py.plot(a, a**2) >>> py.plot(a, a**2, 'o') # figurés ronds >>> py.show >>> py.clf() # clear figure >>> py.loglog(a, a**2) >>> py.xlabel('x') # un peu petit >>> py.xlabel('x', fontsize=26) # plus gros >>> py.ylabel('y') >>> py.grid() >>> py.axvline(2) >>> py.show () Tracé de courbes 1-D Tableaux 2D >>> # Tableaux 30x30 de nombres aleatoires entre 0 et 1 >>> image = np.random.rand(30,30) >>> py.imshow(image) >>> py.gray() >>> py.hot() >>> py.imshow(image, cmap=cm.gray) >>> py.axis('off') # on enlève les ticks et les labels