Cours Python 2.1 2013/2014 1 Introduction Le langage Python est un langage développé à partir de 1990 par Guido van Rossum. Il doit son nom aux Monty Python dont Van Rossum était fan. C’est un langage multi-paradigme (impératif, objet, fonctionnel) et 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. Il est sous licence libre. Il a été conçu pour être très lisible, et notamment l’indentation permet de délimiter les blocs, au lieu d’utiliser des accolades comme en C ou Java. Pour utiliser un langage de programmation confortablement, on a besoin de ce que l’on appelle un environnement de développement. Nous utiliserons , Pyzo. Il permet d’éditer des programmes, de les sauvegarder, de les exécuter, il est multi-plateforme et gratuit. 2 Saisir, exécuter, observer On peut « communiquer » avec l’interpréteur Python de deux manières di↵érentes. 2.1 Le mode interactif direct On tape des instructions dans le « shell » et on valide pour obtenir la réponse : 1 2 3 >>> <Ma commande> <Sa réponse !> >>> <--- il attend une nouvelle commande Quelques exemples : 1 2 3 4 6 >>> 42**42 15013093754529657235677197216425445781404797056873 8777235893533016064 >>> id(sqrt(2)) >>> import math ; math.sqrt(12) # on doit inclure l’instruction " import math" pour pouvoir faire appel aux fonctions mathématiques qu’il faut "pointer" avec le préfixe math 1 Remarque 1 On peut aussi utiliser l’instruction from math import * pour importer toutes les fonctions mathématiques disponibles. Le mode scripting : « Programming is Hard, Let’s Go Scripting... » 2.2 On saisit les instructions dans un fichier et on exécute tout ou une partie des ces instructions. Dans le « shell » on voit les sorties et les commentaires de l’interprèteur. On l’utilise pour des programmes plus longs et que l’on souhaite enregistrer, le plus souvent. 3 Des classes, des objets à définir et à manipuler Le langage Python est orienté objets. Les expressions que l’on utilise désignent des objets qui appartiennent à des classes, c’est à dire des familles nommées. Certaines de ces classes sont définies par défaut, d’autres dans des modules qu’il faut charger. Les utilisateurs peuvent aussi définir leurs propres classes et aussi leurs modules. Étudions quelques classes des plus utilisées. 3.1 Les types ou classes de nombres Il s’agit d’objets prédéfinis et non modifiables. Ils sont regroupés en plusieurs classes. Des entiers, la classe int 3.1.1 Cette classe représente les entiers relatifs. En Python 3, il n’y a quasiment pas de limite à la représentation des entiers comme vous avez pu le voir dans le TD1. Les principales opérations sur les entiers : + : addition / : division - : soustraction // : division entière * : multiplication % : modulo ** : exponentiation abs : valeur absolue 1 >>> type(-12) # la fonction type retourne le type i.e. la classe d’ un objet 3 >>> type(12/5)==’int’ 5 >>> 5//3 ;type(5//3)) # // division entière 7 >>> Les booléens, la classe bool 3.1.2 Cette classe contient 2 objets, True (1) et False (0). C’est une sous classe de la classe int. Donc tout les opérateurs que l’on a vu précédemment peuvent s’utiliser sur les booléens. 1 >>> 2==3 3 >>> True+False Les opérateurs de cette classe sont les suivants : and (et), or (ou) et not (non). 2 1 >>> True and False 3 >>> True or False 5 >>> not(True+True) Des décimaux, la classe float 3.1.3 Un float est noté avec un point décimal (jamais avec une virgule ) ou en notation exponentielle. Il représente une nombre décimal compris entre ≠1, 7 ◊ 10308 et 1, 7 ◊ 10308 . Les flottants supportent les mêmes opérations que les entiers. 1 >>> 3.14 ;123e-12 4 >>> type(-12/5) 6 >>> b=42**4.2 >>> type(b) 7 9 >>> 5.1.is_integer() #il s’agit d’une méthode de l’objet : objet. méthode Remarque 2 (Les limites de la représentation des réels en virgule flottante) 1 >>> 0.1+0.2-0.3 Ce problème vient de la représentation des réels en virgule flottante. On a aussi des erreurs du type : 1 >>> 1e10+1e-10==1e10 Des nombres complexes, la classe complex 3.1.4 La classe complex permet de travailler avec des nombres complexes . Ces objets supportent les mêmes opérations que les entiers, sauf la division entière. 1 >>> (2+2j)*1j 3 >>> (-2+2j)/(3-2j) 5 >>> (-2-1.5j).real 7 >>> ((1+2j)**2).conjugate() 3 Avant d’aller plus loin : attributs et méthodes d’une classe ... L’une des spécificités de la programmation orientée objets, c’est l’encapsulation. C’est à dire que lorsque on définit une classe d’objets, on définit les attributs et les méthodes de la classe. Par exemple, un objet de type complexe possède les attributs real et imag. Ces attributs sont de type float. Un objet possède aussi des méthodes qui e↵ectuent des actions en utilisant cet objet. Par exemple la méthode conjugate qui s’utilise comme dans l’exemple précédent. Mais on a vu aussi que l’on peut appliquer des fonctions aux objets. Celles ci ne font pas partie de la définition de la classe. ... et les variables ou références d’objets Pour accéder plus simplement aux objets, Python utilise la notion de variable ou de référence d’objet. Pour définir une variable on utilise l’a↵ectation : 1 <la variable> = <un identificateur d’objet> La variable n’est pas l’objet mais elle référence l’objet en contenant l’identificateur de l’objet. Tant qu’une nouvelle a↵ectation n’est pas réalisée, elle référence toujours le même objet. Essayer ceci : 1 >>> a=2 3 >>> id(a) ;id(2) 5 >>> b=a ;b=3 ; 7 >>> id(a) ;id(b) ;id(3) ;id(2) Dans les définitions et exemples de ce document le mot « objet » pourra parfois être remplacé « référence d’objet ». On vérifiera que c’est possible. 3.2 Les chaı̂nes de caractères, la classe str Les objets de type str sont identifiés par une suite finie de caractères délimitée par des apostrophes ou des guillemets. Ces objets ne sont pas modifiables. Les caractères de l’objet str sont numérotés à partir de 0 de gauche à droite dans l’ordre croissant et à partir de ≠1 de droite à gauche dans l’ordre décroissant. Saisissez les lignes suivantes dans un fichier de l’éditeur. 4 3.3 1 a=’MPSI’ ’3’ ; print(a) 3 print(type(a)) 5 b=’Alors là je dis "OUI" !’ 7 c=’et je redis :\n 9 print(b,c) "OUI" !’ 11 a=’Lycée ’+’THIERS’ 13 print(a[7 :]) # 1er caractère inclus : 1er caractère exclus 15 print(a[-4 :-1]) 17 print(len(’MPSI 3’),’MPSI 3’[ :],’MPSI 3’>’MPSI 2’) Des séquences : listes et tuples La classe list 3.3.1 L’un des types les plus utilisés en Python est la liste d’objets. Les listes peuvent comporter des objets de types di↵érents. On définit une liste en énumérant, entre deux crochets, ses éléments séparés par des virgules. Les listes sont des objets modifiables ! Saisissez les lignes suivantes dans une cellule d’un fichier de l’éditeur. 1 a=[1, ’A’,[2]] 3 print(type(a)) 5 print(type(a[2])) 7 b=a ; print(b,id(b)) 9 a.append(True) 11 print(a, b,id(b)) On accède aux éléments d’une liste comme aux caractères d’une chaine et on coupe les listes avec la même syntaxe que celle utilisée pour les chaı̂nes. 3.3.2 La classe tuple Elle est très similaire à la classe liste à ceci près que ses éléments ne sont pas modifiables. Pour définir un tuple on remplace les crochets des listes par des parenthèses. Tester : 5 1 a=(1, ’A’,[2]) 3 print(type(a)) 5 print(type(a[2])) 7 b=a ; print(b,len(b),id(b)) 9 a=a+(True,) 11 print(a, b,id (a),id(b)) Les éléments d’un tuple sont indexés comme les éléments d’une liste et on peut sélectionner une partie d’un tuple avec la même syntaxe que celle utilisée pour les listes. 4 4.1 Les instructions Les instructions conditionnelles Pour réaliser une action lorsque une condition est réalisée et, sinon, ne rien faire sinon ou faire une autre action, il existe une instruction. En fait plusieurs instructions. Voici les formes générales de ces instructions : 1 2 1 2 3 4 1 2 3 4 5 6 if <un objet> : <un bloc d’instructions> if <un objet> : <un bloc d’instructions> else : <un bloc d’instructions> if <un objet> : <un bloc d’instructions> elif <un objet> : <un bloc d’instructions> else : <un bloc d’instructions> On peut enchaı̂ner plusieurs elif mais il ne sont suivis que d’un seul else. Compléter le script suivant pour qu’il affiche le nombre de solutions réelles de l’équation ax2 + bx + c = 0. 1 a=float(input(’a=’)) ; b=float(input(’b=’)) ; c=float(input(’c=’)) 3 if b*b-4*a*c > 0 : 6 4.2 La boucle for Elle permet de répéter des actions similaires un nombre de fois déterminé à l’avance. Voici sa forme générale : 1 2 for <une référence d’objet> in <un bloc d’instruction> <un objet itérable> : Remarque 3 L’expression : <une référence d’objet> in <un objet itérable>, est un booléen qui peut être utilisée en dehors d’une boucle for pour savoir si l’objet apparaı̂t dans l’itérable. On a déjà étudié trois classes d’objets itérables : les chaı̂nes de caractères, les listes et les tuples. Une quatrième classe d’itérables, la classe range est très utile lorsqu’on écrit des boucles. On verra qu’il en existe d’autres. Essayer : 1 2 4 5 8 9 11 12 13 14 16 17 18 19 21 22 23 24 25 26 4.3 for i in range(1,10,2) : # valeur initiale, 1ère valeur exclue , pas print(i%2) for i in range(10,1,-2) : print(i%2) for a in ’une boucle’ : print(a) a=[1,3,5,7,11] for k in a : print(a*a) print(a) a=(1,2,3,4) for k in a : a=a+(k+1,) print(a) a=[1,2,3,4] for k in a : a.append(k+1) if k==10 : break print(a) La boucle while Elle permet d’e↵ectuer des instructions tant q’une condition est réalisée, plus généralement, tant qu’une expression est non nulle. 7 1 2 while <un objet> : <un bloc d’instruction> Essayer les boucles suivantes : 2 3 4 5 6 7 8 11 12 13 n=int(input(’n=’)) k=1 while (k*k+1)%n : k+=1 if k==n : break print(k) a=[1,’ab’, 3.1] while a : print(a.pop(0)) Remarque 4 L’instruction break permet de sortir de la boucle sans attendre la fin de celle-ci. L’instruction continue permet de passer à l’élément suivant de l’étirable en ignorant les instructions situées après celle-ci dans le bloc de la boucle. On utilise la méthode pop pour supprimer le premier élément de cette liste tout en retournant celui-ci. 4.4 Quelques exercices 1. Ecrire un script demandant à l’utilisateur d’entrer des entiers a et b, puis affichant le plus grand des deux. 2. Ecrire un script demandant à l’utilisateur d’entrer un nombre décimal x et affichant la distance de x à Z, c’est à dire |x ≠ n|, où n est l’entier le plus proche de x. 3. Ecrire un script demandant à l’utilisateur d’entrer des réels a, b et c et affichant le nombre de solutions réelles de l’équation ax2 + bx + c = 0. 4. Ecrire un script qui affiche la liste sans répétition des caractères d’une chaı̂ne saisie au clavier par l’utilisateur. 5. Ecrire un script demandant inlassablement à l’utilisateur d’entrer un entier, jusqu’à ce que celui-ci soit pair. 6. Ecrire un script qui vérifie si une chaı̂ne de caractères, saisie au clavier, comporte deux caractères consécutifs identiques. 7. Ecrire un script demandant à l’utilisateur d’entrer un entier strictement positif n, et affichant les diviseurs de n à raison d’un diviseur par ligne. 8. Ecrire un petit script que joue à “c’est plus ! c’est moins !” : L’ordinateur choisit secrètement un entier au hasard entre 0 et 50000 et l’utilisateur doit le trouver en un minimum de coups. A chaque réponse proposée, un message s’affiche, qui indique si le nombre à trouver est plus grand, plus petit ou encore si c’est le bon. A la fin, le nombre de coups est affiché. 8 5 Premier contact avec les fonctions Bien entendu, on souhaite pouvoir définir des objets Python pour modéliser, en particulier, des suites, des fonctions mathématiques. Voyons ce que Python nous propose. 5.1 La définition et l’appel Une fonction est un ensemble d’instructions regroupées sous un nom et que l’on exécute lorsqu’on en a besoin. Voici la définition générale d’une fonction en Python : 1 2 def <nom de la fonction><tuple de références d’objets> : <Bloc d’instructions> Le bloc d’instructions est obligatoire. Voici un exemple. Saisir les lignes suivantes dans l’éditeur et les exécuter. 1 2 def afficheDistance(x,y) : print(abs(x-y)) La fonction est alors définie. On peut maintenant l’appeler dans le shell ou dans un script. Essayer : 1 >>> afficheDistance(1+2j,3-3j) Les fonctions sont aussi des objets. Regardons ce que nous dit la fonction type. Taper les instructions suivantes dans le shell : 1 >>> type(afficheDistance) 3 >>> type(afficheDistance(2,3)) 5 >>> afficheDistance(2,3)==None Nous allons voir que l’expression d’appel d’une fonction peut être un objet du type que l’on souhaite. 5.2 Fonction avec retour : return ! Modifions la fonction précédente pour que, si x et y sont deux objets de type nombre, Distance(x,y) soit un objet du même type que x et y, précisément l’objet abs(x-y). Recopier les lignes suivantes : 1 2 3 5 6 7 d=0 def distance(x,y) : return abs(x-y) type(distance(2,3)) d=distance(1+2j,3-3j) type(d) 9 Pour que la fonction renvoie une valeur, il faut qu’une instruction du type return <objet> soit exécutée. Lorsque cette instruction est exécutée, l’exécution de la fonction se termine et l’objet situé après return est la valeur finale de fonction. Voici un autre exemple plus complexe : 1 2 3 4 5 6 7 def mediane(x,y,z) : if (x-y)*(x-z)<=0 : return x elif (y-x)*(y-z)<=0 : return y else return z Saisir l’instruction suivante : 1 >>> mediane(3,2.5,5) Les variables qui apparaissent après le nom de la fonction sont appelées paramètres formels de la fonctions. Les objets utilisés lors de l’appel de la fonction sont appelés paramètres e↵ectifs de la fonction. Exercice. 1. Écrire une fonction qui renvoie, si ¸ = [¸0 , ¸1 , ..., ¸n≠1 ] est une liste de nombres, la somme n≠1 ÿ (≠1)k ¸k . k=0 2. Écrire une fonction qui retourne le produit des éléments d’une liste passée en paramètre . 5.3 Que se passe-t-il lors de l’appel d’une fonction pour les paramètres formels ? Les variables correspondant aux paramètres formels sont crées et initialisées avec les valeurs des paramètres e↵ectifs. Les variables crées sont donc nouvelles et donc ne peuvent pas être utilisées pour modifier des variables globales mêmes si elles font partie des paramètres e↵ectifs. Voyons un exemple. Saisir le script suivant et observer : 1 (x,y)=(1,2) 3 7 def deplace(x,y) : if x<y : x=x+1 elif x>y : y=y+1 9 print(x,y) 4 5 6 Les variables x et y qui apparaissent dans la fonction sont di↵érentes des précédentes. On modifie donc des variables locales. Le seul moyen pour récupérer ces valeurs c’est de les renvoyer. Comment modifier la fonction et le script pour qu’ils a↵ectent les variables x et y ? 5.4 Les variables locales Toutes les variables qui sont définies pour la première fois dans une focntion n’existent que pendant l’exécution de la fonction. On dit que ces variables sont locales, par opposition aux autres variables, dites 10 globales, qui ont été définies en dehors des fonctions. Seuls les paramètres formels d’une fonction peuvent masquer des variables qui existaient avant l’exécution de la fonction. Il est bien entendu très maladroit de modifier une variable globale à l’intérieur d’une fonction. 5.5 Utiliser un paramètre tuple de manière transparente Ici, encore une fois, on va constater que le langage Python permet d’écrire des scripts élégants et plus universels que dans d’autres langages. Voyons comment. Ecrivons une fonction plusProche0(k,t) qui affiche la valeur du tuple de nombres la plus proche de k. Recopier cette focntion dans l’éditeur 1 2 3 4 5 6 def plusProche0(x,t) : d=abs(t[0]) for y in t[1 :] if abs(x-y)<d : d=abs(x-y) print(d) puis dans le shell, 1 >>> plusProche0(0,(-1,2,-3,4)) Pour ce type de fonction, Python propose une autre syntaxe : 1 2 3 4 5 6 def plusProche0(x,*t) : d=abs(t[0]) for y in t[1 :] : if abs(x-y)<d : d=abs(x-y) print(d) Cela évite les doubles parenthèses : 1 2 >>> plusProche0(0,-1,2,-3,4) >>> plusProche0(1,-1,2,1.5,3,2.1) Le tuple doit apparaı̂tre en dernier dans la suite des paramètres. 6 La « compréhension » des listes La définition des listes en compréhension permet de créer des listes correspondant à contraintes avec peu d’instructions. Deux syntaxe possibles : 1 [ <objet> for <objet> in <iterable>] 3 [ <objet> for <objet> in <iterable> if <objet>] 11 Essayer : 1 2 3 >>> [x+1 for x in range(10)] >>> [x for x in range(10) if x%2] >>> n=10 ; sum([ 1/k for k in range(n,2n+1)] On peut même utiliser plusieurs boucles. 1 2 7 >>> mot=’Hello’ >>> [x+y for x in mot if x !=’H’ for y in mot if y !=x] Exercices 1. Définir en compréhension, la liste des nombres impairs inférieurs à n. 2. Définir en compréhension, la liste des voyelles présentes dans une chaine. 3. Ecrire une fonction dist(x) qui renvoie la distance de x à Z, c’est à dire |x ≠ n|, où n est l’entier le plus proche de x. 4. Ecrire une fonction racinesTrinome(a,b,c) affichant les solutions réelles de l’équation ax2 + bx + c = 0. 5. Écrire une fonction qui retourne Application numérique : n = 1000. 2n ÿ 1 k k=n . Calculer cette somme pour n = 10. Idem pour 1 Ô . i + j 1Æi<jÆn ÿ 6. Ecrire une fonction affichant le plus grand élément en valeur absolue d’un tuple. 7. Ecrire une fonction qui supprimer les espaces d’une chaine et retourne la chaı̂ne ainsi obtenue. 8. Étant une liste de nombres réels [x0 , x1 , ..., xn≠1 ] et k œ Nú , on dit que (xi , xi+k ) est une alternance de signe si xi xi+k < 0 et tous les termes situés entre ces deux termes, s’il y en a, sont nuls. Écrire une fonction qui retourne le nombre d’alternance de signe de la liste. 9. Ecrire un script qui vérifie si une chaı̂ne de caractères, saisie au clavier, comporte deux caractères consécutifs identiques. 12