Initiation à la programmation impérative et algorithmique Cours 5 Entrées/Sor=es et Fonc=ons Largement inspiré des cours : Vercouter, Del Mondo & Delestre, Hérault, Mainguenaud (INSA de Rouen)
De la programma=on impéra=ve Blocs d instruc=ons séquen=elles variables sélec,ons instruc=on 1 instruc=on 2 instruc=on 3 si condi=on a vérifiée: instruc=on condi=onnelle a1 instruc=on condi=onnelle a2 instruc=on 4.. boucles types de données fichiers fonc,ons entrées/sor,es à la programma=on fonc=onnelle Fonc=on f(paramètres d entrée): instruc=on f1 instruc=on f2 retourne valeur de sor6e récursivité Programme principal: instruc=on 1 si condi=on a vérifiée: appel de la fonc=on f(paramètres d entrée)
Exemple de pseudo-code Données à entrer Declaration : effectif, taux, gain : Reel ; an, anmax : Entier effectif 100 anmax 20 taux 0.05 an 0 gain 0 tant que an < anmax faire gain gain + effectif * taux effectif effectif * (1+taux) an an + 1 fintantque afficher La population a gagne, gain, individus. Données à sor=r Pour écrire un algorithme générique visant à résoudre un problème, il est nécessaire de considérer plusieurs sources et destinations de données.
Entrées et sorties Informatique = Traitement de l information! Les traitements sont réalisés par les instructions du programme! Les données fournies en entrée de l instruction subissent un traitement! Un traitement produit des informations qui sont les sorties de l instruction Indépendance vis-à-vis de l IHM! L instruction lire est associée à un périphérique d entrée spécifique : le clavier! L instruction ecrire est associée à un périphérique de sortie spécifique : l écran
Exemple de pseudo-code Pourquoi concevoir des algorithmes les plus génériques possibles? => Pour optimiser leur transférabilité & modularité, et ainsi pouvoir les réutiliser d un problème à l autre Declaration : an : Entier Entree : effectif, taux : Reel ; anmax : Entier Sortie : gain : Reel an 0 gain 0 tant que an < anmax faire gain gain + effectif * taux effectif effectif * (1+taux) an an + 1 fintantque
Programmation structurée A B A code répété C Appel de la fonction C Définition de la fonction B B D D
Programmation structurée Structure d un programme Un programme est composé de sous-programmes L exécution débute par le sous-programme principal L exécution se déroule par des appels successifs de sousprogrammes Les sous-programmes interagissent par le passage de données en entrée et en sortie
Les fonctions Les fonctions sont des sous-programmes admettant des paramètres d entrée et retournant un seul résultat (comme les fonctions mathématiques y = f(x, )). - les paramètres d entrée sont en nombre fixe - le type de valeur retournée par une fonction est unique - la valeur de retour est spécifiée par l instruction retourner Les fonctions peuvent aussi modifier l état du programme sans retourner de valeur. La modification peut concerner plusieurs variables. Généralement, le nom d une fonction est soit un substantif (par ex. minimum), soit une question (par ex. isempty), soit un verbe (ex. move).
Déclaration de fonction Fonction renvoyant une valeur fonction nom_fonction (parametres_entree) : type_valeur_retournee Declaration variables_locales debut instructions_de_la_fonction retourner valeur fin Fonction ne renvoyant pas de valeur fonction nom_fonction (parametres_entree) : None Declaration variables_locales debut instructions_de_la_fonction fin
Exemple de fonction (1) fonction minimum2 (a, b : Entier) : Entier Declaration res : Entier debut si a b alors res b sinon res a finsi retourner res fin
Exemple de fonction (2) Declaration : an : Entier Entree : effectif, taux : Reel anmax : Entier Sortie : gain : Reel an 0 gain 0 tant que an < anmax faire gain gain + effectif * taux effectif effectif * (1+taux) an an + 1 fintantque fonction gaindepopulation (effectif, taux: Reel ; anmax: Entier) : Reel Declaration an : Entier ; gain : Reel debut an 0 gain 0 tant que an < anmax faire gain gain + effectif * taux effectif effectif * (1+taux) an an + 1 fintantque retourner gain fin
Appel de fonction L exécution d une fonction A se fait par un appel dans un sous-programme B. L appel s effectue par une instruction en utilisant le nom de la fonction A Lors de l appel, une valeur est affectée à chaque paramètre d entrée de A A la fin de A, l exécution reprend après l appel de A dans le sousprogramme B La valeur retournée peut être utilisée dans B pour une affectation, un calcul
Exemple d appel Dans un programme principal : Declaration : unentier, min : Entier debut lire(unentier) min minimum2(unentier, 0) ecrire( Le minimum avec 0 est :, min) fin Dans une fonction : fonction minimum3 (a,b,c : Entier) : Entier debut retourner minimum2(a,minimum2(b,c)) fin
Paramètres et signature Les paramètres Pour qu un sous programme B appelle un sous-programme A, il faut : Que les informations données à A, lors de la définition de son algorithme, soient identifiées/nommées pour pouvoir être utilisées : paramètres formels (paramètres) Que B donne des instructions à A lors de l appel : paramètres effectifs (arguments) La signature Une fonction est désignée de manière unique dans un programme par sa signature, composée de : Son nom Ses paramètres formels d entrée Son type de retour
Exercice 1/4 Cycle cellulaire Ecrire : Une fonction qui renvoie l étape du cycle dans laquelle est une cellule à un âge donné, exprimé en heures Une fonction qui détermine si un âge est valide pour une cellule (12h) 1 2 (18h) 4 3 (22h) Un programme principal qui demande la saisie d un âge pour une cellule et affiche le stade cellulaire dans lequel elle se trouve (0h)
Exercice 2/4 Ø Fonction qui renvoie l étape du cycle dans laquelle est une cellule à un âge donné fonction stadecellulaire(age : Entier) : Chaîne de caractères Declaration etape : Chaîne de caractères debut si (age 12) alors etape G1 sinon si (age 18) alors etape S sinon si (age 22) alors etape G2 sinon etape M finsi finsi finsi retourner etape fin
Exercice 3/4 Ø Fonction qui détermine si un âge est valide pour une cellule fonction estunagevalide(age : Entier) : Booleen debut retourner (age > 0 ) et (age 24) fin
Exercice 4/4 Ø Programme principal Declaration: age : Entier debut lire(age) si estunagevalide(age) alors ecrire( Cette cellule est dans le stade cellulaire, stadecellulaire(age)) finsi fin Comment faire pour généraliser l algorithme à différents types cellulaires?
Les fonctions en Python En python, une fonction est définie à l aide du mot clé def, suivi du nom de la fonction, puis de la liste de ses paramètres formels. Le corps de la fonction doit être indenté. def nom_fonction (paramètres_d_entree): instructions_de_la_fonction_reperees_par_l_indentation Généralement, les premières lignes de la fonction sont dédiées à des commentaires de documentation de la fonction, appelés Docstring.
Les fonctions en Python En Python, les fonctions retournent toujours unevaleur, soit explicite, soit implicite. Pour retourner une valeur explicite, la dernière instruction qui est exécutée dans le corps de la fonction doit être return valeur. Si aucune valeur de retour n est spécifiée, la valeur prédéfinie None lui sera substituée.
Exemple de fonction en Python def prem (x): n = 2 while n < x: d = 2 while d < n: if n % d == 0: print n, =, d, *, n/d break else: d = d + 1 if d == n: print(n, est premier ) n = n + 1 Déclaration de la fonction 1 er niveau d indentation: corps de la fonction 2 ème niveau d indentation: boucle 3 ème niveau d indentation: boucle 4 ème niveau d indentation: sélection simple 3 ème niveau d indentation: sortie du bloc if 4 ème niveau d indentation: sélection alternative 2 ème niveau d indentation: sortie de la boucle 3 ème niveau d indentation: sélection simple 2 ème niveau d indentation: sortie du bloc if
Portée des variables en Python (1) def carre(x): y = x * x a = 15 carre(a) print( Le carré de, a, est égal à, y,. ) => Erreur : y n est pas défini! def carre(x): y = x * x return(y) a = 15 b=carre(a) Print( Le carré de, a, est égal à, b,. ) => Le carré de 15 est égal à 225.
Portée des variables en Python (2) Lors de son exécution, une fonction génère une table de symboles qui sera utilisée pour ses variables locales. A chaque fois qu un nom de variable apparaît à gauche d un signe d affectation, une variable locale est créée. Une variable déclarée dans une fonction n est pas visible depuis les autres sous-programmes. Toute référence à une variable apparaissant à droite d un signe d affectation déclenche une recherche de la variable selon l ordre de priorité Local- Global-Integrated (LGI), soit (1) dans la table locale, (2) dans la table globale, (3) dans la table des noms intégrés. Ainsi, on peut faire référence à une variable globale dans une fonction, mais on ne peut pas lui affecter une valeur. Pour outrepasser cette interdiction, on utilise le mot clé global dans le corps de la fonction.
Portée des variables en Python (3) def carre(x): global y y = x * x a = 15 carre(a) Print( Le carré de, a, est égal à, y,. ) => Le carré de 15 est égal à 225. def carre(x): y = x * x return(y) a = 15 b=carre(a) Print( Le carré de, a, est égal à, b,. ) => Le carré de 15 est égal à 225.
Portée des variables en Python (4) def hello(prenom): print("bonjour", prenom) hello("patricia") print(x) Bonjour Patricia Erreur : x n est pas défini! x = 10 def hello(prenom): print("bonjour", prenom) print(x) hello("patricia") print(x) Bonjour Patricia 10 10 x = 10 def hello(prenom): print("bonjour", prenom) hello("patricia") print(x) Bonjour Patricia 10 x = 10 def hello(prenom): x = 42 print("bonjour", prenom) print(x) hello("patricia") print(x) Bonjour Patricia 42 10
Paramètres par défaut La liste d appel d une fonction peut contenir un nombre variable d arguments. Il est possible d affecter une valeur par défaut à certains paramètres d entrée, de sorte de le nombre de paramètres effectifs (arguments) donnés lors de l appel de la fonction sera inférieur au nombre de paramètres formels (paramètres) qui apparaissent dans sa définition. def afficheab(a= 10,b= salut ): print( a :, a, ; b :, b) afficheab() afficheab( bonjour, monsieur ) afficheab( je te dis ) => a : 10 ; b : salut => a : bonjour ; b : monsieur => a : je te dis ; b : salut
Paramètres par défaut! La valeur par défaut est évaluée une fois et une seule lors de la définition de la fonction val = 10 def afficheab(a=val,b= salut ): print( a :, a, ; b :, b) afficheab() val = 20 afficheab() => a : 10 ; b : salut => a : 10 ; b : salut
Paramètres par défaut! La valeur par défaut est évaluée une fois et une seule lors de la définition de la fonction Dans le cas d un objet modifiable, les changements qui lui ont été faits sont conservés. val = 10 def afficheab(a=val,b=[]): print( a :, a, ; b :, b) a = Maintenant a vaut 20 b.append( salut ) afficheab() afficheab() => a : 10 ; b : [] => a : 10 ; b : salut
Appel par mot clé Il est aussi possible de faire référence à une liste d appel de fonction par mot clé, c est-à-dire en utilisant le nom des paramètres formels de la fonction val = 10 def afficheabc(c,a=val,b=[]): print( a :, a, ; b :, b, ; c :, c) afficheabc(a= hello you,1974) afficheab( bouh ) => a : hello you ; b : [] ; c : 1974 => a : 10 ; b : [] ; c : bouh Dans ce type d appel, l ordre des arguments est sans importance.
Appel par mot clé! Il est cependant impératif que, dans la définition de la fonction, les paramètres qui reçoivent une valeur par défaut apparaissent après ceux qui n en reçoivent pas. val = 10 def afficheabc(a=val,c,b=[]): print( a :, a, ; b :, b, ; c :, c) afficheabc(a= hello you,1974) => Erreur : un argument sans valeur par défaut suit un argument avec valeur par défaut
Quelques fonctions standards Importer un module de fonctions Importer le contenu d un module import math b = math.sqrt(a) Importer une partie d un module from math import sqrt Importer tout un module fom math import * (tous les identifiants du module sont chargés) Lister le contenu d un module La fonction standard dir() permet de lister le contenu d un module. dir(math) [' doc ', ' file ', ' name ', 'acos', 'asin', 'atan, 'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp', 'fabs, 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log', 'log10, 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan, 'tanh'] La fonction help() est la fonction d aide en ligne de python help(math)
Quelques fonctions standards Fonctions mathématiques abs(x) renvoie la valeur ABSolue d un entier ou d un réel math.cos(x) renvoie le COSinus de l argument exprimé en radians math.exp(x) renvoie la valeur de e élevée à la puissance de l argument math.log(x[,base]) renvoie le LOGarithme népérien de l argument avec deux arguments, on peut préciser la base souhaitée math.pow(x,y) renvoie l argument x à la puissance y round(x[,ndigits]) arrondit l argument x à ndigits chiffre après la virgule Si ndigits est omis, l arrondi se fait à l entier le plus proche sin(x) renvoie le SINus de l argument exprimé en radians sqrt(x) renvoie la racine carrée de l argument math.trunc(x) renvoie la partie entière d un nombre réel x
Quelques fonctions standards Fonctions pour les caractères chr(i) renvoie un caractère à partir de son code ASCII ord(c) renvoie un entier représentant le code ASCII d un caractère Fonctions pour les caractères et chaînes de caractères len(s) renvoie la longueur de la chaîne de caractères S str.lower(s) renvoie une copie de S, avec les majuscules en minuscules str.upper(s) renvoie une copie de S, avec les minuscules en majuscules Fonctions pour les entrées/sorties input([prompt]) affiche l argument à l écran, renvoie ce qui est au clavier print([object,...] ) affiche object(s) à l écran, avec retour à la ligne open(file[, mode='r ) ouvre le fichier file en mode lecture ( r ), écriture ( w )
Fonctions anonyme et fermeture Au moyen du mot clé lambda, il est possible de définir des fonctions anonymes. x = lambda a,b : a+b z = x(3,5) print(z) => 8 Une fonction s exécute toujours dans le contexte dans lequel elle a été définie. def ferm (val): def fonc(nb): return val + nb return fonc x = ferm(100) y = ferm(200) print( appel de x :, x(50)) print( appel de y :, y(50)) => appel de x : 150 => appel de y : 250
Fonction callback Une fonction callback est une fonction particulière qui, une fois définie, sera utilisée en argument d une autre fonction. def mettre_au_carre(x): return x ** 2 def appliquer_fonction(fonc, valeur): return fonc(valeur) print appliquer_fonction(mettre_au_carre, 3) => 9 En pratique, rien ne permet de différencier les fonctions callback des autres en Python.
Conclusion La prise en compte de différentes sources et destinations de données permet de généraliser un algorithme visant à résoudre un problème. Un programme est conposé de sous programmes, autrement dit des fonctions. Les fonctions admettent des paramètres d entrée (arguments) et retournent une seule valeur ou bien modifient l état du programme (sans retour de valeur). La bibliothèque python comporte de nombreux modules, où sont définies un certain nombre de fonctions.