CSI2520 Un langage de programmation par scripting orienté-objet (et fonctionnel)
Langage de plus haut niveau ◦ Syntaxe simple Souvent interprété (byte code) Axé sur le développement rapide Très utile pour la programmation de contrôle ◦ Accès au système fichiers, etc. Typage dynamique ◦ Variable non-déclarée ◦ Erreur de typage détecté à l’exécution Riche en modules réutilisable CSI2520
Créé en 1991, en logiciel libre depuis 2000 ◦ Les versions 2.X et 3.X co-existent et ne sont pas complètement compatibles C’est avant tout un langage multi-paradigme Programmation très productive (3x à 10x) ◦ Facile à apprendre ◦ Prototypage rapide Encourage la réutilisation et le logiciel libre ◦ Beaucoup de modules disponibles En général, plus lent CSI2520
Un programme est composé de modules ◦ Créé dans un fichier texte ◦ Les changements de lignes et l’indentation a un signification définie Un module est composé d’énoncés ◦ Un module peut être importé dans un autre Un énoncé contient des expressions import math
Un module est un fichier texte contenant des instructions Python Le nom du fichier est le nom du module ◦ Extension.py ◦ Variable système PYTHONPATH CSI2520 >>> import fibo >>> fibo.fib(1000)
CSI2520 # fichier fibo.py def fib(n): # affiche la serie de Fibonacci jusqu’à n a, b = 0, 1 while b < n: print(b) a, b = b, a+b def fib2(n): # retourne la serie de Fibonacci jusqu’à n result = [] a, b = 0, 1 while b < n: result.append(b) a, b = b, a+b return result
CSI2520 >>> print('Bonjour les amis ! ') Bonjour les amis ! >>> >>> >>>
CSI2520 >>> y = 3.14 >>> y >>> a = "bonjour" >>> a 'bonjour' >>> b = 'salut' >>> b 'salut' >>> c = '''girafe''' >>> c 'girafe' >>> x = 45 >>> x >>> y = 2.5 >>> x + y 47.5 >>> (x * 10) / y >>> chaine = "Salut" >>> chaine 'Salut' >>> chaine + " Python" 'Salut Python' >>> chaine * 3 'SalutSalutSalut' >>> x = 2 >>> type(x) >>> x = 2.0 >>> type(x) >>> x = '2' >>> type(x) >>> 2** Les types ne sont pas déclarés ◦ Chaines de caractères Unicode Les variables sont des références à des objets ◦ Ramasse-miette
CSI2520 >>> animaux = ['girafe','tigre','singe','souris'] >>> animaux[1] 'tigre‘ >>> animaux[-2] 'singe' >>> tailles = [5, 2.5, 1.75, 0.15] >>> mixte = ['girafe', 5, 'souris', 0.15] >>> animaux ['girafe', 'tigre', 'singe', 'souris'] >>> tailles [5, 2.5, 1.75, 0.15] >>> mixte ['girafe', 5, 'souris', 0.15] Séquence de types mixtes
>>> animaux[0:2] ['girafe', 'tigre'] >>> animaux[0:3] ['girafe', 'tigre', 'singe'] >>> animaux[0:] ['girafe', 'tigre', 'singe', 'souris'] >>> animaux[:] ['girafe', 'tigre', 'singe', 'souris'] >>> animaux[1:] ['tigre', 'singe', 'souris'] >>> animaux[1:-1] ['tigre', 'singe'] >>> ani1 = ['girafe','tigre'] >>> ani2 = ['singe','souris'] >>> ani1 + ani2 ['girafe', 'tigre', 'singe', 'souris'] >>> ani1 * 3 ['girafe', 'tigre', 'girafe', 'tigre', 'girafe', 'tigre']
CSI2520 >>> a = [66.25, 333, 333, 1, ] >>> print( a.count(333), a.count(66.25), a.count('x')) >>> a.insert(2, -1) >>> a.append(333) >>> a [66.25, 333, -1, 333, 1, , 333] >>> a.index(333) 1 >>> a.remove(333) >>> a [66.25, -1, 333, 1, , 333] >>> a.reverse() >>> a [333, , 1, 333, -1, 66.25] >>> a.sort() >>> a [-1, 1, 66.25, 333, 333, ]
CSI2520 >>> squares = [x**2 for x in range(10)] >>> squares [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] >>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y] [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)] >>> vec = [[1,2,3], [4,5,6], [7,8,9]] >>> [num for elem in vec for num in elem] [1, 2, 3, 4, 5, 6, 7, 8, 9]
Les variables sont des références à des objets ◦ Affecter une liste à une variable ne créé pas de copie >>> listeA=[1,2,3] >>> listeB=['a','b',listeA,'c'] >>> listeC=listeB >>> listeD=listeB[:] # copie >>> listeC ['a', 'b', [1, 2, 3], 'c'] >>> listeD ['a', 'b', [1, 2, 3], 'c'] >>> listeA.remove(2) >>> listeC ['a', 'b', [1, 3], 'c'] >>> listeD ['a', 'b', [1, 3], 'c'] >>> listeB.insert(-1,'d') >>> listeC ['a', 'b', [1, 3], 'd', 'c'] >>> listeD ['a', 'b', [1, 3], 'c']
CSI2520 >>> tel = {'jack': 4098, 'sape': 4139} >>> tel['guido'] = 4127 >>> tel {'sape': 4139, 'guido': 4127, 'jack': 4098} >>> tel['jack'] 4098 >>> del tel['sape'] >>> tel['irv'] = 4127 >>> tel {'guido': 4127, 'irv': 4127, 'jack': 4098} >>> tel.keys() ['guido', 'irv', 'jack'] >>> 'guido' in tel True Séquence avec une relation clé,valeur
Séquences immuables >>> trois=(1,2,3) >>> cinq=trois+(4,5) >>> trois (1, 2, 3) >>> cinq (1, 2, 3, 4, 5) >>> trois[1] 2 >>> cinq.index(4) 3 >>> trois[1]=6 Traceback (most recent call last): File " ", line 1, in trois[1]=6 TypeError: 'tuple' object does not support item assignment
== teste l’équivalence is teste si c’est le même objet >>> listeA [1, 3] >>> listeX=[1,3] >>> listeY=listeA >>> listeA==listeX True >>> listeA is listeX False >>> listeA==listeY True >>> listeA is listeY True
Les affectations augmentées sont permises ◦ += -= *= /= etc. ◦ a = b = c = 2 Affectation à l’aide de tuples ◦ x, y = 3, 5 ◦ x, y = y, x # les expressions à droite sont évaluées d’abord Affectation de séquences ◦ a,b,c,d = 'Allo' ◦ x=[1,2,3,4,5] ◦ a,b,*c= x # c sera [3,4,5] ◦ a,*b,c= x # b sera [2,3,4]
CSI2520 if x < 0: x = 0 print('de négatif à zéro') elif x == 0: print 'zéro' elif (x == 1 or x == 10): print 'un-dix' else: print 'positif' L’indentation est obligatoire ◦ L’utilisation de 4 espaces est suggérée Les paranthèses ne sont requises que pour une expression sur plusieurs lignes La valeur 0, les objets vide et le None sont considérés comme faux Les expressions booléenne sont toujours court-circuitées Pas d’évaluations inutiles
CSI2520 >>> for i in [0,1,2,3]: print(i) >>> animaux = ['girafe', 'tigre', 'singe', 'souris'] >>> for a in animaux: for c in a: print(c) g i r a f e t i g r e s i n g e. >>> x=[1,2,3] >>> y=[9,8,7] >>> for (a,b,c) in (x,y): print(a,b,c) >>> for i in range(4): print(i)
>>> x=[1,2,3,4,5] >>> while x: if x[0] == 3: print('oui') break # passe par dessus le else x=x[1:] else: print('non') # a executer lorsqu’on sort du while oui >>> x [3, 4, 5] >>>
La fonction range retourne un iterable >>> it=range(10,50,5) >>> i=iter(it) >>> next(i) 10 >>> next(i) 15 >>> list(it) [10, 15, 20, 25, 30, 35, 40, 45]
While True: reponse= input('Un nombre svp: ') if reponse == 'stop' : break try: nombre= int(reponse) except: print('Erreur! ' * 2) else: print(num*num) print('Merci!')
En général, les fonctions sont utiles pour: ◦ Faciliter la réutilisation du code ◦ Minimiser les répétitions dans le code ◦ Décomposer les procédures en entités plus simples En Python, une fonction se définie avec le def ◦ def créé un objet et lui assigne un nom ◦ def est un énoncé exécutable La fonction n’existe pas tant que le def n’est pas exécuté def f(x): return x % 2 != 0 and x % 3 != 0 if user == 'advanced': def f(x): return x % 2 != 0 and x % 3 != 0 else: def f(x): return x % 2 != 0
Par défaut, toutes les variables dans une fonction sont locales ◦ On peut aussi définir des variables global : accessible de l’extérieur nonlocal : qui conservent leur état Les arguments sont passés par références Une fonction peut auss être créée avec un énoncé lambda
>>> exp2= lambda x: x**2 >>> exp2(5) 25 >>> liste=[1,3,5] >>> list(map(exp2,liste)) [1, 9, 25] >>> def plafond(P): return lambda X: X if X<P else P >>> p255=plafond(255) >>> p255(5) 5 >>> p255(345) 255 Expression pouvant remplacer le def ◦ Le corps du lambda est une seule expression ◦ ◦ souvent utilisé avec map reduce filter
Les fonctions Python sont implicitement polymorphiques ◦ Mais il n’y a pas de surcharge de fonctions Il n’est pas permit de définir une autre fonction avec le même nom mais une signature différente >>> def fois(x,y): return x*y >>> fois(5,7) 35 >>> fois('salut',3) 'salutsalutsalut‘ >>> def intersection(A,B): resultat= [] for x in A: if x in B: resultat.append(x) return resultat >>> intersection([1,2,3,4,5],(1,3,5,7,9)) [1, 3, 5] >>> intersection(['a','b','c'],'salut bonjour') ['a', 'b']
Une fonction peut retourner des tuples >>> pluriel=lambda X : X+'s' >>> def plurielListe(X): resultat=list(map(pluriel,X)) return resultat[0][0],resultat >>> plurielListe(liste) ('c', ['chats', 'chiens', 'loups'])
>>> def prefixe(pre,*mots): mots2=[] for m in mots: mots2.insert(-1,pre+m) return mots2 >>> prefixe('le ', 'chien','chat','loup') ['le chat', 'le loup', 'le chien']
>>> def applatir(L): resultat=[] for x in L: if isinstance(x,list): resultat+=applatir(x) else: resultat.append(x) return resultat >>> applatir([1,2,3,4]) [1, 2, 3, 4] >>> applatir([1,2,[3,[4,5]],8]) [1, 2, 3, 4, 5, 8]