Computer Parts in French - Les parties de l'ordinateur.pptx
05 - Cours Fonctions.pptx
1. H. Richard – 11.09.2014
Initiation à la
programmation impérative
et algorithmique
Cours 5 – Entrées/Sorties et Fonctions
Largement inspiré des cours :
Vercouter, Del Mondo & Delestre, Hérault, Mainguenaud (INSA de Rouen)
Elodie Laine – 17.10.2018
2. H. Richard – 11.09.2014
Elodie Laine – 17.10.2018
De la programmation impérative…
instruction 1
instruction 2
instruction 3
si condition a vérifiée:
instruction conditionnelle a1
instruction conditionnelle a2
instruction 4
.
.
Blocs
d’instructions
séquentielles
variables
sélections boucles
types de données
… à la programmation fonctionnelle
Fonction f(paramètres d’entrée):
instruction f1
instruction f2
retourne valeur de sortie
Programme principal:
instruction 1
si condition a vérifiée:
appel de la fonction f(paramètres d’entrée)
fonctions
entrées/sorties
fichiers récursivité
3. H. Richard – 11.09.2014
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.
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
à entrer
Données
à sortir
Elodie Laine – 17.10.2018
Exemple de pseudo-code
4. H. Richard – 11.09.2014
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
Informatique = Traitement de l’information
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
Indépendance vis-à-vis de l’IHM
Entrées et sorties
Elodie Laine – 17.10.2018
5. H. Richard – 11.09.2014
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
Motivation
Elodie Laine – 17.10.2018
6. H. Richard – 11.09.2014
A
B
B
C
D
A
B
C
D
code
répété
Appel de la
fonction
Définition de la
fonction
Programmation structurée
Elodie Laine – 17.10.2018
7. H. Richard – 11.09.2014
• 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 sous-
programmes
• Les sous-programmes interagissent par le passage de données en
entrée et en sortie
Structure d’un programme
Programmation structurée
Elodie Laine – 17.10.2018
8. H. Richard – 11.09.2014
• 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).
Les fonctions
Elodie Laine – 17.10.2018
9. H. Richard – 11.09.2014
fonction nom_fonction (parametres_entree) : type_valeur_retournee
Declaration variables_locales
debut
instructions_de_la_fonction
retourner valeur
fin
Déclaration de fonction
Fonction renvoyant une valeur
fonction nom_fonction (parametres_entree) : None
Declaration variables_locales
debut
instructions_de_la_fonction
fin
Fonction ne renvoyant pas de valeur (procédure)
Elodie Laine – 17.10.2018
10. H. Richard – 11.09.2014
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 (1)
Elodie Laine – 17.10.2018
11. H. Richard – 11.09.2014
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
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
Exemple de fonction (2)
Elodie Laine – 17.10.2018
12. H. Richard – 11.09.2014
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 sous-
programme B
• La valeur retournée peut être utilisée dans B pour une affectation, un
calcul…
Appel de fonction
Elodie Laine – 17.10.2018
13. H. Richard – 11.09.2014
Declaration : unEntier, min : Entier
debut
unEntier ← lire("Donnez un entier")
min ← minimum2(unEntier, 0)
ecrire(‘Le minimum avec 0 est :’, min)
fin
fonction minimum3 (a,b,c : Entier) : Entier
debut
retourner minimum2(a,minimum2(b,c))
fin
Dans un programme principal :
Dans une fonction :
Exemple d’appel
Elodie Laine – 17.10.2018
14. H. Richard – 11.09.2014
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)
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
Les paramètres
La signature
Paramètres et signature
Elodie Laine – 17.10.2018
15. H. Richard – 11.09.2014
(12h)
(18h)
(0h)
(22h)
1
2
3
4
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
• Un programme principal qui
demande la saisie d’un âge pour
une cellule et affiche le stade
cellulaire dans lequel elle se
trouve
Cycle cellulaire
Exercice 1/4
Elodie Laine – 17.10.2018
16. H. Richard – 11.09.2014
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
Fonction qui renvoie l’étape du cycle dans laquelle est une cellule à un âge donné
Exercice 2/4
Elodie Laine – 17.10.2018
17. H. Richard – 11.09.2014
fonction estUnAgeValide(age : Entier) : Booleen
debut
retourner (age > 0 ) et (age ≤ 24)
fin
Fonction qui détermine si un âge est valide pour une cellule
Exercice 3/4
Elodie Laine – 17.10.2018
18. H. Richard – 11.09.2014
Declaration: age : Entier
debut
age ← lire("Quel est votre age ?")
si estUnAgeValide(age) alors
ecrire(‘Cette cellule est dans le stade cellulaire ’, stadeCellulaire(age))
finsi
fin
Programme principal
Comment faire pour généraliser l’algorithme à différents types cellulaires ?
Exercice 4/4
Elodie Laine – 17.10.2018
19. H. Richard – 11.09.2014
• 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
Elodie Laine – 17.10.2018
20. H. Richard – 11.09.2014
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.
Les fonctions en Python
Elodie Laine – 17.10.2018
21. H. Richard – 11.09.2014
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
1er niveau d’indentation: corps de la fonction
2ème niveau d’indentation: sortie de la 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
3ème niveau d’indentation: sélection simple
2ème niveau d’indentation: sortie du bloc if
2ème niveau d’indentation: boucle
Exemple de fonction en Python
Elodie Laine – 17.10.2018
22. H. Richard – 11.09.2014
def carre(x):
y = x * x
a = 15
carre(a)
print(“Le carré de ”, a, “ est égal
à ”, y, “ .”)
def carre(x):
y = x * x
return(y)
a = 15
b=carre(a)
Print(“Le carré de ”, a, “ est égal à
”, b, “ .”)
=> Erreur : y n’est pas défini !
=> Le carré de 15 est égal à 225.
Portée des variables en Python (1)
Elodie Laine – 17.10.2018
23. H. Richard – 11.09.2014
• 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 (2)
Elodie Laine – 17.10.2018
24. H. Richard – 11.09.2014
def carre(x):
global y
y = x * x
a = 15
carre(a)
Print(“Le carré de ”, a, “ est égal à
”, y, “ .”)
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.
=> Le carré de 15 est égal à 225.
Portée des variables en Python (3)
Elodie Laine – 17.10.2018
25. H. Richard – 11.09.2014
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)
hello("Patricia")
print(x)
x = 10
def hello(prenom):
print("Bonjour", prenom)
print(x)
hello("Patricia")
print(x)
x = 10
def hello(prenom):
x = 42
print("Bonjour", prenom)
print(x)
hello("Patricia")
print(x)
Bonjour Patricia
10
Bonjour Patricia
10
10
Bonjour Patricia
42
10
Portée des variables en Python (4)
Elodie Laine – 17.10.2018
26. H. Richard – 11.09.2014
• 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
Elodie Laine – 17.10.2018
27. H. Richard – 11.09.2014
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
La valeur par défaut est évaluée une fois et une seule lors de la définition de la
fonction
Paramètres par défaut !
Elodie Laine – 17.10.2018
28. H. Richard – 11.09.2014
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 : salut
=> a : 10 ; b : []
Dans le cas d’un objet modifiable, les changements qui lui ont été faits sont
conservés.
La valeur par défaut est évaluée une fois et une seule lors de la définition de la
fonction
Paramètres par défaut !
Elodie Laine – 17.10.2018
29. H. Richard – 11.09.2014
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é
Elodie Laine – 17.10.2018
30. H. Richard – 11.09.2014
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
Appel par mot clé !
Elodie Laine – 17.10.2018
31. H. Richard – 11.09.2014
• 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)
Importer un module de fonctions
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)
Lister le contenu d’un module
Quelques fonctions standards
Elodie Laine – 17.10.2018
32. H. Richard – 11.09.2014
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
Fonctions mathématiques
Quelques fonctions standards
Elodie Laine – 17.10.2018
33. H. Richard – 11.09.2014
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
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 caractères et chaînes de caractères
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 pour les entrées/sorties
Quelques fonctions standards
Elodie Laine – 17.10.2018
34. H. Richard – 11.09.2014
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)
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))
Une fonction s’exécute toujours dans le contexte dans lequel elle a été définie.
=> 8
=> appel de x : 150
=> appel de y : 250
Fonctions anonyme et fermeture
Elodie Laine – 17.10.2018
35. H. Richard – 11.09.2014
def mettre_au_carre(x):
return x ** 2
def appliquer_fonction(fonc, valeur):
return fonc(valeur)
print appliquer_fonction(mettre_au_carre, 3) => 9
Une fonction callback est une fonction particulière qui, une fois définie,
sera utilisée en argument d’une autre fonction.
En pratique, rien ne permet de différencier les fonctions callback des
autres en Python.
Fonction callback
Elodie Laine – 17.10.2018
36. H. Richard – 11.09.2014
• 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.
Conclusion
Elodie Laine – 17.10.2018
Notas del editor
Une population a un effectif initial de 100 individus et croit de 5% tous les ans. On veut connaître le gain de population au bout de 20 ans.
En python, on lit au clavier avec la fonction raw_input()
>> a=raw_input()
10
>> print a
10
Ou bien la fonction input en python 3
>> user_input = input(‘Give me a number: ‘)
Give me a number: 10
>> user_input
‘10’
>> type(user_input)
<class ‘str’>
Formulation d’un algorithme général où on identifie les entrées et les sorties. Insister sur l’intérêt de ne pas codé en dur les valeurs des paramètres d’entrée : on peut maintenant faire varier l’effectif initial, le taux de croissance et la durée d’observation selon le problème posé
Étape supplémentaire : on s’est affranchi des paramètres, maintenant on introduit de la modularité dans le code. On evite de répéter les instructions
Faire un petit schema au tableau illustrant les différents sous-programmes par des blocs rectangulaires avec des liens entre eux
On cherche le minimum entre deux entiers (d’où le nom minimum2)
On reprend l’algorithme général et on le transforme en une fonction : bien identifier où se trouvent maintenant les entrées et les sorties
Les paramètres formels sont ceux définis au niveau de la déclaration de A, les paramètres effectifs sont ceux donnés à A par B lors de son appel
Insister sur l’intérêt de la signature en tant qu’identifiant unique d’une fonction
Le cycle cellulaire est l’ensemble des modifications qu’une cellule subit entre sa formation par division à partir d’une cellule mère et le moment où cette cellule a fini de se diviser en deux cellules filles. La durée du cycle cellulaire varie d’une espèce à l’autre et d’un type cellulaire à l’autre. Des cellules humaines en culture se divisent environ toutes les 24 heures tandis qu’une levure bourgeonnante mettra seulement 90 minutes à faire le tour de son cycle.
On distingue au microscope deux stades à ce cycle cellulaire :
La mitose qui est la division de la cellule en deux cellules filles
L’interphase qui est la période entre deux mitoses.
Pendant l’interphase les chromosomes sont décondensés et distribués dans tout le noyau. Au niveau moléculaire, l’interphase est la période pendant laquelle croissance cellulaire et réplication de l’ADN s’effectuent de manière coordonnée en vue de la division cellulaire. La cellule grossit progressivement pendant toute l’interphase, la plupart doublant de taille entre leur naissance et leur division en deux cellules filles.
Trois phases se succèdent pendant l’interphase : une phase de croissance de la cellule (G1), une phase de réplication de l’ADN (S) et une phase de croissance et de préparation à la mitose (G2).
A la fin de la phase G1 et de la phase G2, il existe ce qu’on appelle des points de contrôle, ou "checkpoint", où la cellule contrôle que tout est parfaitement mis en place pour que respectivement la réplication de l’ADN et la mitose se déroulent normalement.
Etant donné un cycle cellulaire de 24 heures, on cherche à déterminer à quel stade de développement est une cellule au bout de x heures après la dernière division cellulaire.
Etant donné un cycle cellulaire de 24 heures, on cherche à déterminer à quel stade de développement est une cellule au bout de x heures après la dernière division cellulaire.
Généralisation : il faut rentrer en paramètre la durée totale d’un cycle et déterminer les étapes à partir d’une fraction de la durée totale, provided that cette fraction est la même pour tous les types cellulaires.
Déclaration et définition..?
Déclaration et définition..?
prem(20)
n=2 ; d=void
n=3 ; d=2 ; 3%2=1 ; 3 est premier
n=4 ; d=2 ; 4%2=0 ; 4=2*2 et on s’arrete puisqu’il suffit de trouver un diviseur (d’où le break)
n=5 ; d=2 ; 5%2=1 ; d=3 ; 5%3=2 ; d=4 ; 5%4=1 ; 5 est premier
A vérifier !
Qu’est-ce qu’un itérateur en python, est-ce qu’on peut rapprocher ce concept d’un énuméré ?
What about les méthodes du module string qui sont deprecated et disparaaisent avec python 3.0 ?
he print statement has been replaced with a print() function in Python 3
print([object, ...][, sep=' '][, end='\n'][, file=sys.stdout] )
open(file[, mode='r'[, buffering=None[, encoding=None[, errors=None[, newline=None[, closefd=True]]]]]])
Comment traduire callbask et faire passer le concept ? Une bonne transition vers la récursivité…?