Licence Sciences du Vivant | Biologie & Mathématiques | 2011-2012 Apprendre à Programmer En Python (I) mark.h Prise en main et éléments de base du langage Mark Hoebeke [email protected] L1 | Python (I) | p. 1 Plan Apprendre à Programmer en Python (I) ● ● ● Introduction ● «Apprendre à programmer», pourquoi ? ● Pourquoi Python ? ● En savoir plus. Les bases du langage ● Écriture de programmes et exécution. mark.h ● Expressions, constantes et typage. ● Variables et affichage. ● Collections : tuples, listes et dictionnaires. ● Blocs et contrôle de flux. ● Utilisation des fichiers. Exercices L1 | Python (I) | p. 2 Apprendre à Programmer en Python | Introduction «Apprendre à programmer», pourquoi ? ● Programmer, c'est : ● ● ● Écrire une suite d'instructions dans un langage de programmation. Pour : ● Le plaisir (?) ● Résoudre un problème posé. mark.h En : ● ● Décomposant itérativement la tâche à effectuer en sous-tâches plus «maniables». Décrivant chaque tâche de plus bas niveau dans un langage de programmation. L1 | Python (I) | p. 3 Apprendre à Programmer en Python | Introduction « Apprendre à programmer » : pourquoi ? ● Bien Programmer, c'est : ● Ré-utiliser des briques que d'autres ont déjà programmées. ● Écrire des programmes réutilisables : ● – Donner des noms explicites et cohérents aux entités (variables, fonctions, classes). – mark.h à être réutilisé par d'autres (ou par soiDocumenter tout ce qui est destiné même plus tard !). – Tester le plus exhaustivement possible tout code produit. Écrire des programmes efficaces : – Connaître a minima le fonctionnement interne du langage et/ou de la machine pour éviter de : ● ● Gaspiller des cycles CPU. D'occuper inutilement trop de mémoire. L1 | Python (I) | p. 4 Apprendre à Programmer en Python | Introduction Le choix de Python ● Véritable langage à objets : ● ● Langage (semi-)interpreté : ● ● mark.h Abondance de composants dans de nombreux domaines d'application. Existence d'une BAO pour la bioinformatique : ● ● Processus de développement simplifié. Environnement «riche» : ● ● Méthodologie la plus courante pour des développements informatiques. BioPython Langage se prêtant bien à l'apprentissage. L1 | Python (I) | p. 5 Apprendre à Programmer en Python | Introduction En savoir plus ● Le site du langage Python : ● ● Le site de la documentation du langage : ● ● http://www.python.org http://docs.python.org mark.h Apprendre à programmer avec Python (G. Swinnen) ; ● http://inforef.be/swi/python.htm L1 | Python (I) | p. 6 Apprendre à Programmer en Python | Les bases du langage Programmation en mode interactif ● Utilisation de Python en ligne de commande : ● ● Adapté aux expérimentations tenant en quelques (dizaines) de lignes. Lancement de l'interpréteur à l'aide de la commande ; $ python ● Résultat : mark.h Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) [GCC 4.4.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> ● Une invite (prompt) permet la saisie directe d'instructions Python. L1 | Python (I) | p. 7 Apprendre à Programmer en Python | Les bases du langage Écriture de scripts ● Script (Python) : ● ● Fichier texte qui contient une suite d'instructions (Python). Utilisation des scripts : ● Appel direct à l'interpréteur Python à partir de la ligne de commande : $ python monscript.py ● mark.h par le système d'exploitation : Appel «automatique» de l'interpréteur $ ./monscript.py – En présence d'une en-tête normalisée : #!/usr/bin/env python #!/usr/bin/env python # ­*­ coding: utf­8 ­*­ # ­*­ coding: utf­8 ­*­ – Si les droits d'exécution sont correctement positionnés. ­rwxr­xr­x (...) monscript.py L1 | Python (I) | p. 8 Apprendre à Programmer en Python | Les bases du langage Expressions ● Fonctionnement général de l'interpréteur : 1. Lecture d'une ligne de programme : – En mode interactif. – Dans un script. 2. Évaluation du contenu de la ligne : – Expressions logiques/arithmétiques. – Instructions. mark.h 3. Restitution (retour) du résultat de l'évaluation. 4. Passage à la ligne suivante et retour en 1. ● Cas particuliers : ● Les lignes vides. ● Les lignes de commentaire : # Ceci est un commentaire. # Ceci est un commentaire. L1 | Python (I) | p. 9 Apprendre à Programmer en Python | Les bases du langage Expressions arithmétiques ● L'interpréteur Python comme calculatrice : $ python Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) [GCC 4.4.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> 3+5 8 >>> (3+5)/2 4 >>> 7/2 3 mark.h >>> 7.0/2 3.5 Les opérateurs arithmétiques distinguent les nombres entiers des nombres en virgule flottante. Il est possible de forcer la conversion d'une représentation vers l'autre. >>> float(7)/2 3.5 >>> int(7.0)/2 3 L1 | Python (I) | p. 10 Apprendre à Programmer en Python | Les bases du langage Expressions logiques ● Python définit deux constantes de vérité : True et False ● Propose des opérateurs de comparaison : >, <, >=, <=, ==, != >>> 1 > 2 False >>> 2 > 1 True >>> 2 == 2 True >>> 1 != 2 True ● mark.h Et des opérateurs logiques : and, or et not >>> True or False True >>> True and False False >>> not True False L1 | Python (I) | p. 11 Apprendre à Programmer en Python | Les bases du langage Expressions à base de chaînes de caractères ● Chaîne de caractères : succession de caractères (lettres) entre apostrophes ou guillemets. >>> 'Hello' 'Hello' >>> “Hello” 'Hello' >>> “Aujourd'hui” “Aujourd'hui” >>> 'Aujourd\'hui' “Aujourd'hui” mark.h ● Opérateurs : concaténation (+), réplication (*) >>> 'Hello,'+' '+'world.' 'Hello, world.' >>> 2*'Bye '+'.' 'Bye Bye .' ● Conversions vers des formats numériques : >>> str(3.1415) '3.1415' >>> float('3.1415') 3.1415 L1 | Python (I) | p. 12 Apprendre à Programmer en Python | Les bases du langage Variables ● ● ● ● Une variable est un nom donné arbitrairement au résultat d'une expression. Le nom doit commencer par une lettre qui peut être suivie de lettres, chiffres et du caractère sous-ligné. Python distingue les minuscules et les majuscules dans les noms de variables. mark.h Les variables disposent d'un type qui définit les opérations qu'elles supportent. >>> pi=3.141592 >>> pi 3.1415920000000002 >>> type(pi) <type 'float'> >>> PI='Nombre irrationnel' >>> PI 'Nombre irrationnel' >>> type(PI) <type 'str'> L1 | Python (I) | p. 13 Apprendre à Programmer en Python | Les bases du langage Affichage ● Tout objet Python peut être affiché à l'aide de l'instruction print >>> print pi 3.141592 >>> print PI Nombre irrationnel ● La mise en forme de l'affichage peut être contrôlée avec des caractères spéciaux : ● %d : affichage d'entiers. ● %f : affichage de nombres à virgule flottante. ● %e : affichage en «notation scientifique». ● %s : affichage de chaînes de caractères. mark.h >>> print “%d %f %e %s” % (pi,pi,pi,PI) 3 3.141592 3.141592e+00 Nombre irrationnel (un contrôle plus fin est possible pour les formats numériques) L1 | Python (I) | p. 14 Apprendre à Programmer en Python | Les bases du langage Collections : définitions ● ● Les collections fournissent le moyen d'agréger plusieurs constantes et/ou variables (les éléments) dans une autre variable. Il existe trois grands types de collections : ● ● Les tuples : collections dont tous les éléments sont définis à la création. Les éléments sont repérés par leur position dans la collection. Les listes : collections dont les éléments peuvent varier après la création. Les éléments sont repérés par leur position dans la collection. mark.h ● ● ● Les dictionnaires (tableaux associatifs, tables de hachage) : collections dont les éléments peuvent varier après la création. Les éléments sont repérés par une clé. Tous les éléments d'une collection n'ont pas forcément le même type. Les collections peuvent inclure d'autres collections. L1 | Python (I) | p. 15 Apprendre à Programmer en Python | Les bases du langage Collections : les tuples ● Création d'un tuple : >>> meteotup=('Roscoff',2011,9,29,15,00,26.5,True) >>> type(meteotup) <type 'tuple'> ● Adressage en lecture des éléments d'un tuple : >>> meteotup[0] 'Roscoff' >>> meteotup[1:4] (2011, 9, 29) >>> meteotup[­1] True >>> meteotup[:­2] ('Roscoff', 2011, 9, 29, 15, 00) ● mark.h Longueur d'un tuple : >>> len(meteotup) >>> len(meteo) 8 ● Composition de tuples : >>> meteotup=('Roscoff')+(2010, 9, 29, 15, 00)+(26.5,True) L1 | Python (I) | p. 16 Apprendre à Programmer en Python | Les bases du langage Collections : les listes ● Création d'une liste : >>> meteolst=['Roscoff',2011,9,29,15,00,26.5,True] >>> type(meteolst) <type 'list'> ● Adressage en lecture et en écriture des éléments d'une liste : >>> meteolst[0]=['Santec'] >>> meteolst ['Santec', 2011, 9, 29, 15, 00, 26.5, True] mark.h >>> meteolst[4:6]=[9,30] >>> meteolst ['Santec', 2011, 9, 29, 9, 30, 26.5, True] ● Ajout d'éléments à une liste existante : >>> meteolst.append(12.3) >>> meteolst ['Santec', 2011, 9, 29, 9, 30, 26.5, True, 12.3] >>> len(meteo) >>> meteolst.extend(['N',20]) 8 >>> meteolst ['Santec', 2011, 9, 29, 9, 30, 26.5, True, 12.3, 'N', 20] L1 | Python (I) | p. 17 Apprendre à Programmer en Python | Les bases du langage Collections : les listes ● Suppression d'éléments d'une liste : >>> del(meteolst[0]) >>> meteolst [2011, 9, 29, 9, 30, 26.5, True] >>> del(meteolst[­2:]) >>> meteolst [2011, 9, 29, 9, 30] mark.h L1 | Python (I) | p. 18 Apprendre à Programmer en Python | Les bases du langage Collections : les dictionnaires ● Création d'un dictionnaire : >>> meteodict={'Ville' : 'Roscoff', 'Année' : 2011, 'Mois' : 9 , 'Jour' : 29, 'Heure': 15, 'Minutes' : 00, 'Température' : 26.5, 'Soleil' :True} >>> type(meteodict) <type 'dict'> ● Adressage des éléments d'un dictionnaire: >>> meteodict['Ville'] mark.h 'Roscoff' >>> meteodict['Ville']='Santec' >>> meteodict {'Ann\xc3\xa9e': 2011, 'Ville': 'Santec', 'Mois': 9, 'Minutes': 00, 'Jour': 29, 'Heure': 15, 'Soleil': True, 'Temp\xc3\xa9rature': 26.5} ● Ajout d'éléments à un dictionnaire : >>> meteodict['Direction du vent']='N' >>> meteodict['Vitesse du vent']=20 {'Ann\xc3\xa9e': 2011, 'Ville': 'Santec', 'Vitesse du vent': 20, 'Mois': 9, 'Minutes': 00, 'Jour': 29, 'Direction du vent': 'N', 'Heure': 15, 'Soleil': True, 'Temp\xc3\xa9rature': 26.5} L1 | Python (I) | p. 19 Apprendre à Programmer en Python | Les bases du langage Collections : les dictionnaires ● Suppression d'éléments d'un dictionnaire : >>> del(meteodict['Ville']) >>> meteodict {'Ann\xc3\xa9e': 2011, 'Vitesse du vent': 20, 'Mois': 9, 'Minutes': 00, 'Jour': 29, 'Direction du vent': 'N', 'Heure': 15, 'Soleil': True, 'Temp\xc3\xa9rature': 26.5} ● Vérification de la présence d'un élément dans le dictionnaire : >>> meteodict.has_key('Minutes') True >>> meteodict.has_key('Secondes') False mark.h L1 | Python (I) | p. 20 Apprendre à Programmer en Python | Les bases du langage Blocs et contrôle de flux ● ● Chaque ligne d'un programme Python se trouve dans un bloc. Toutes les lignes d'un même bloc doivent être alignées verticalement, i.e. avoir la même indentation. >>> print pi 3.141592 >>> print PI File "<stdin>", line 1 print PI ^ IndentationError: unexpected indent ● mark.h Cette contrainte assure une amélioration significative de la lisibilité des programmes. L1 | Python (I) | p. 21 Apprendre à Programmer en Python | Les bases du langage Blocs et contrôle de flux ● Contrôle de flux : ● Instructions qui permettent d'interrompre la linéarité de l'exécution des programmes pour : – – Exécuter de manière répétée un bloc d'instructions : ● Un nombre de fois défini à l'entrée du bloc : mark.h – énumération des éléments d'une collection, – itération sur un intervalle d'entiers. ● Un nombre de fois calculé dynamiquement dans le bloc : – tant qu'une condition est remplie. – jusqu'à ce qu'une condition soit remplie. Exécuter de manière conditionnelle un bloc d'instructions : ● Si une expression est évaluée à True. ● Sinon. L1 | Python (I) | p. 22 Apprendre à Programmer en Python | Les bases du langage Énumération des éléments d'une collection ● Syntaxe générale : for variable in collection : # bloc d'instructions à répéter # pour chaque élément de la collection print variable # Retour au bloc précédent. ● Exemples : Dictionnaire mark.h Liste/tuple >>> for element in meteolst : ... print element ... Roscoff 2011 9 29 15 00 26.5 True >>> for element in meteodict : ... print element ... Année Vitesse du vent Mois Minutes Jour Direction du vent Heure Soleil Température L1 | Python (I) | p. 23 Apprendre à Programmer en Python | Les bases du langage Itération sur une séquence d'entiers ● Syntaxe générale : for variable in range(premier,dernier+1) : # bloc d'instructions a répéter # pour chaque valeur entière de la variable print variable # Retour au bloc précédent. ● Exemple : mark.h >>> for i in range(0,5) : ... carre=i*i ... print "le carré de %d est %d" % (i,carre) ... le carré de 0 est 0 le carré de 1 est 1 le carré de 2 est 4 le carré de 3 est 9 le carré de 4 est 16 L1 | Python (I) | p. 24 Apprendre à Programmer en Python | Les bases du langage Répétition tant qu'une condition est remplie ● Syntaxe générale : while condition : # bloc d'instructions à répéter # tant la condition est remplie # incluant une modification d'un des éléments # de la condition. print 'La condition est remplie.' # Retour au bloc précédent. ● Exemple : mark.h >>> i=0 >>> while i < 4 : ... print "la position”,i,”contient”,meteolst[i] ... i=i+1 ... la position 0 contient Roscoff la position 1 contient 2011 la position 2 contient 9 la position 3 contient 29 L1 | Python (I) | p. 25 Apprendre à Programmer en Python | Les bases du langage Répétition jusqu'à ce qu'une condition soit remplie ● Syntaxe générale : while True : # bloc d'instructions à répéter # tant que la condition n'est pas remplie if condition : break # Retour au bloc précédent. ● Exemple : mark.h >>> i=0 >>> while True : ... print "la position”,i,”contient”,meteolst[i] ... i=i+1 ... if i >= 4 : ... break ... la position 0 contient Roscoff la position 1 contient 2011 la position 2 contient 9 la position 3 contient 29 L1 | Python (I) | p. 26 Apprendre à Programmer en Python | Les bases du langage Exécution conditionnelle d'un bloc ● Syntaxe générale : if condition : # Bloc à exécuter si la condition est # remplie. else : # Bloc à exécuter si la condition n'est # pas remplie. # Retour au bloc précédent. mark.h ● Exemple : >>> if meteolst[7] == False : ... print "Il pleut sur ",meteolst[0] ... else : ... print "Il ne pleut pas sur ",meteolst[0] ... Il ne pleut pas sur Roscoff L1 | Python (I) | p. 27 Apprendre à Programmer en Python | Les bases du langage Utilisation des fichiers ● L'ouverture des fichiers se fait avec : ● ● ● fd=open(nom du fichier[, mode d'ouverture]) Le nom du fichier est une chaîne de caractères avec le chemin dans le système de fichiers du fichier à ouvrir. Le mode d'ouverture est une chaîne de caractères normalisée indiquant quelles opérations seront faites sur le fichier. Exemples : ● 'r' : lecture seule (mode d'ouverture par défaut), mark.h ● ● 'w' : écriture seule avec troncature à l'ouverture, ● 'a' : écriture seule en commençant à la fin du fichier. Cette fonction retourne un descripteur de fichier (fd), utilisé par la suite pour toutes les opérations sur ce même fichier. >>> fdr=open('donnees.dat') # ouverture en lecture seule. >>> fdw=open('resultats.dat','w') # ouverture en écriture. L1 | Python (I) | p. 28 Apprendre à Programmer en Python | Les bases du langage Utilisation des fichiers ● La lecture dans les fichiers, ligne par ligne, se fait avec : ● ● ligne=fd.readline() Cette fonction retourne (dans la variable ligne) le contenu de la «ligne courante» du fichier dont le descripteur est fd. ● A l'ouverture du fichier, la «ligne courante» est la première ligne du fichier. ● Chaque appel à readline() fait avancer d'une ligne cette «ligne courante». ● mark.h Attention : la chaîne de caractères retournée comprend, en dernière position, le caractère de saut de ligne. >>> line=fdr.readline() # lecture de la première ligne. >>> line=fdr.readline() # lecture de la deuxième ligne. >>> line=fdr.readline() # lecture de la troisième ligne. ● Il est possible de lire en une fois le contenu de tout un fichier à l'aide de la fonction readlines() : >>> lines=fdr.readlines() # lines est une liste avec les lignes du fichier. L1 | Python (I) | p. 29 Apprendre à Programmer en Python | Les bases du langage Utilisation des fichiers ● L'écriture dans les fichiers se fait avec : ● ● ● fd.write(chaîne_de_caractères) Cette fonction écrit le contenu de chaîne_de_caractères à la fin du fichier dont le descripteur est fd. Attention : aucun caractère de saut de ligne n'est ajouté par défaut. mark.h >>> fdw.write(“Hello\nWorld\n”) # écriture de deux lignes. ● La fermeture des fichiers se fait avec : ● ● fd.close() Attention : il est nécessaire d'appeler cette fonction, en particulier pour les fichiers ouverts en écriture. L1 | Python (I) | p. 30 Apprendre à Programmer en Python | Les bases du langage Utilisation des fichiers ● Entrée et sortie standards : ● ● Le clavier (entrée standard) et le terminal (sortie standard) sont accessibles au travers de deux descripteurs prédéfinis : – sys.stdin : accessible en lecture. – sys.stdout : accessible en écriture. Une sortie est également prédéfinie pour la génération des erreurs : – mark.h sys.stderr : accessible en écriture. >>> import sys >>> sys.stdout.write(“Hello World\n”) # identique à : >>> print “Hello World” >>> ligne=sys.stdin.readline() # attend la saisie d'une ligne. >>> sys.stderr.write(“Une erreur est surevenue.\n”) L1 | Python (I) | p. 31 Apprendre à Programmer en Python | Les bases du langage Utilisation des fichiers ● Un idiome Python pour la lecture des fichiers : for line in fd : # Bloc à exécuter pour chaque ligne # du fichier. # Retour au bloc précédent. mark.h L1 | Python (I) | p. 32 Apprendre à Programmer en Python | Les bases du langage Utilisation des fichiers ● Lecture et écriture de données «au format Python» : ● ● ● Les fonctions read() et write() utilisent des chaînes de caractères. Leur utilisation pour des données «natives» en Python (tuples, listes, dictionnaires...) oblige leur conversion de ou vers ces chaînes de caractères Le module pickle permet le stockage ou la lecture de données dans un format natif : – pickle.dump(vw,fd) : écritmark.h dans la variable vw dans le fichier dont le descripteur est fd. – vr=pickle.load(fd) : charge dans la variable vr le contenu du fichier dont le descripteur est fd. >>> import pickle >>> pfw=open(“tonneau”,”w”) >>> pickle.dump(d,pfw) # d : dictionnaire >>> pfw.close() L1 | Python (I) | p. 33 >>> import pickle >>> pfr=open(“tonneau”) >>> d=pickle.load(pfr) >>> pfr.close() Apprendre à Programmer en Python | Les bases du langage Exercices mark.h L1 | Python (I) | p. 34