Le programme 2019
insiste particulièrement sur la notion de fonction :
La démarche algorithmique est, depuis les origines, une composante essentielle
de l’activité mathématique. Au cycle 4, en mathématiques et en technologie,
les élèves ont appris à écrire, mettre au point et exécuter un programme simple.
Une consolidation des acquis du cycle 4 est proposée autour de deux idées essentielles :
- la notion de fonction ;
- la programmation comme production d’un texte dans un langage informatique.
En programmation, le rôle principal des fonctions est d'organiser le code en petites
unités logiques, en petites unités de traitement aux rôles bien distincts.
Ce découpage facilite la lecture d'un programme (et en facilite la maintenance).
Un autre rôle essentiel est de factoriser le code, c'est-à-dire d'éviter d'avoir
à écrire à plusieurs endroits du programme des bouts de code similaires.
En classe de seconde, le rôle essentiel des fonctions pourra être de coder une fonction
mathématique ou un algorithme de recherche.
Définir une fonction en langage Python
Prenons l'exemple d'une fonction prenant en entrée un nombre x
(c'est-à-dire une variable de type float
ou de type
int
) et renvoyant en sortie le carré de x
.
Au collège, avec le langage Scratch, les élèves
définissaient cette fonction ainsi :
En Python, la même fonction sera définie
comme ci-dessous :
- Le mot clef
def
annonce que le nom
qui suit (ici carre
) sera une fonction.
- On indique ensuite entre parenthèses le ou les paramètres (il peut
ne pas y avoir de paramètre).
- Les deux points «
:
» permettent de déclarer
le début du bloc d'instructions qui composent
cette fonction. Ce bloc doit obligatoirement être
indenté.
- On indique l'image (ce que renvoie la fonction) grâce au mot-clef
return
(en l'absence d'un
return
explicite, Python renvoie
systématiquement l'objet None
).
Entrée, sortie et fonction
Les notions d'entrée et de sortie sont naturellement attachées à la notion de fonction.
Dans le cas des fonctions, on précisera souvent en parlant des
paramètres d'entrée (on parle aussi
d'«arguments» de la fonction dans la littérature informatique)
et des valeurs renvoyées (on trouve aussi
« valeurs retournées » dans la littérature informatique,
il s'agit a priori d'une mauvaise traduction de l'anglais
return).
Il est important de bien distinguer
entre :
- la valeur renvoyée par un algorithme (la sortie de l'algorithme);
- et un affichage à l'écran d'un résultat.
Dans l'exemple trivial de la fonction carre()
:
- Le paramètre d'entrée est
x
(il pourrait y en avoir d'autres,
il pourrait ne pas y en avoir).
- La valeur renvoyée est
x*x
, c'est-à-dire x²
.
Spécifier une fonction
Dans la suite de ces pages, nous utiliserons l'expression spécifier une fonction. Il s'agira :
- de préciser quelles sont les données (paramètres) d'entrée,
- de préciser quel est le résultat (la/les valeurs) renvoyé,
- d'indiquer quelles sont les propriétés qui relient les données et le résultat.
Par exemple, voici une spécification de la fonction carre()
:
Paramètre |
Un flottant x
|
Valeur renvoyée |
Le carré de x |
Compléments sur la spécification d'une fonction
Spécifier une fonction, c'est donc donner le cahier des charges de cette fonction :
que calcule-t-elle et à partir de quelles entrées ?
Par contre, la spécification ne s'occupe pas de dire comment
se fait ce calcul (notamment la spécification n'explicite pas d'algorithme).
La phase de spécification est donc suivie d'une phase d'implantation (on trouve aussi le mot
« implémentation »). En informatique, on parle en général à ce stade de définir
la fonction : c'est le comment. Une même spécification peut donc donner lieu à plusieurs
implantations.
Dans un travail informatique, si l'on veut que les élèves utilisent une fonction sans la définir eux-mêmes
(par exemple parce que ce serait trop difficile ou trop long, ou déjà réalisé quelques semaines auparavant...),
il sera nécessaire de préciser la spécification de cette fonction aux élèves (la spécification peut alors
être considérée comme un mode d'emploi de la fonction), mais il n'est pas besoin d'en
préciser la définition (c'est-à-dire le détail de l'algorithme permettant de transformer les entrées en sortie).
Exemple
Voici la spécification d'une fonction nommée est_racine()
:
Paramètre |
Un entier relatif n.
|
Valeur renvoyée |
True si n est racine du trinôme $ x \longmapsto x^2 - x - 6 $, False sinon. |
Deux codes différents peuvent satisfaire la spécification de cette
fonction :
def est_racine(n):
return n*n - n - 6 == 0
et
def est_racine(n):
return n == -2 or n == 3