[go: up one dir, main page]

100% ont trouvé ce document utile (1 vote)
274 vues320 pages

Programmation en Python Pour Les Mathématiques

Transféré par

Max Durand
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF ou lisez en ligne sur Scribd
100% ont trouvé ce document utile (1 vote)
274 vues320 pages

Programmation en Python Pour Les Mathématiques

Transféré par

Max Durand
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF ou lisez en ligne sur Scribd
Vous êtes sur la page 1/ 320
Alexandre Casamayou-Boucau Pascal Chauvin Guillaume Connan Programmation en Python pour les mathématiques Cours et exercices 2° édition DUNOD od. Dun Copyright © 201 lo pidogemme qui figure ciconte dens pi init oye ensbosen. Sor bel ct botse buck dot hd brs of de leer le ledevr sur la menace que eres, cu point quelaposalt mene pour represent pour Fare de er ks ovis de créer dos ours prtelitremert dans edomsine (DANGER) "ovveles et de ls fire eit cor Ge tion technique univers recent est cure ui merace, tare, le développement moss do ‘Neus ragpelans dane que toe photccoploge. reprodocion, pile ov tole, Le Code dela proprtsinilec- ae lo présente publication est tueladu 1 jullet 1992 inert |LEPKTIEDPLGE| infects sans autrzation do cen ele cxpreséneta pholoco- LTUELELIVRE) avewr, de ion édieur ov du pie @ vsoge collect sons ovo Cente frongais dexpltion dy Salon des ayant do. Or, cetieproigue droit de copie (CFC, 20, rue des et gine dan es Gobisenens Grands Avgsis, 75006 ais © Dunod, 2012, 2016 5 rue Laromiguiére, 75005 Paris www.dunod.com ISBN 978-2-10-074476-3 le Code de la propriété intellecuelle n’autorsant, oux termes de taricle 122.5, 2° et 3° o}, d'une part, que les « copies ou reproductions srictement réservées @ l'usage privé du copiste et non destinées 6 une uilistion collective » €, d'aure port, que les onclyses et les coures citations dans un but d‘exemple ot dilusration, « foul représentotion ov reproduction inkgrale ov partielle fete sans le consentement de l'auteur ou de ses ayants dreit ou ayants cause est ice » for. L. 122-4) Cote représenation ov reproduction, par quelque procédé que ce sot, constue fait done une contretogon sanctionnée por les arlcls |. 3352 ef suivants du Code de lo propriété inellecuele Préface a la premiére édition Dans cet ouvrage consacré a I’étude du langage Python, Alexandre Casamayou-Boucau, Guillaume Connan et Pascal Chauvin ont réussi une difficile synthése : celle de présenter une introduction claire au langage proprement dit, tout en explicitant ses liens profonds avec ’al- gorithmique mathématique. est certain que le choix de Python rendait @ priori cette synthése possible : grace a sa syntaxe de programmation multi-paradigme, l’écriture de programmes en Python est la fois puissante et abordable ; elle est susceptible de couvrir la plupart des domaines de la programmation, et de faon éminente ceux pouvant intéresser lalgorithmique. De ce point de vue, l'apprentissage d’un langage « fondamental » comme Python nous semble étre une alternative didactique bien supérieure a celle qui consisterait a apprendre seulement I'usage de logiciels de calcul formel : pour donner une analogie, disons que c'est un peu la différence qu'il y a entre maitriser en profondeur le fonctionnement et la méca- nique d'une automobile, et le fait de simplement savoir la conduire! Le fait que Python est, entigrement en source libre et trés utilisé dans l'industrie garantit en outre son accessibilité, sa pérennité et son évolutivité dans le temps ; ce n’est pas nécessairement le cas des logiciels propriétaires qui, pour cette raison, ne sauraient étre recommandés au meme titre pour des programmes d’enseignement. Louvrage devrait conduire le lecteur approfondir beaucoup sa connaissance des prin- cipes de la programmation et sa compréhension des algorithmes mathématiques fondamen- taux, Il est construit a partir d’exemples nombreux et trés riches qui en rendent la lecture attrayante, Ceux-ci devraient aussi grandement faciliter la tache des enseignants qui uti ront, depuis le lycée jusqu’aux classes préparatoires et &'université, Saint-Martin d’Héres, le 5 octobre 2011, Jean-Pierre Demailly Professeur a l'Université de Grenoble | Membre de I'Académie des Sciences “pouna 9T0z @ awBuAdo> Table des matiéres Avant-propos vii 1 Introduction au langage Python 1 1 Pourquoi Python? 1 2 Avant de commencer. qa 2 3 Utiliser Python comme une calculette 2 4 Variables et affectations Hosa eeee atta 3 5 Fonctios ..............0. Gat aaa 6 6 Instructions d'écriture et de lecture... . Gaited teehee 10 7 Lasstructure conditionnelle ..... . Prete atts 4M 8 Les boucles white 18 9 Les listes 20 10 Les boucles for : 28 11 Récapitulatif sur les principaux types Ted eee 31 12 Quelques mots sur la récursivité oe tresssemeaice 3 13 Quelques méthodes pour trier une li 35 14 Quelques primitives usuelles cee cece cece eens 87 15 Un mot sur les exceptions 40 16 Compléments sur les fonctions ....... 0... wisewerine 17 Notions sur les classes... 2... . : piled 43 18 Exercices d’entrainement Pee eo eteiete Geter rae eae 2 Modules 51 1 Structure d'un module... 0... eee eee usisengssa ‘SI 2 — Quelques modules « Batteries included » vee 53 3 Lire et écrire dans un fichier... eee eee BH 4 Manipulation de fichiers CSV 68 5 Comment générer des graphiques?........... ieemsismerive 70 2 6 — Un coup d’ceil vers le module Matplotlib 7” 7 Exercices d’entrainement Hee eros Gitta reer zs 3 3. Themes mathématiques 7 1 Matrices B 2 Les nombres : entre analyse et algebre mines wae tm 112 3 Lenombre x 149 4 Probabilités . : aes Saad - 163 3 5 Relations binaires et graphes 170 4 Méthodes numériques 179 1 Les nombres en notation scientifique...... 00... ie ete oe LO) 2 Résolution d’équations non linéaires 182 3 Résolution numérique d'équations différentielles .... . . i teer sie 166 4 Interpolation polynomiale 19 5 Dérivation numérique... eee areata ten vi Programmation en Python pour les mathématiques 6 Intégration numérique . 205 7 — Exercices d’entrainement 216 5 Récursivité 217 1 Quelques exemples . . 217 2 Spirale de pentagones 225 3. Courbe du dragon 226 4 Triangle de Sterprisky 228 5 Sommes de termes d'une suite géométrique 232 6 Exercices d’entrainement 233 6 Classes 1 Graphes eevsis 2 Représentation des nombres, 3 Listes a 4 Arbres binaires 5 Caleulateur 6 Polynémes et fractions rationnelles 7 Exercices d’entrainement Bibliographic 302 Index général 305 Index des commandes 309 Avant-propos La réalisation d’un programme informatique de facon traditionnelle passe nécessaire- ment par l’écriture de son code source. C’est cet aspect-la de la programmation qui nous in- téresse tout particuligrement. Véritable activité de rédaction en soi, si fréquente dans les ap- prentissages, c'est par cette phase justement — qui peut étre laborieuse mais aussi tellement gratifiante—, que l'on obtient le résultat désiré. Il nous semble important d’en convaincre les élaves. Tout le travail consiste & analyser un probléme et & décrire un moyen d’obtenir une so- lution, Dépourvu de toute capacité de déduction ou danticipation, le « robot », lui — inter- préteur ou compilateur —, se contente de n’exécuter strictement que ce que I'auteur du pro- gramme aura explicité. La plus grande rigueur s'impose donc. Cette exigence requise dans la programmation, dont la pratique est encore toute nouvelle pour les collégiens et les lycéens, ne peut que leur étre a terme bénéfique dans les autres apprentissages. Certes, les environnements modernes de développement logiciel (le « Rapid Application Development» dans la terminologie anglo-saxonne) foisonnent de dispositife d’assistance au programmeur, dans les outils employés. Mais il y a surtout, depuis quelques années, la pro- grammation modulaire et la conception objet, qui permettent de segmenter de gigantesques projets pour une réalisation commune, partagée par des centaines d’individus. Il n’en de- meure pas moins que les phases d’écriture perdurent, qui plus est avec des langages de pro- grammation qui sont en ce début de troisiéme millénaire plus de deux mille, alors que cette activité a réellement pris son essor un peu avant la Seconde Guerre mondiale. Si la programmation se sert de 'algorithmique pour étte efficace, elle doit aussi étre en mesure de fournir en plus des programmes & la fois lisibles, facilement utilisables et modi fiables par d'autres utilisateurs. Depuis FORTRAN (1 956), langage qui laissait 'utilisateur tres proche de la machine, les langages ne cessent d’évoluer vers un plus « haut niveau », a savoir, deviennent toujours plus accessibles. Par exemple, voici trois routines (la premiere fonction est exprimée en langage C, la se- conde en langage CaML, la troisi¢me en langage Python) calculant la factorielle d’un entier naturel n: factorielle.c factorielle.mt Long factorielte(tong n) { let rec factorielle = function long resultat = 1; | o->2 unsigned Long i; | n -> nefactorielte(n-1);; if (n <0) return -1; factorielle.py for (i= 1; 4 < nél; +44) resultat *= i; def factorielle(n): return resultat; if n > @: return nefactorielte(n-1) } else: return 1 vii Programmation en Python pour les mathématiques Hormis le fait que la version C soit écrite dans un style itératif 18 ott le langage CaML est, redoutablement efficace en ce qui concerne la récursivité, quel est le langage de plus haut niveau?... En mathematiques, les langages de haut niveau basés sur un formalisme logique nous intéressent au plus haut point car ils ont cette rigueur qui sied a notre discipline et sont en méme temps moins parasités par les détails technologiques des langages trop prés de la ma- chine ou trop laches logiquement parlant. Cependant, les langages comme le C sont largement employés (car ils sont liés aux sys- temes UNIX), tout comme la programmation objet, si prisée pour la réalisation des interfaces homme/machine des programmes industriels. C'est pourquoi nous avons choisi le langage Python. Il fait ses preuves en tant que lan- gage orienté objet, tout en permettant également une programmation impérative et récursive, Python présente une syntaxe claire et reste particuligrement abordable pour les débutants, tout en offrant des constructions de haut niveau, Les langages cités ici sont, parmi d’autres non moins importants, largement répandus et développés par des équipes & la pointe de la recherche informatique. Ils ont été pensés, amé- liorés depuis des années et évitent les écueils de certaines interfaces prétendument simples & manipuler mais qui peuvent cacher de nombreux vices et ne déboucheront sur aucune utili- sation en dehors du lycée. Comme on continue a faire des mathématiques et a calculer avec un papier et un crayon, de meme on préférera un contexte de programmation le plus sobre possible, dépouillé de tout ce qui est inutile et qui nuit a la réflexion. Un éditeur de texte simple (et non un logiciel de traitement de texte) fait amplement I'affaire, accompagné d’une console (+N+X de préférence) pour 'interprétation ou la compilation, puis "exécution d'un programme. Il s‘agit vraiment de se concentrer sur l'essentiel, et nous voyons les éleves accepter ce travail, dans la mesure oi Ia récompense est immeédiate : soit le programme fonctionne, soit il ne fonctionne pas, ou bien il effectue autre chose que ce que son auteur prévoyait. Aucune autre récompense rest visée que la satisfaction intellectuelle propre a l'apprentissage. Or c'est la une priorité de Pécole. Comment utiliser ce livre ? Le présent ouvrage vise deux objectifs : introduire la programmation en Python et ap- pliquer les notions ainsi acquises aux mathématiques. Aprés un premier chapitre présentant les fondamentaux du langage Python, un deuxiéme chapitre aborde la notion de module. D'une part, il est expliqué comment programmer un module personnel ; d’autre part, on présente quelques-uns des trés nombreux modules four- nis par défaut avec Python'. En ce qui concerne les modules de tierces parties les plus connus des scientifiques (NumPy et SciPy pour le calcul numérique, MatpLot Lib pour les gra- phiques, SymPy pour le calcul formel), nous ne les mentionnerons que sommairement ici ou 1. Nous aborderons pas les modules permettant de manipuler des bases de données sQt-avec Python. Lelecteur intéressé par ce sujet pourra, par exemple, consulter le chapitre 16 de ouvrage (Swi10] dont une version électronique est librement téléchargeable sur le site de son auteur. Avant-propos ix la: en effet, leur présentation détaillée dépasse largement le cadre de cet ouvrage. En outre, pour le tracé des fonctions, nous avons fait le choix de développer, a titre pédagogique, un petit module permettant de générer un graphique au format PostScript a partir d'une liste de points a tracer. Le chapitre suivant se propose de présenter une liste variée d'algorithmes mathéma- tiques programmés le plus simplement possible en Python : sont illustrés plusieurs algo- rithmes c'arithmétique (algorithme d’ EUcLiDE, tests de primalité, etc.), de cryptographie (chif- frement de HILL, de VIGENERE, systéme RSA, etc), les problématiques d’approximation dé- cimale (calcul des premieres décimales de 1 par les méthodes de Nicolas DE Cus, de John MACHIN, de BRENT et SALAMIN, etc.), des problemes de probabilités et de théorie des graphes. Ensuite, sont passées en revue les méthodes classiques d’analys résolution «équations diverses, d’équations différentielles ordinaires, de dérivation et d’'intégration nu- mériques. Les deux derniers chapitres sont davantage tournés vers I'algorithmique. Aprés avoir taaité de la notion de récursivité, le dernier chapitre prend comme fil conducteur plusieurs implémentations d’un petit calculateur formel : sont abordées quelques structures de don- nées classiques (arbres, graphes, piles, queues, etc.) et la conception orientée objet, dont un objectif est d'obtenir, au moyen de abstraction, une bonne modularité, si utile pour les, grands projets Certains programmes un peu trop longs pour figurer sur la version papier sont dispo- nibles dans une archive, qui contient en outre ensemble de ceux du livre, et que l'on peut télécharger sur la page du site www .dunod . com consacrée a cet ouvrage. Les notions exposées dans cet ouvrage sont illustrées par des exercices répartis au long de chaque chapitre. De plus, en fin de chapitre sont regroupés des exercices d’entrainement dont les corrigés sont disponibles sur le site dunod.com a partir de la page d’accueil de 'ou- vrage. Louvrage s'adresse notamment aux professeurs de mathématiques au lyeée. Ils pourront vérifier que l'utilisation du langage Python est un tres bon choix pour l'enseignement de ’al- gorithmique inscrit dans les nouveaux programmes de mathématiques. Les éleves du lycée et les étudiants de licence et des classes préparatoires pourront également trouver ici de quoi stimuler leur apprentissage de la programmation. ‘Aucune notion en informatique n'est requise pour entreprendre la lecture de cet ouvrage. Conventions pour la présentation du code Pour l’écriture du code, vous rencontrerez plusieurs présentations : — les instructions précédées de chevrons dans une boite grisée sont a saisir dans une ses- sion interactive; peo ltd a Programmation en Python pour les mathématiques ~ les instructions sans chevrons dans une boite grisée sont des bouts de code a écrire dans un fichier; print(*Bonjour ! ~ lesinstructions dans une boite grisée avec un filet sombre a gauche et un nom de fichier en italique au-dessus de la boite sont des extraits d’un fichier se trouvant dans archive 1éléchargeable sur le site de ’éditeur; dans ce cas, sile résultat de lexécution du script est présentée, elle apparait immédiatement aprés le script sur fond blanc; fichier py #1/usr/bin/python3 #x- coding: utf-8 print( ‘Voici le résultat.') Voici le résultat. — deux traits horizontaux délimitent une session dans un terminal Unix: Terminal $ python3 fichier.py voici le resuttat. $ python3 Python 3.1.3 (r313:86834, Nov 28 2010, 11:28:10) (GCC 4.4.5] on Linux2 Type "help", "copyright", "credits" or "License" for more information. per ltl 2 Remerciements Nous tenons & remercier vivement tous ceux qui ont relu le manuscrit de cet ouvrage = Alain Busser, Stéphane GROGNET, Hubert H. HuPKEs, Gérard KUNTZ, Francois PANTIGNY et Aymar DE SAINT-SEINE. Nous remercions également nos étudiants et éléves pour avoir servi de « cobayes » et proposé des améliorations de nos programmes. Enfin, nous remercions vivement Jean-Pierre DEMAILLY quia accepté de préfacer cet ou- vrage. Introduction au langage Python Sommaire 1 Pourquoi Python?.......... 7 1 2 Avant de commencerin. sess eee seen ees eee 3 Utiliser Python comme une calculette . . . 7 2 4 Variables et affectations .... 66-0. s seen . 3 5 Fonctions ... . . : 6 6 Instructions d’écriture et de lecture... . 26sec e seen ees 10 7 La structure conditionnelle 4 8 Les boucles while............ 18 9 Lestistes .... : 20 10 Les boucles for ....- 28 11 Récapitulatif sur les principaux types 31 12 Quelques mots sur la récursivité . 33 13 Quelques méthodes pour trier une liste . 35 14 Quelques primitives usuelles .... . 37 14.1 Quelques primitives d'un usage courant 38 14.2. Primitives de conversion de type 38 14.3 Itérateurs 39 15 Un mot sur les exceptions 6.0.0... e eee reece ence e es 40 16 Compléments sur les fonctions... 6.6... eve eee eee eee AL 17 Notions sur les classes . . 7 : 43 18 _ Exercices d’entrainement 3 49 1 Pourquoi Python ? Le langage de programmation Python est un trés bon choix aussi bien pour l'initiation a la programmation que pour la programmation elle-méme. C’est un langage de trés haut niveau dont la syntaxe encourage a écrire du code clair et de qualité. Dans le domaine dela gestion de la mémoire, nombre de détails de bas niveau propres aux langages comme le C disparaissent. De plus l'apprentissage de Python est facilité par l’existence d'une interface interactive. Cela dit, son intérét ne se réduit pas a l’apprentissage de la programmation ou de l'algorithmique ; Programmation en Python pour les mathématiques en témoigne sa popularité croissante. Il a été choisi par des acteurs majeurs : Google, YouTube, la NASA, etc. ‘Techniquement parlant, Python est un langage oit I'on peut choisir plusieurs styles de pro- grammation. II favorise la programmation impérative structurée et la programmation orien- t6e objet; dans une moindre mesure, il permet de programmer dans un style fonctionnel '. Il est doté d’un typage dynamique fort, d’une gestion automatique de la mémoire par ramasse- miettes et d'un systéme de gestion d’exceptions. C’est un langage multi-plateforme, polyva lent (jusque dans les domaines comme le web, les graphiques, le réseau), « open source », et gratuit. Enfin, l'utilisation de Python pourra étre couplée a celle du logiciel libre de calcul formel Sagemath” puisque ce dernier est écrit en Python, Si ce bref plaidoyer ne vous a pas convaincu(e), essayez. Python, vous l'adopterez certaine- ment. 2 Avant de commencer... Pour installer Python, il suffit de télécharger la version 3 qui correspond a votre systéme d’ex- ploitation (Windows ou Mac) al'adresse : http: //www. Python.org/ Pour ce qui est des systémes Linux, Python est généralement déja installé par défaut, et Idle se trouve dans les dépéts de la plupart des distributions. Pour les syst@mes BSD, si Python n'est pas déja installé comme dépendance, utiliser les paquetages ou les ports. En complément de ce chapitre de présentation des bases du langage Python, le lecteur pourra également consulter avec profit les cing premieres sections du tutoriel officiel de Python ; http://docs .python.org/py3k/tutorial/ 3 Utiliser Python comme une calculette Si vous n’avez jamais programmé, le plus simple pour exécuter des instructions Python est utiliser "environnement spécialisé Idle. Cet environnement se compose d'une fenétre ap- pelée indifféremment console, shell ou terminal Python. Linvite de commande se compose de trois chevrons ; il suffit de saisir 21a suite une instruction puis d’appuyer sur la touche « Entrée » de votre clavier. Nous ne dérogerons pasa la tradition informatique qui consiste a commencer 'apprentissage d'un langage par I’affichage * d'une salutation : S55 print ("Bonjour !") Bonjour ! La console Python fonctionne comme une simple calculatrice : vous pouvez y saisir une ex- pression dont la valeur est renvoyée ds que vous pressez la touche « Entrée », 1. Cet aspect ne sera pas abordé dans cet ouvrage; le lecteur intéressé pourra se reporter la page « Functional Programming HOWTO » de la documentation : http://docs.. python. ora/py3k/howto/ functional . html. 2. of. http://w. sagenath.org/ ethttp: //www.sagenath.org/tt/. Pour une introduction a Sagenath, on pourra consulter le livre électronique Calcul mashématique avec Sage librement téléchargeable a adresse nt tp://sagebook. gforge.inria.fr/. 3. Les utlisateurs de Python 2 remarqueront qu’a partir de la version 3, I instruction print est remplacée par la fonction print (). Pour plus de détails, cf. nttp://docs.python.org/3. 1/whatsnew/3.0.htal. Introduction au langage Python >>> 2* 546 - (100 + 3) -87 >> 7 /2;7/3 3.5 2,3333333333333335 >>> 34 // 5; 34 % 5 # quotient et reste de la division euclidienne de 34 par 5 6 4 >>> 2 s« 7 # pour L'exponentiation (et non pas 2°7 !) 128 ‘Au passage, nous avons utilisé le symbole « diese » # pour placer des commentaires dans les lignes de commande; tout ce qui se situe a droite d’un symbole # (jusqu’au changement de ligne) est purement et simplement ignoré par l'interpréteur. Pour naviguer dans I'historique des instructions saisies dans la console Python, on peut uti- liser les raccourcis Alt+p (p comme previous) et Alt#n (n comme next). 4 Variables et affectations Que se passe-t-il au juste lorsqu’on saisit un nombre (par exemple 128) dans la console Py- thon? Eh bien, disons, en premiere approximation, que l’interpréteur crée un nouvel « objet» (sans préciser pour l'instant le sens de ce mot) et le garde en mémoire. >>> 128, id(128), type(128) (1, 137182768, ) Cet objet posséde une valeur (ici 128), un identifiant, Cest-d-dire une «carte d'iden- tité» permettant de savoir oit il est gardé en mémoire (ici 137182768), et enfin un type* (ici le type entier dénommé int). Le moins que l'on puisse dire, c’est que l'identifiant ne nous parle guére... D’oui lintérét des affectations. Au lieu de désigner 128 par son identifiant, on va lui donner un nom commode A manipuler. Au lieu d’appeler l'objet « Monsieur 137180768 », on I'appellera «Monsieur A. », aprés avoir indiqué a l'interpréteur une fois pour toute l’identification opérée par un message du type : « Monsieur A. alias Monsieur 137180768 ». En pratique, une affectation s'effectue a l'aide du symbole « », comme ceci: = 128 v a a >> a 128 >>> a, id(a), type(a) (128, 137180768, ) p> 2s a 256 4, Lanotion de type sera détallée a la section 11 page 31. Programmation en Python pour les mathématiques Ainsi chaque fois que nous appellerons le nombre 128, il nous suffira d’invoquer la variable a. Notez que l'objet désigné par a est toujours l'objet 128, rangé encore a la méme adresse. 1 faut bien prendre garde au fait que Vinstruction d’affectation «=» n'a pas la méme signifi- cation que le symbole d’égalité « = » en mathématiques®. Par exemple, le premier n'est pas symétrique, alors que le second Pest : vouloir échanger ordre des éléments dans une instruc- tion ¢’affectation produira immanquablement une erreur dans Vinterpréteur : >>> 128 =a File "", Line 1 SyntaxError: can't assign to Literal Effectuons a présent la suite d’affectations suivantes : a> b= ax2 >>> b # rép.: 256 >>> b, id(b), type(b) # rép.: (256, 137184816, ) por a= 0 pop a, id(a), type(a) # rép.: (0, 137186720, ) >>> b # rép.: 256 Icise situe une petite difficulté pour ceux qui débutent la programmation. Contrairement ce que nos habitudes de calcul algébrique pourraient nous laisser penser, instruction b = a«2 niaffecte pas & b le double de la valeur a quelle que soit la valeur de a au long de la session Python. Au contraire, instruction b = 2*2 procéde en deux temps : ~ Vexpression située & droite du signe «=» est évaluée, c’est-a-dire calculée en fonction de Pétat dela mémoire a cet instant : ici Vinterpréteur value le double de la valeur de a; le résultat est un objet de type entier, de valeur 256, et placé en mémoire avec l'identifiant 137180720. ensuite, et seulement ensuite, 'interpréteur affecte au nom situé a gauche de l'instruc- tion d'affectation (a savoir b) l'objet obtenu apres évaluation de l'expression de droite. On remarque que l’identifiant de l'objet auquel renvoie la variable b n'a plus rien a voir avec a. Autrement dit, l'objet nommé b n’a plus aucune relation avec l'objet nommé a. Ainsi, une réaffectation ultérieure de la variable a n’entrainera aucun changement pour la variable b. Avez-vous bien compris? Alors exercez-vous en lisant les suites d’instructions suivantes et en notant sur un papier le contenu de chacune des variables & chaque étape ; puis exécutez, chacune de ces suites d'instructions dans la console et vérifiez que ce que vous ave noté concorde avec ce qu'atfiche l’interpréteur. 5. Ceci explique que dans les livres d'algorithme, V'affection de expr a x se note souvent x — expr. Introduction au langage Python Allons un peu plus loin; il est fréquent qu’en programmation, on se serve d’une variable comme d'un compteur et que ’on ait donc besoin d’incrémenter (c’est-a-dire augmenter) ou de décrémenter (c’est-d-dire diminuer) la valeur de la variable d'une certaine quantité. On procede alors de la maniére suivante. pe x= 0 poo xe xl p> x, id(x), type(x) # rép.: (1, 137180736, ) pee xexe] pee x, id(x), type(x) # rép.: (2, 137180752, ) pee x axel pee x, id(x), type(x) # rép.: (3, 137180768, ) Encore une fois, notez bien la différence avec le calcul algébrique : alors que I'équation x = x+1 na pas de solution, l'instruction x = x + 1 est parfaitement licite, et méme utilisée couramment en programmation, Détaillons la premiere instruction x = x + 1 ci-dessus; cette instruction procéde en deux temps: Vinterpréteur évalue la valeurdex + 1a1'instant donné; le résultat est un objet de type entier, de valeur 1, et placé en mémoire avec l'identifiant 137180736. — ensuite, et seulement ensuite, l'interprétour affecte au nom qui se trouve & gauche de instruction d'affectation (a savoir x) l'objet obtenu apres évaluation de I'expression de droite, Signalons un raccourci propre & Python trés utile en pratique et qui a l'avantage d’éviter la confusion avec la manipulation d’équations en algebre. pee x +1 # remplace x par x+1 S55 x #23 # remplace x par x*3 >e> x -= 3 # remplace x par x-3 pee x /= 2 # remplace x par x/2 Autre raccourci intéressant, on peut assigner un méme objet a plusieurs variables simultané- ment. Ces deux variables renvoient alors au méme objet (on dit parfois que ce sont deux alias du méme objet). poo x ay =3 D> Ky 3, 3) >> id(x), id(y) (137180768, 137180768) On peut aussi effectuer des affectations paralleles & Vaide d'un seul opérateur « expressions sont alors évaluées avant la premiere affectation. >>> x, y = 128, 256 Encore une fois, il faut bien comprendre qu’une affectation se déroule en deux temp: luation de l'expression de droite puis création de alias avec le nom du terme de gauche. Pourriez-vous prévoir le résultat des deux suites d’instructions suivantes? Programmation en Python pour les mathématiques sop x = 19 ao x = 19 pee xa x+2iysx=2 D> x, yx +2, x #2 >> x,y >>> x, y Voici a présent un exercice qu'il est nécessaire de comprendre parfaitement avant de conti- nuer plus avant. Un exercice fondamental : I'échange des contenus de deux variables On suppose que les variables x ety ont pour valeurs respectives des entiers a et. On souhaite échanger le contenu de ces deux variables. @) Premiere méthode : Proposer une méthode qui utilise une variable auxiliaire tmp. 1) Deuxiéme méthode : On exécute la séquence d’instructions suivante : D> K EX ty Y=x-yixex-y Quel sont les contenus des variables x et y en fin de séquence? ©) Troisiéme méthode (la plus « pythonique ») : Utiliser une affectation paralléle. Solution. a) >> tmp = x b) Ona échangé les valeurs de x et y. > Key boo y = tmp Ox yey x Signalons rapidement que pour supprimer une variable, on dispose de la fonction del. Avant de clore cette section, précisons que les noms de variables peuvent étre non seulement des lettres, mais aussi des mots; ils peuvent contenir des chiffres (4 condition toutefois de ne pas commencer par un chiffre), ainsi que certains caractéres spéciaux comme le tiret bas «—» (appelé underscore en anglais). Le bon programmeur s'efforce bien entendu de choisir les noms de variables les plus pertinents possible. 5 Fonctions Supposons que nous cherchions a calculer les images de certains nombres par une fonction polynomiale donnée. Sila fonction en question est un peu longu 1, parexemple, f: x x? ~6x° + 15x4 +23x3 + x—9, il est rapidement fastidieux de la saisir 4 chaque fois que l'on souhaite calculer l'image d'un nombre par cette fonction, Une premiere idée est dutiliser I'historique de la console pour éviter de saisir A chaque fois la fonction : pee x = 2 D> mT - GHG + 1Sexved + 23exe43 + x - 9 161 p> x = 3 D> OT — GHG + 1Sexved + 2Bexe43 + x - 9 Introduction au langage Python -357 px =4 o> OKT ~ GHKKKE + IS + 23H + x - 9 -2885 Néanmoins, on se doute bien qu'il y a un moyen de s'économiser ce bricola est tout a fait possible de définir une fonction (au sens du langage Python) qui ressemble a une fonction mathématique. La syntaxe est alors la suivante : S55 def f(x): return x«+7 - 6+x=¥6 + 15exexd + 234x413 + x - 9 pee (2), £(3), (4) # rép.: (161, -357, -2885) Observons de prés cette définition. Tout d’abord, la déclaration d’une nouvelle fonction com- mence par le mot-clé def. Ensuite, toujours sur la méme ligne, vient le nom de la fonction (ici) suivi du parametre formel® de la fonction, placé entre parentheses (le parametre formel x de la fonction Python correspond ici a la variable muette de la fonction mathématique), le tout ponctué de deux-points. Une fois la premiere ligne saisie, on appuie sur la touche « Entrée » et on constate que les chevrons de invite de commande ont été remplacés par des points. Cela signifie que I'in- terpréteur attend obligatoirement la suite des instructions. Il taut alors saisir quatre espaces pour les « indenter». Enfin, une ligne vide signifiera & l'interpréteur que la définition de notre fonction est terminée, et qu'il peut désormais lire la totalité du bloc d’instructions. Pour mieux comprendre les régles de définition de fonctions, donnons briévement en guise de bétisier trois erreurs a ne pas reproduire : >>> # ---> Erreur 1; U'oubli des deux points en fin de Ligne >e> def f(x) File "", line 1 def f(x) SyntaxError: invalid syntax >> # ---> Erreur 2: le non-respect de U' indentation >>> def f(x): cee Peturn x=47 - Gxx=46 + 1Sex=e4 + 230x003 + x - 9 File "", Line 2 return x«%7 - 6=x+46 + 15exxxd + 23=x443 + x - 9 IndentationError: expected an indented block pee # ---> Erreur 3: L'oubli du mot return be def f(x): xee7 = Gexee6 + 1Sexeed + 23exe03 + x - 9 >> £(2), £13), F(4) (None, None, None) 6. Les parametres figurant entre parentheses dans I'en-téte d'une fonction se nomment paramtres formels, par ‘opposition aux paramétres fournis lors de 'appel de la fonction appelés parambrres effectifi Programmation en Python pour les mathématiques Que s‘est-il passé dans la derniére tentative de définition de la fonction f? Tout simplement, au cours de l'exécution de la fonction f, expression x#+7-64x=*6+15#x#+44234x434x-9 est calculée, mais l'interpréteur, n’ayant pas recu l'instruction de renvoyer le résultat, la garde pour lui: il reste muet et se contente de renvoyer comme valeur l'objet None. D'aucuns pourraient étre tentés de remplacer l'instruction return par la fonction print que nous avons entrevue au tout début de ce chapitre. aos def f(x): print (xe*7 - Gexee6 + ISexeed + 23exe03 + x - 9) pp> £(2), £(3), F(4) 1g 113 55 (None, None, None) Voici un exemple de calcul qui nous permettra de mieux comprendre la différence fonda- mentale entre l'instruction return et la fonction print. Supposons que nous cherchions & calculer la somme des images de notre fonction f évaluée en certaines valeurs : ppp def f(x): return x+#7 - Gexv+6 + 1Sexeed + 23exen3 + x - 9 ppp £(2) + £(3) + £(4) 187 pep def f(x): Print (or - Gxcx6 + 1Sexxd + 23ex¥x3 + x - 9) pe> (2) + £(3) + £(4) 1g 13 Traceback (most recent call last): File "", line 1, in TypeError: unsupported operand type(s) for +: ‘NoneType' and ‘NoneType' Que se passe-t-il dans le deuxime cas? L’interpréteur affiche a ’écran la valeur de Pexpres- sion x=*7 - Guces6 + 1Sexe*4 + 234x043 + x - 9lorsqu'il rencontrela fonction print, mais ensuite, il ne renvoie aucun objet réutilisable ultérieurement, sinon toujours cet objet None qui résiste a toute tentative d’addition. En fait, la fonction print est utilisée pour son effet de bord. Lamorale de cette histoire, c'est qu'il vaut mieux éviter de prendre la mauvaise habitude d'uti- liser la fonction print al'intérieur des fonctions, sauf si c'est explicitement demandé. La plu- part des fonctions que nous utiliserons dans cet ouvrage seront des fonctions contenant dans, leur définition instruction return. Bien sdr, la fonction print est utile et sera utilisée, mais elle le sera surtout en dehors des fonctions, dans des suites d’instructions regroupées dans des fichiers appelés scripts. Une propriété remarquable de instruction return est qu'elle interrompt systématiquement Vexécution de la fonction. Des que l'interpréteur atteint l'instruction return qgchose, il ren- voie l'objet qqchose et abandonne aussitot aprés I'exécution de la fonction. Inutile donc de 1t Introduction au langage Python placer des instructions aprés un return : ces instructions ne seront jamais lues par linter- préteur. On parle parfois de code mort pour désigner les lignes qui suivent (2 'intérieur de la définition d'une fonction) linstruction return. >>> def mult_7(x): return 7 + x + print("Ceci ne s'affichera jamais") # c'est du code mort | return 0 # c'est encore du code mort !!! Autre fait notable lorsqu’on définit une fonction : les variables définies l'intérieur d’une fonction ne sont pas « visibles » depuis 'extérieur de la fonction ; elles correspondent aux va-~ riables muettes en mathématiques. Aussit6t l'exécution de la fonction terminée, l'interpré- teur efface toute trace des variables internes a la fonction. On exprime cela en disant qu'une telle variable est locale & la fonction. Dans I'exemple suivant, la variable x est une variable locale a la fonction : créée au cours de lexécution de la fonction f, elle est supprimée une fois I’exécution terminée. 35> def f(y): ce return y >e> (2) 2 >>> x Traceback (most recent call last): File "", line 1, in NameError: name 'x' is not defined Si une variable x existait déja avant l’exécution de la fonction, tout se passe comme si, du- rant l'exécution de f, cette variable était masquée momentanément, puis restituée a la fin de Vexécution de la fonction. a x= 0 >>> def f(y): xed return y >>> £(2) 2 >>> x 0 Dernier point avant de clore cette section : signalons qu'une fonction peut comporter autant de paramétres formels qu'on le souhaite (et éventuellement aucun) : >>> def ma_fonction(x, y): return x ¥ 2e+y 10 Programmation en Python pour les mathématiques 6 Instructions d’écriture et de lecture ‘Au fur et mesure de I'apprentissage du langage, on enchaine de plus en plus d’instructions. Si'on veut corriger une instruction dans une telle succession, on est obligé de saisir 4 nou- veau les instructions suivantes, De plus, on souhaite souvent enregistrer une telle suite par- ticuligre d'instructions pour pouvoir s'en resservir ultérieurement ou la modifier. D'ot la né- cessité de travailler avec des fichiers dans lesquels on place des suites d’instructions. Sous|'environnement Idle, il suffit d’ouvrirun fichier texte en choisissant entrée NewHindow dans le menu File ou en utilisant le raccourci Ctr1-N: on écrit alors directement dans le fi- chier des instructions; puis on sauvegarde son fichier sous un nom de la forme toto. py (le choix de I'extension py permettant de bénéficier de la coloration syntaxique) ; enfin la com- mande RunModule du menu Run vous permettra de lancer |’exécution du contenu de votre fichier dans la console Python. Ceux qui ont déja appris a se servir d’un éditeur de texte (comme Vim ou Emacs) préféreront écrire leurs scripts a l'aide d'un tel éditeur et exécuter leur script soit a l'aide d'un raccourci qu'ils auront défini, soit directement dans une console. Commengons par un exemple. Apres écriture du fichier suivant, exécutez-le: #!/usr/bin/python3 4-4. coding: Utf-8 -*- > No Subprocess x= 28 x Déception... rien ne s'affiche. En fait, le comportement de linterpréteur différe légerement suivant que l'on travaille dans une console Python ou dans un fichier texte. En effet, lorsque l'interpréteur lit un fichier texte, il effectue les instructions les unes a la suite des autres, mais il n’affiche rien tant que cela ne lui est pas demandé explicitement. D’oii, dans le fichier précédent, la nécessité de rajouter la fonction print sil’on souhaite voir safficher la valeur de la variable x. Du reste, c’est a partir du moment ott ’on écrit des scripts dans des fichiers que l'utilisation de la fonction print prend tout son intérét. #!/usr/bin/python3 No Subprocess #-4- coding: Utf-8 -*- a x= 248 256 print (x) bee Dans le fichier précédent, nous avons placé deux lignes qui, pour étre facultatives, n’en res- tent pas moins énigmatiques pour un débutant la premiere, dite ligne de «shebang», précise oi est I'interpréteur? a utiliser pour exécuter le fichier. Les utilisateurs de syst@mes d’ex- ploitation Linux ou MacOS pourront alors exécuter ce script dans un Terminal en saisissant : ./toto.py aussi bien que python3 toto. py 7. Dans un terminal, taper which python3 pour connaitre I'adresse absolue de 'exécutable. Introduction au langage Python i Terminal) $ python3 toto.py 256 $ chmod u+x toto.py # nécessaire pour accorder le droit d'exécution $ ./toto.py 256 Parfois, il arrive que I’on souhaite exécuter un script, puis passer dans la foulée en mode in- teractif: il suffit d’ajouter Poption -i $ python3 -i monfichier. py La deuxigme ligne du fichier source précise I'encodage, c’est-a-dire le format de codage des caractéres utilisé dans votre fichier texte. La encore cette ligne est facultative, mais elle aug- mente la portabilité de vos programmes d'un systéme d' exploitation a un autre, Suivant que votre systéme d’exploitation utilise par défaut l’encodage Latin-1 ou l'encodage Utf-8 (cette derniére norme étant fortement recommandée), utilise # coding + Latin-1 out coding : Utf-8 -x- Dorénavant, par souci de gain de place, nous ne mentionnerons plus ces deux lignes. Maintenant que nous savons exécuter une suite d’instructions dans un fichier, revenons un instant sur indentation dans la définition d'une fonction, Ecrivez dans des fichiers les deux scripts suivants, et prévoyez.le déroulement de leur exécution, puis vérifiez en les exécutant : def TQ): def TO: print('Hello') print(‘HeLto') print (‘Bonjour’) print(‘Bonjour*) £0) 10 Arrétons-nous quelques instants sur la fonction décriture print. Cette fonction comporte de nombreuses options qui permettent de personnaliser la présentation des données : x, y = 3, 1090000000 No Subprocess z = 3.1416 >>> print(x, y, 310000000003.1416 print(x, y, 3; 1999000000; 3.1416 print(x, y, 3 Print(*x=", 190000000 print(‘y=", 3.1416 print(‘z=", 1900000000; 2=3.1416 Bien que n'ayant pas encore parlé des chaines de caractéres, nous les avons déja employées au détour de nos exemples, commencer par le fameux print("helLo" ). Une chaine de carac- tres (C'est-a-dire un objet de type string) est une succession de caractéres typographiques 12 Programmation en Python pour les mathématiques de longueur quelconque, délimitée par de simples « quotes » (apostrophes) ou des doubles «quotes» (guillemets). Les triples guillemets permettent d’inclure des retours la ligne a’in- térieur de la chaine. print('-> Tei on peut employer des "guittemets™ 1°) print("-> Ici on peut employer des ‘apostrophes’ !") print("""-> Voici un saut... ge ligne,""") print("-> On peut aussi\n passer a la Ligne ainsi.") -> Ici on peut employer des "guillenets" | -> Ici on peut employer des ‘apostrophes’ ! -> Voici un saut. de Ligne. => On peut aussi passer 8 la Ligne ainsi. Pour disposer sur plusieurs lignes une chaine de caractére un peu longue dans un fichier de script, il est déconseillé d’utiliser une contre-oblique ; la syntaxe suivante est préférable® : print('-> Comment couper une Ligne * “trop longue dans le fichier source ?') -> Comment couper une ligne trop longue dans le fichier source ? Laméthode format de l'objet string est un out tres puissant permettant de créer des chaines de caractéres en remplagant certains champs (entre accolades) par des valeurs (passées en ar- gument dela fonction format) aprés conversion de celles-ci. On peut préciser a lintérieur de chaque accolade un code de conve: si que le gabarit d’affichage. Donnons quelques exemples. bee x = 1037.123456789 p> '{:g}'.format(x) # choisit le format le plus approprié *1,04e+03" pop '{:.3f}' format (x) # fixe Le nombre de décinales *1037.123" >>> '{:.3e}' format(x) # notation scientifique *1,037e+03" >>> 1{0:20.3f}'.format(x) # précise la Longueur de la chaine i 1037123" >>> '{0:>20.3f}' format (x) # justifié a droite G 1037.123" pep 1{0:<20.3f}' format (x) # justifié 4 gauche *1037.123, ; >o> '{0:°20.3f}' format (x) # centré Q 1037..123 : pee '{0:+.3f} ; {1:+.3f}' format(x, -x) # affiche toujours le signe "41037.123 ; -1037,123" pee 0: .3f} ; (1: .3f}'.format(x, -x) # affiche un espace si x6 8. Pourplus de détails, cf la derniére section de http: //docs. python .org/release/3.1.3/howto/doanddont . html Introduction au langage Python 13 * 1037.123 ; -1037.123' pep '{0:-.3f} ; (1:-.3f}' format(x, -x) # équivaut 3 '{0:.3f}" *1037.123 ; -1037.123" Pour une description detaillée de la méthode Tormat, on renvoie a la documentation de Py- thon: http: //docs. python.org/py3k/Library/string.html Apres l'instruction d’écriture print qui permet A un programme en cours d’exécution d'affi- cher certains résultats, passons maintenant a linstruction de lecture input qui permet, en sens inverse, de demander & l'utilisateur de fournir des données au programme en cours dexécution. Soit a écrire un petit script qui demande a l'utilisateur de fournir un nombre, qui 'affecte a la variable x, et qui renvoie le carré de ce nombre. x = input (‘Entrez une valeur pour 1a variable x :*) print("(}*2 = {}".format(x, x#*2)) Entrez une valeur pour la variable x :3 Traceback (most recent call last): File “test.py", Line 5, in print ("{}°2 = ()".format(x, x##2)) TypeError: unsupported operand type(s) for ** or pow(): str’ and ‘int Déception, notre tentative échoue : on remarque que la valeur 3 a pourtant bel et bien été récupérée par le programme et que la variable x semble contenir lentier 3. Or il n’en est rien. Ce que contient la variable x, c'est la chaine de caractéres "3". Et une chaine de caractére ne peut étre élevée au carré. D’oit la nécessité de parler t6t ou tard du type d'un objet... Sans trop entrer dans les détails du fonctionnement d'un ordinateur, rappelons que toute information, et en particulier le contenu d’une variable, doivent étre codés en binaire. Mais le « dictionnaire » pour coder ou décoder le contenu d'une variable ne sera pas le méme suivant que l'on a affaire 4 un en- tier, un nombre en notation scientifique ou une chaine de caractéres. Dans ces conditions, la connaissance du contenu binaire d'une variable ne suffit pas pour déterminer l'informa- tion correspondante. Il est nécessaire de savoir, en outre, comment la valeur qui s'y trouve est codée. Cette distinction correspond a la notion de type. Pour connaitre le type d'un objet, nous avons déja vu qu'on disposait de la fonction type : >>> type(3), type("3"), type(x) (, , ) Ainsi 3 est du type entier (int étant 'abréviation du mot « integer»), tandis que "3" est du type chaine de caractéres (str étant l'abréviation du mot «string »). Pour rendre notre script fonctionnel, il est alors nécessaire de faire appel a la fonction eval qui évalue l'expression représentée par une chaine de caracteres. x = eval (input( ‘Entrez une valeur pour la variable x :")) print("{}°2 = {}".format(x, x**2)) Entrez une valeur pour la variable x :3 32 =9 14 Programmation en Python pour les mathématiques Un peu dans le méme ordre d’idées, citons la fonction exec qui permet d’exécuter une ins- truction représentée par une chaine de caracteres, Donnons un petit exemple sans le détailler (pour se mettre en appétit, il fait apparaitre le mo- dule math qui permet d’ importer les fonctions mathématiques usuelles, ainsi que certaines constantes usuelles comme le nombre m). from math import + x = eval (input (' fonction = input(* code = ("def f(x “return {}*.format(fonction)) exec (code) print('{:.6f}'. format(f(x))) 2) x=2pi/4 'sin(x) 0.797107 Pour terminer cette section, oi nous avons appris & écrire de petits scripts dans des fichiers, signalons quiil est bon de prendre tout de suite 'habitude de bien présenter son code en Py- thon selon les conventions suivantes : ~ taille des indentations : 4 espaces; ~ taille maximale d’une ligne : 79 caracteres; toujours placer un espace aprés une virgule, un point-virgule ou deux-points (sauf pour la syntaxe des tranches) ; ~ ne jamais placer d’espace avant une virgule, un point-virgule ou deux-points; ~ toujours placer un espace de chaque cAté d’un opérateur; ne pas placer d’espace entre le nom dune fonction et sa liste d’arguments. # Déconseillé # Conseillé def f(x): def f(x): return 1 return 1 xel 5 y=2iz = 3 x= y=2; 2=3 XY 12 x,y, 2 f (2) f(z) Pour plus de précisions, on se reportera au lien suivant : http: //docs .python.org/py3k/ tutorial/controlflow. html#intermezzo-coding-style 7 La structure conditionnelle tions dé Supposons que nous souh: ir la fonction valeur absolue : |x| { Nous devons alors utiliser une instruction qui opére une disjon En Python, il s'agit de instruction de choix introduite par le mot-clé if. La syntaxe est alors la suivante: n de cas. Introduction au langage Python 15 def vabs (x): print('f({})=(' format (2, vabs(2))) if x >= 0: print('f({})=(' format (-2, vabs(-2))) return x else: return -x £(2)=2 #(-2)=2 Observonsla syntaxe de la structure de choix if. Tout d’abord, le mot if est suivi d'une condi- tion de choix : quel est l'objet renvoyé par linterpréteur lorsqu’il évalue cette condition? p> 2220 # rép.: True >>> b= 2>=0 >>> b, id(b), type(b) # rép.: (True, 137909620, ) La condition «2 >= 0» est d'un type que nous n’avons pas encore rencontré, a savoir le type booléen®. Une variable booléenne ne peut prendre que deux valeurs : True (vrai) ou False (faux). La condition de choix est vérifiée quand I’évaluation de cette condition renvoie le booléen True et l'interpréteur exécute alors la suite d'instructions qui se trouve dans le premier bloc d'instructions. Dans le cas contraire l'interpréteur saute au bloc d’instructions situé aprés le mot-clé else et délimité par I'indentation. II faut bien noter le rdle essentiel de I'indentation qui permet de délimiter chaque bloc d’ins- tructions et la présence des deux points aprés la condition du choix et aprés le mot clé else. Attardons-nous quelques instants sur les booléens. Pour obtenir une variable booléenne, on utilise en général, comme dans l'exemple précédent, un ou plusieurs opérateurs de comparai- son. Ces opérateurs sont au nombre de huit xest égal ay x est différent de y x est strictement supérieur a y x est strictement inférieur a y x est supérieur ou égal ay xest inférieur ou égal ay id(x) == id(y) x appartient a y (voir le type List) x««K«<<«xK ® Il faut bien distinguer instruction d'affectation «=» du symbole de comparaison « Pour exprimer des conditions complexes (par exemple x > ~2 et x° <5), on peut combiner des variables booléennes en utilisant les trois opérateurs booléens (par ordre de priorité crois- sante) : or (ou), and (e0, et not (non). Noter que Python, contrairement a beaucoup de langages, offre aussi quelques raccourcis syntaxiques agréables comme : (x x= +1 >o> (x > -2) and (xe*2 <5) # rép.: True >>> (x <= -2) or (xex2 > 5) # rép.: False pee not(x >= -2) # rép.: False por -2=9 else -x En algorithmique, il est assez. fréquent que Von ait @ enchainer des disjonctions de cas. Au lieu d’utiliser des choix imbriqués, on peut présenter cet enchainement en une succession de choix, cette deuxidme rédaction représentant alors une alternative syntaxique plus agréable. Notons une fois de plus combien Python offre des facilités de syntaxe qui en font un langage pertinent pour l'apprentissage de la programmation. lustrons ces deux possibilités pour définir une fonction qui prend en argument trois nombres a, bet c et qui affiche une phrase indiquant le nombre de solutions réelles de ’équation du second degré ax? + bx+c=0. def nbre solutions(a, b, c): if a= 0: print(*L'équation est du premier degré else: delta = bes2 - deacc if delta > 0: print(*L'équation posséde deux solutions réelles.") els if delta == 0: print("L'équation posséde une solution réelle.") else: print(*L'équation ne posséde pas de solution réelle.") def nbre_solutions(a, b, c): delta = be#2 - dvaxc Introduction au langage Python 7 if a= 0: print("L'équation est du premier degré.") elif delta > 0 print("L'équation posséde deux solutions réeLles.") elif delta == 0: print("L'équation posséde une solution réelle.") else print("L'équation ne posséde pas de solution réeLle.") Dans la succession de choix, le mot-clé eLif est une abréviation pour else if. Le principal intérét de la deuxidme syntaxe est surtout que les différents résultats potentiellement ren- voyés par la fonction apparaissent avec le méme décalage d’indentation, d’ott une syntaxe plus lisible Exercice 1. Ecrire une fonction max2 qui renvoie le plus grand des deux nombres x et y Construire une fonction max3 qui calcule le maximum de 3 nombres Solution. def max2(a, b): def max3(a, b, c): if a Ni return n. navel Evidemment, 'apparence de cette boucle est paradoxale car la condition de la boucle while ne varie jamais, et on pourrait avoir l'impression qu’elle ne va jamais se terminer; mais c'est sans compter sur la possibilité de sortir en force des boucles par renvoi du résultat d'une fonction (grace au mot-clé return). 10. Pour interrompre un programme (mal concu) qui ne se termine pas, on utilise la combinaison de touches ctrl-c. Introduction au langage Python 19 Exercice 3. @) Ecrire une fonction somme(n) qui renvoie la somme des carrés des n premiers entiers. b) Ecrire une fonction depasse(M) qui, pour tout entier M. renvoie le plus petit entier n tel que 1242? 4-4? =M. Solution. def sonme(n): def depasse(m): s,i=0,0 s,i=0,0 while i 0 return None a, b=b, reste(a, b) while a >= b: return a aza-b return a Remarquons que dans les affectations paralléles a, sont simultanées et non successives. b, reste(a, b), les affectations Avant de nous intéresser aux répétitions inconditionnelles, nous aurons besoin d’introduire lanotion de liste. 9 Les listes Des que l'on commence & manipuler un certains nombre de données, la notion de variable numérique s avere insuffisante. Imaginons que l'on souhaite placer en mémoire les notes des Gloves d'une classe en vue de déterminer la moyenne, I'écart-type et la médiane de cette série de notes. Une solution naive consisterait 4 définir pour chaque éleve une variable contenant sa note. Méme pour une classe d’une trentaine d’éléves, il serait fastidieux de définir une tren- taine de variables : 1, n2, n3,n4, etc. puis de calculer la moyenne avec une formule comme celle-ci:moy = (nl + n2 +---+ 30) / 30 On voit combien il serait avantageux d’attribuer a une seule variable l'ensemble des notes, chaque note étant repérée par un indice. En Python, la structure de données qui va nous sortir d’affaire s'appelle une liste. ppp Liste = [‘2nde3", 12, 12.23, 18, 7, 15] >> Liste, id(liste), type(Liste) ({'2nde3*, 12, 12.23, 18, 7, 15], 3072088364, ) Comme on le voit dans I'exemple précédent, une liste est une séquence d’éléments, rangés dans un certain ordre; de plus, en Python, une liste n’est pas nécessairement homogene : elle peut contenir des objets de types différents les uns des autres, La premiére manipulation que I’on a besoin d’effectuer sur une liste, c'est d’en extraire un élément : la syntaxe est alors Liste[indice]. Par exemple, cherchons a extraire un élément de notre liste: pep Liste = [12, 11, 18, 7, 15, 3]; Liste[2] # rép.: 18 Le résultat peut surprendre : on aurait peut-étre attendu comme réponse 11 au lieu de 18. En fait, les éléments d'une liste sont indexés @ partir de Oet non de 1. Introduction au langage Python 21 boo liste = [12, 11, 18, 7, 15, 3] >e> Liste[6], liste[1], Liste[2], liste(3], Liste[4], liste(5] (22, 11, 18, 7, 15, 3) >>> Liste[6] Traceback (most recent call last): File " IndexError: List index out of range Sion tente d’extraire un élément avec un indice dépassant la taille de la liste, le message erreur «IndexError: List index out of range» est renvoyé. On peut extraire une sous-liste en déclarant l'indice de début et Vindice de fin, séparés par deux-points. Cette opération est connue sous le nom de tranchage (slicing en anglais), ou encore « saucissonnage » (most frenchy!).. Essayons d'extraire la sous-liste comprenant le troisiéme, le quatriéme et le cinquiéme élé- ment: 35> Listel2:4] # rép.: (18, 7] Encore une fois, le résultat n’est peut-etre pas tout a fait celui que l'on attendait. En fait, pour bien comprendre les techniques de saucissonnage, il faut penser les indices comme repé- rant non pas les tranches de saucisson, mais les coups d’opinel qui ont permis de couper les tanches (en partant évidemment de 0 pour Pentame). 6 oy, } Remarquez que l'on peut méme se servir d’indices négatifs. A présent, les résultats suivants doivent devenir limpides : >>> Liste[2:] >>> liste[2:7] (18, 7, 15, 3] (18, 7, 15, 3) >>> Listel:2] >>> liste[-2:-4] (22, 11) 0 >>> Liste[0:len(liste)] >>> liste[-4:-2] (22, 11, 18, 7, 15, 3] 8, 71 pee Listel:] # le méme en mieux >>> Liste[Len(Liste) -1] {22, 11, 18, 7, 15, 3] 3 >>> Listel2:5] >>> liste[-1] # le méme en mieux (18, 7, 15] 3 Pour extraire le dernier élément d'une liste, l'instruction Liste -1] remplace avantageuse- ment l'instruction Liste[len(Liste) -1]! Anoter que lorsqu’on utilise des tranches, les dépassements indices sont licites. A présent, examinons out sont rangés les éléments d’une liste. 22 Programmation en Python pour les mathématiques S55 liste = [12, ‘un’, 3.14] >>> liste, id(liste), type(liste) ({12, ‘un’, 3.14], 3073241260, ) >o> Liste[0], id(Liste[0]), type(Liste[o]) (12, 137180912, ) >>> liste[1], id(Liste[1]), type(Liste(1]) Cun", 3073227360, ) >e> iste[2], id(Liste[2]), type(Liste(2]) (3.14, 164411812, ) On constate done qu’une liste fonctionne comme un carnet d’adresses qui contient les em- placements en mémoire des différents éléments de la liste. En Python, les listes sont des objets modifiables", c’est-a-dire qu’on peut modifier un ou. plusieurs éléments de la liste. pop Liste[1] = 28 >o> Liste, id(Liste), type(Liste) ((22, 256, 3.14], 3073241260, ) >>> Liste[0], id(Liste[o]), type(tiste(o]) (12, 137180912, ) >o> Liste[1], id(liste[1]), type(Liste(1]) (256, 137184816, ) >>> Liste[2], id(liste[2]), type(Liste(2]) (3.14, 164411812, ) 11, On parle aussi d’objet mutable: un tel objet peut changer de valeur sans changer d’identifiant! Introduction au langage Python 23 Remarquez bien que la liste n'a pas changé d’identifiant. Autrement dit, la liste Liste est le méme objet que précédemment, on en a seulement modifié la valeur Les techniques de saucissonnage peuvent étre utilisées pour les modifications de listes, comme Je montrent les exemples suivants. pee Liste = [12, 11, 18, 7, 15, 3] >>> Liste[2:5] = ['a", 'b', ‘c'] >>> liste [a2 yey ub etch >>> Liste = [12, 11, 18, 7, 15, 3] >>> Liste[2:5] = ['a', Tou >>> Liste [oz cn >>> Liste[2:5] = [109, 200] >>> liste [22, 11, 100, 200, 3] >>> Liste[2:4] = ['un', ‘deux’, ‘trois’, ‘quatre'] >>> liste (22, 11, ‘un’, ‘deux', 'trois', ‘quatre’, 3] Hest assez fréquent de copier des listes. Mais la encore, Python nous réserve quelques sur- prises... >e> Liste = [12, ‘un’, 3.14] >>> copie = Liste >>> Liste[@] = 108 # modification de l'objet Liste >e> liste, copie ({199, ‘un*, 3.14], (160, ‘un’, 3.14]) >>> copie[1] = ‘ah ?' # modification de l'objet copie >>> liste, copie ({109, ‘ah ?*, 3.14], (108, ‘ah 7", 3.14]) Pour bien comp! ndre ce qui s'est passé, examinons une fois de plus les identifiants : >>> liste, id(Liste), type(liste) ((12, ‘un', 3.14], 3071856812, ) 24 Programmation en Python pour les mathématiques 55> copie, id(copie), type(copie) ({12, ‘un’, 3.14], 3071856812, ) En fait, nous avons créé un nouvel alias nommé copie pour notre liste. Autrement dit, les variables Liste et copie « pointent» vers le meme objet. Ainsi, lorsqu'on modifie la valeur de Vobjet, la modification sera visible depuis les deux alias! Ce mécanisme a été implémenté par les développeurs de Python dans un souci évident d’optimisation de la mémoire. Mais alors, cela signifie-t-il qu’on ne pourra pas copier une liste en obtenant un objet distinct et indépendant de la liste copiée pour, par exemple, modifier la nouvelle liste tout en gardant en mémoire une copie de la version de départ? Evidemment, cette possibilité existe, mais il faut alors extraire de la liste la sous-liste en enter, avant de la réaffecter & une autre variable, Comme on I’a vu, extraire toute la liste d’une liste se fait avec l'écriture Liste[: ] et on écrira alors copie = listel:] # équivaut en fait & L'instruction : >>> copie list(Liste) Dans ce cas, Python effectue une copie superficielle de la liste (en anglais, shallow copy). En fait, ce ne sont pas les objets eux-mémes qui sont copiés, mais les pointeurs vers les objets copiés. D’oit le nom de copie de références (ou copie de pointeurs) encore donné a ce type de copie. >>> copie = Ustef:] >>> liste[0] = 100 >o> liste, copie ({100, ‘un', 3.14], [12, ‘un’, 3.14]) >>> copie[1] = ‘ah ?' >>> liste, copie ({100, ‘un', 3.14], [12, ‘ah ?', 3,14]) >>> Liste, id(liste), type(Liste) ({100, ‘un’, 3.14], 3071843148, ) >>> copie, id(copie), type(copie) ((22, ‘ah 2", 3.14], 3071859884, ) Création d’un alias : >>> copie=Liste | Copie superficielle : >>> copie=listel:] “o71eso612

Vous aimerez peut-être aussi