Python et la Programmation fonctionnelle. Programmation fonctionnelle 3. Programmation fonctionnelle pure 4. Matthieu Amiguet



Documents pareils
Présentation du langage et premières fonctions

TP 1. Prise en main du langage Python

Initiation à la programmation en Python

Les classes en Python

STAGE IREM 0- Premiers pas en Python

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Expression des contraintes. OCL : Object C o n t r a i n t L a n g u a g e

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

1 Définition et Appel d une fonction. V. Phan Luong. Cours 4 : Fonctions

MapReduce. Nicolas Dugué M2 MIAGE Systèmes d information répartis

OCL - Object Constraint Language

Projet de programmation (IK3) : TP n 1 Correction

TD3: tableaux avancées, première classe et chaînes

length : A N add : Z Z Z (n 1, n 2 ) n 1 + n 2

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

Cours 1 : La compilation

Les bases du langage Python

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Java Licence Professionnelle CISII,

Algorithmique et Programmation, IMA

Cours No 3 : Identificateurs, Fonctions, Premières Structures de contrôle.

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Plan du cours. Historique du langage Nouveautés de Java 7

Classes et Objets en Ocaml.

Découverte de Python

Python Les fondamentaux du langage

1 Recherche en table par balayage

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Licence Sciences et Technologies Examen janvier 2010

TP1 : Initiation à Java et Eclipse

Cours d algorithmique pour la classe de 2nde


1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Représentation d un entier en base b

Programmer en JAVA. par Tama

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Calcul Formel et Numérique, Partie I

L informatique en BCPST

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Programmation C++ (débutant)/instructions for, while et do...while

Initiation à l algorithmique

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Environnements de développement (intégrés)

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

Langage Java. Classe de première SI

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Logiciel Libre Cours 2 Fondements: Programmation

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

1 Lecture de fichiers

Introduction au langage C

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Cours d Algorithmique et de Langage C v 3.0

Utilisation d objets : String et ArrayList

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Cours 7 : Utilisation de modules sous python

Compilation (INF 564)

Machines virtuelles. Brique ASC. Samuel Tardieu Samuel Tardieu (ENST) Machines virtuelles 1 / 40

Programmation en Java IUT GEII (MC-II1) 1

Évaluation et implémentation des langages

Programme Compte bancaire (code)

Tp 1 correction. Structures de données (IF2)

Machines virtuelles fonctionnelles (suite) Compilation ML Java

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

Jade. Projet Intelligence Artificielle «Devine à quoi je pense»

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Chapitre 2. Eléments pour comprendre un énoncé

Initiation à la Programmation en Logique avec SISCtus Prolog

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Outils pour la pratique

Traduction des Langages : Le Compilateur Micro Java

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Cours de Systèmes d Exploitation

INTRODUCTION À PYRAMID Gaël Bearstech. Crédits: Blaise Laflamme

TP : Gestion d une image au format PGM

Création d objet imbriqué sous PowerShell.

TP1 : Initiation à Java et Eclipse

1. Structure d'un programme FORTRAN 95

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Programmation Web. Madalina Croitoru IUT Montpellier

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation

Calcul Formel et Numérique, Partie I

Bases Java - Eclipse / Netbeans

Factorisation Factoriser en utilisant un facteur commun Fiche méthode

R, Bonnes pratiques. Christophe Genolini

Les structures. Chapitre 3

Cours de Programmation 2

I. Introduction aux fonctions : les fonctions standards

Chapitre 2 Devine mon nombre!

MapReduce. Malo Jaffré, Pablo Rauzy. 16 avril 2010 ENS. Malo Jaffré, Pablo Rauzy (ENS) MapReduce 16 avril / 15

Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour

Transcription:

Python et la Programmation fonctionnelle Matthieu Amiguet 2009 2010 1 Programmation fonctionnelle? 2 3 Lambda expressions 4 5 Programmation fonctionnelle? Programmation fonctionnelle 3 L expression programmation fonctionnelle peut se comprendre de plusieurs façons Interprétation la plus forte : programmation effectuée uniquement à l aide de fonctions au sens mathématique du terme ( programmation fonctionnelle pure ) Interprétation la plus faible : programmation utilisant les fonctions (au sens informatique du terme) da manière prépondérante Entre deux : utilisation des fonctions (informatiques) comme des objets de premier ordre Programmation fonctionnelle? Programmation fonctionnelle pure 4 Au sens le plus strict : Pas d effets de bord Pas d affectation de variables Pas de boucles (utilisation systématique de la récursivité) Avantages Parallélisation Vérification formelle Python ne s y prête pas bien. On utilise plutôt des langages spécialisés LISP, Scheme (hybrides) ML, Caml,... (hybrides) Haskell (pur)

Programmation fonctionnelle? Python et la programmation fonctionnelle 5 Python n est donc pas un langage fonctionnel au sens le plus strict du terme Par contre, il offre des outils traditionnels de la programmation fonctionnelle Fonctions comme entités de premier ordre map, filter,... Lambda fonctions... C est ces aspects orientés fonctionnel que nous allons étudier 1 Programmation fonctionnelle? 2 3 Lambda expressions 4 5 Une fonction est un objet comme un autre! 7 En python, les fonctions sont des objets (comme d ailleurs les modules, les classes, et... tout!) On peut donc Les affecter Les passer en paramètre... Au fait, on a vu qu une fonction est simplement un objet qui implémente la méthode call! notion de callable Callable 8 >>> callable(2) False >>> callable(callable) True >>> dir(callable) [ call, class, cmp, delattr, doc, getattribute, hash, init, module, name, new, reduce, reduce_ex, repr, self, setattr, str ] >>>

Exemple 1 9 Affectation import sys old_exit = sys. exit def my_exit ( i=0) : p r i n t " sys. e x i t c a l l e d with argument ", i old_exit ( i ) sys. exit = my_exit while True : x = raw_input ( " >>> " ) i f x == " " : sys. exit ( 0 ) p r i n t x Exemple 2 10 Passage en paramètre from math import cos def apply ( f, x ) : return f ( x ) x = apply ( cos, 0) p r i n t x Exemple 3 11 Passage en paramètre list = [ Bonjour, au r e v o i r!, Au r e v o i r ] list. sort ( key=str. lower ) p r i n t list Exemple 4 12 Attributs def test ( x ) : " " " Ceci est une f o n c t i o n t e s t " " " return test. param + x test. param = 2 p r i n t test. doc p r i n t test ( 3 )

Exemple 5 13 Fonction comme objet class adder : def init ( self, n ) : self. n = n def call ( self, x ) : return self. n+x plus3 = adder ( 3 ) p r i n t plus3 ( 2 ) 1 Programmation fonctionnelle? 2 3 Lambda expressions 4 5 Lambda expressions Trier des chaînes selon leur 2e lettre? 15 list = [ Bonjour, Au r e v o i r, Hello, Bye ] def second_pos ( s ) : return s [ 1 ] list. sort ( key=second_pos ) p r i n t list Lambda expressions Une solution plus légère 16 list = [ Bonjour, Au r e v o i r, Hello, Bye ] list. sort ( key=lambda s : s [ 1 ] ) p r i n t list

Lambda expressions Lambda expressions 17 L expression lambda args : expr(args) est équivalente à def anonymous ( args ) : return expr ( args )... sauf qu on a pas besoin de donner un nom à la fonction La lambda-expression retourne simplement un pointeur sur l objet fonction correspondant C est pourquoi on appelle parfois les lambda-expressions des fonctions anonymes En python, le corps d une lambda-expression est limité à une seule expression Lambda expressions Exemple 18 Dictionnaires comme switch ops = { plus : lambda x, y : x+y, moins : lambda x, y : x y } op = raw_input ( Quelle operation? ) p r i n t ops [ op ] ( 2, 3 ) 1 Programmation fonctionnelle? 2 3 Lambda expressions 4 5 Outils fonctionnels standard 20 Dans les langages fonctionnels, les boucles sont facilement remplacées par des appels à des fonctions s appliquant à des fonctions Trois grands classiques map(function, list) applique successivement function aux éléments de la liste et retourne la liste des résultats filter(function, list) retourne une liste des éléments de list pour lesquels function est vrai reduce(bin_func, list) applique bin_func aux deux premiers éléments de la liste, puis au résultat et au 3e élément, puis... et retourne le résultat final.

Exemples 21 l = [ 1, 2, 3, 4 ] p r i n t " l i s t : ", l p r i n t " squares : ", map ( lambda x : x 2, l ) p r i n t " odd numbers : ", filter ( lambda x : x%2, l ) p r i n t "sum : ", reduce ( lambda x, y : x+y, l ) List comprehensions 22 Les fonctions ci-dessus sont des classiques de la programmation fonctionnelle Mais python, en s inspirant de Haskell, offre une alternative combinant map et filter dans une nouvelle syntaxe : les list comprehensions Syntaxe python : [expr(x) for x in list] map(expr,list) [expr(x) for x in list if test(x)] map(expr,filter(test,list)) Exemple 23 l = [ 1, 2, 3, 4 ] p r i n t " l i s t : ", l p r i n t " squares : ", [ x 2 for x in l ] print " odd numbers : ", [ x for x in l i f x%2==1] l2 = [ x 2 for x in l i f x%2==1] p r i n t " squares of odd numbers : ", l2 # Equivalent l2 = [ ] for x in l : i f x%2 ==1: l2. append ( x 2) p r i n t " squares of odd numbers : ", l2 Generator expressions 24 Si, dans une list comprehension, on remplace les crochets par des parenthèses, on obtient un générateur Exemple : afficher toutes les lignes non vides d un fichier texte en enlevant les espaces en début et en fin de ligne et ceci sans charger tout le fichier en mémoire d un coup : with file ( t e s t. t x t ) as f : nbl = ( l. strip ( ) for l in f i f l!= " \ n " ) for l in nbl : p r i n t l

Avantages 25 Les constructions que nous avons vu dans ce chapitre permettent de résumer une boucle de plusieurs lignes de code en une expression Moins à taper Moins de risque d erreur Plus lisible (?) De plus, une boucle python est implémentée... en python, alors que les constructions ci-dessus sont implémentées en C Elles sont donc (sensées être) plus rapides! (particulièrement les list comprehensions) 1 Programmation fonctionnelle? 2 3 Lambda expressions 4 5 Fonctions de fonction 27 Puisque les fonctions sont des objets de premier ordre, elles peuvent être passées en paramètre être retournées par une fonction On peut donc faire des fonctions qui transforment des fonctions Pendre une fonction en paramètre...... la modifier...... et la retourner! Exemple 1 28 def deco ( f ) : " useless t r a n s f o r m a t i o n of a f u n c t i o n " f. doc += ", but decorated " return f def f ( x ) : " useless f u n c t i o n " return x f = deco ( f )

Exemple 1 résultat 29 C :\> pydoc exemple1 [...] FUNCTIONS deco(f) useless transformation of a function f(x) useless function, but decorated Exemple 2 30 def wrapper ( f ) : " s l i g h t l y more u s e f u l f u n c t i o n " def inner ( x ) : p r i n t " ( Entering %s ) " % f. name, result = f ( x ) p r i n t " ( E x i t i n g %s with r e s u l t %s ) " % ( f. name, result ), return result return inner def f ( x ) : " useless f u n c t i o n " return x f = wrapper ( f ) p r i n t " f ( 1 ) = ", f ( 1 ) Exemple 2 résultat 31 C :\> python example2.py f(1) = (Entering f) (Exiting f with result 1) 1 32 En python, une fonction qui modifie une fonction est appelée un décorateur Pour éviter la syntaxe suivante, un peu lourde : def f ( x ) : [... ] f = decorator ( f ) Python propose la syntaxe équivalente suivante @decorator def f ( x ) : [... ]

Sucre syntaxique 33 Les décorateurs ne sont que du sucre syntaxique On peut s en passer et utiliser la syntaxe équivalente Mais la syntaxe proposée rend la décoration plus visible (surtout pour une longue fonction) simplifie l utilisation des décorateurs pré-existants (?) cf. p. ex. contextlib.contextmanager, classmethod, staticmethod,... Plusieurs décorateurs... 34 Les décorateurs peuvent être chaînés! @dec1 @dec2 @dec3 def f ( x ) : [... ] # Equivalent : f = dec1 ( dec2 ( dec3 ( f ) ) ) avec arguments 35 Supposons que l on veuille écrire quelque chose comme ça : @accepts ( int ) def succ ( x ) : return x+1 On doit vérifier si le type de l argument est un int et lever une exception sinon Alors la fonction accepts doit Prendre un type en argument Retourner un décorateur, c est-à-dire une fonction qui prend une fonction en argument et retourne une fonction décorée Exemple 36 def accepts ( type ) : " " " Decorator v e r i f y i n g t h a t the argument i s of given type " " " def deco ( f ) : def inner ( arg ) : i f not isinstance ( arg, type ) : raise TypeError return f ( arg ) return inner return deco

Un peu de cosmétique... 37 Pour que l application d un décorateur soit transparente dans toutes les situations, on devrait compléter un peu le code : def wrapper ( f ) : def inner ( x ) : p r i n t " ( Entering %s ) " % f. name, result = f ( x ) p r i n t " ( E x i t i n g %s with r e s u l t %s ) " % ( f. name, result ), return result inner. doc = f. doc inner. name = f. name inner. dict. update ( f. dict ) return inner Pour aller plus loin 38 Tarek Ziadé, Programmation Python, Eyrolles, 2006 http://docs.python.org/tut/tut.html http://wiki.python.org/moin/ PythonDecoratorLibrary decorator module : module (tiers) proposant des décorateurs simplifiant l écriture de décorateurs (!) http://www.phyast.pitt.edu/~micheles/ python/documentation.html