
This course includes our updated coding exercises so you can practice your skills as you learn.
See a demo
Ce cours est pour tout ceux:
Souhaitent apprendre à programmer rapidement en Python
Qui on une expérience en programmation et qui souhaitent explorer la programmation dite fonctionnelle
S'initier au cadre de programmation MapReduce et la récursivité
Fonction, expression, Python
Définir une fonction au moyen du mot clé def. Première aproche
Un fonction =
un nom
des variables muettes (paramètres)
Une expression utilisant les variables
un résultat : sera obtenu par évaluation de l'expression en donnant des valeurs au variables
Nous verrons dans la prochaine section une définition plus rigoureuse avec les lambda expression (fonction anonyme)
Exercices pour maitriser
La définition de fonctions d'une seule expression
La notion de "duck typing"
La programmation fonctionnelle est un paradigme de programmation de type déclaratif qui considère le calcul en tant qu'évaluation de fonctions mathématiques.
Comme le changement d'état et la mutation des données ne peuvent pas être représentés par des évaluations de fonctions, la programmation fonctionnelle ne les admet pas, au contraire elle met en avant l'application des fonctions, contrairement au modèle de programmation impérative qui met en avant les changements d'état.
La programmation fonctionnelle s'affranchit de façon radicale des effets secondaires (ou effets de bord) en interdisant toute opération d'affectation. L'affecatation étant l'instruction d'un language qui modifie l'état d'une machine (cad les valeurs d'une variable)
Un programme est une application, au sens mathématique, qui ne donne qu'un seul résultat pour chaque ensemble de valeurs en entrée.
Bien faire la différence entre paradigme fonctionnel et programmation 'impérative'
En théorie des ensembles, une fonction ou application est une relation entre deux ensembles pour laquelle chaque élément du premier est en relation avec un unique élément du second. Parfois, on distingue la notion de fonction en affaiblissant la condition comme suit : chaque élément du premier ensemble est en relation avec au plus un élément du second.
J'utilerais cette définition inspirée de la théorie des types, une fonction est la description de la méthode pour obtenir le résultat à partir de ses paramètres, en évaluant des expressions.
Expressions, instructions, fonctions
Expression : Donne un résultat sans changement d'états. On évalue une expression
Instruction : Transforme l'état de la machine, on exécute une instruction
Fonction pure : Est une expression.
Par exemple l'affecation n'est pas une expression, c'est une instruction
Dans nos premiers pas en Python nous n'utiliserons pas l'affectaion. Pour nous obliger à définir des fonctions pures
procedures et fonctions
Une procedure est une instruction, elle modifie l'état.
Voyons un exemple
un type de donnée, ou simplement un type, définit la nature des valeurs que peut prendre une donnée, ainsi que les opérateurs qui peuvent lui être appliqués.
Une expression est évaluée et fournie une valeur.
L'expression est une combinaison de variables, d'opérations et de valeurs qui donne une valeur en résultat
Une instruction
agit,
elle fait quelque chose,
elle modifie l'état.
Les instructions représentent une action ou une commande,
Par exemple des instructions d'impression,
des instructions de nommage,
définition de fonctions,
modification des valeurs dans une liste ou un dictionnaire (des éléments mutable)
...
Quels lien avec le paradigme fonctionnel?
Instructions, expressions effet sur l'état: les fonctions globals() et locals()
Les fonctions intégrées globals() et locals() renvoient respectivement les environnements globaux et locaux.
l'interprète Python maintient une structure de données contenant des informations sur chaque identifiant (nom) apparaissant dans le code source du programme.
L'interpréteur Python propose quelques fonctions et types natifs qui sont toujours disponibles.
Certaines d'entre elles sont très utiles pour nos futures explications et fonctions que nous créerons.
Elles sont listés toute dans cette section (issue de la documentation officielle https://docs.python.org/fr/3/library/functions.html)
et nous en décrirons quelques unes en détail, avec des exemples, pour leur utilité particulière dans le cadre du paradigme fonctionnel
Documentation en ligne des éléments Python.
Comment documenter vos fonctions, notion de docstring
Fonction de réduction, à partir d'une collection fournit un résultat
Compléments listes et tuples
Une liste est une collection d'objets arbitraires, un peu comme un tableau dans d'autres langages de programmation. Les listes sont définies en mettant entre crochets une séquence d'objets séparés par des virgules.
Voici les caractéristiques importantes des listes Python :
Les listes sont ordonnées.
Les listes peuvent contenir des objets arbitraires.
Les éléments de liste sont accessibles par index.
Les listes peuvent être imbriquées à une profondeur arbitraire.
Les listes sont modifiables.
Les listes sont dynamiques.
Les tuples sont identiques aux listes à tous égards, sauf :
Les tuples sont définis en mettant les éléments entre parenthèses (()) au lieu de crochets ([]).
Les tuples sont immuables.
Les tuples peuvent être emballés et déballés.
Complément récursivité
Après le complément sur les listes et tuples, nous aborderons les fonctions récursives mettant en jeu les structures, par exemple le nombre d'élements d'une liste, le max, le min, la moyenne ...
Nous en déduirons un format général de récursivité
Nous transformerons les récursivité en récursivité terminale
Et finalement nous ferons le lien avec la paradigme impératif en traduisant la récursivité terminale en boucle
Retour sur les listes (séquences ordonnées)
Accéder aux éléments de la liste
Récupérer un sous-ensemble d'une séquences (slices)
Comment représenté une matrice par exemple
Apprenez à programmer en Python en utilisant le paradigme fonctionnelle. λ
L'objectif, si vous êtes débutant:
D'aprendre rapidement un nouveaux language, en minimisant les notions à connaitre.
Vous former à décrire un algorithme au moyen d'un raisonnement récursif et logique.
Les répétitions (boucles) sont les conséquences d'un résonnement récursif.
Initiation au modèle map-reduce pour les traitements sur les collections de données
L'objectif, si vous programmer déjà
Vous former à décrire un algorithme au moyen d'un raisonnement récursif, qui vous permettra d'écrire de meilleures itérations. En particulier pour trouver l'invariant de boucle et la condition de sortie de boucle
Différencier instructions et expressions, données mutable et immutable
Souligner les avantages de la programmation fonctionnelle pour les applications concurrente et répartis
Après une présentation rapide de l'environnement que nous utiliserons et une première approche intuitive de la programmation fonctionnelle. Nous approfondirons les notions de fonctions avec une introduction au lambda calcul et ses applications possible dans un language tel que Python
Quand on aborde la programmation fonctionnelle, vous entendrez souvent parler d'un nombre étourdissant de caractéristiques « fonctionnelles » : les données immuables, les fonctions de première classe et l'optimisation de la récursion terminale. Ces fonctionnalités ne sont que des caractéristiques de langage qui facilitent la programmation fonctionnelle. On parle aussi de mappage, de réduction, de pipeline, de récursion, de curryfication et d'utilisation des fonctions d'ordre supérieur. Ce sont des techniques de programmation employées pour écrire du code fonctionnel. Il est enfin question de parallélisation, d'évaluation paresseuse et de déterminisme. Ce ne sont que des propriétés avantageuses des programmes fonctionnels.
Un programme écrit en style fonctionnel se caractérise essentiellement par une chose essentielle: l'absence d'effets de bord, ou plus précisément l'abscence de changement d'états. Le code ne dépend pas de données se trouvant à l'extérieur de la fonction courante et il ne modifie pas des données à l'extérieur de cette fonction. Il transforme une donnée en entrée (sans la modifié) en donnée de sortie qu'elle crée.
La plupart des autres caractéristiques de la programmation fonctionnelle peuvent se déduire de cette propriété. Utilisez-la comme un fil conducteur:
Pas de boucles => récursivité ou reduce
Pas d'affectations => nommage d'expressions
Pas d'insctructions => uniquement expressions et définition de fonctions