4 Fonctions - Cours
4 Fonctions - Cours
4 Fonctions - Cours
L1 Mathématiques - L1 Informatique
Semestre 1
Chapitre 4 - Fonctions
En programmation, une fonction est un morceau de programme, portant en général un nom, acceptant zéro, un ou
plusieurs paramètres et produisant le plus souvent un résultat. Des exceptions existent, mais la forme la plus courante
d'une fonction est donc proche de celle d'une fonction mathématique.
Lisibilité : séparer une partie du programme (par exemple un gros calcul compliqué)
Modularité : réutiliser le même code plusieurs fois (évite de recopier le code)
Généricité : changer la valeur des paramètres (même calcul mais avec différentes valeurs de départ)
int(obj) : 1 paramètre, 1 résultat. Reçoit en paramètre un objet (par exemple str ou float ), essaie de le
transformer en entier et renvoie l'entier obtenu.
In [ ]: int("34")
len(obj) : 1 paramètre, 1 résultat. Reçoit un objet (par exemple str ) et renvoie sa longueur.
In [ ]: len("34")
randint(mini, maxi) : 2 paramètres, 1 résultat. Reçoit deux nombres, et renvoie un entier aléatoire compris
entre ces deux nombres (inclus).
Ces fonctions sont appelées prédéfinies (ou built-in). Il n'est bien sûr pas question de les connaître toutes par coeur. La
totalité des fonctions prédéfinies de Python est documentée (https://docs.python.org/3/), en particulier sur cette page
(https://docs.python.org/3/library/functions.html).
Il existe également de nombreux modules officiels (par exemple le module random ), c'est-à-dire des bibliothèques de
fonctions, de types et d'objets, dont on trouvera la description ici (https://docs.python.org/3/library).
Définition de fonction
Pour définir une nouvelle fonction on utilise la syntaxe suivante :
Appel de fonction
Une fois définie, nom_fonction peut être utilisée dans le code (on parle d'un appel) en indiquant entre parenthèses
ses paramètres séparés par des virgules :
# définition de fonction
def nom_fonction(param_1, ..., param_n):
...
# reste du programme
...
# appel de la fonction :
une_var = nom_fonction(expr_1, ..., expr_n)
Il n'est pas possible d'appeller une fonction qui n'est pas définie au moment de l'appel !
nb1 = int(input())
nb2 = int(input())
def lance_de() :
return randint(1,6)
compteur = 1
while lance_de() != 6:
compteur = compteur + 1
print('Obtenu un 6 en', compteur, 'jets de dé.')
Comment écrire un programme vérifiant si trois entiers sont premiers entre eux à l'aide de cette fonction ?
Combien ce programme ferait-il de saisies ?
Qu'afficherait ce programme ?
Composition de fonctions
# programme principal :
m = int(input())
n = int(input())
o = int(input())
if (premiers_entre_eux(m, n)
and premiers_entre_eux(n, o)
and premiers_entre_eux(o, m)):
print("tous premiers entre eux")
nb1 = int(input())
nb2 = int(input())
c = maximum(nb1, nb2)
print("le max de", nb1, "et", nb2, "est", c)
a = int(input())
b = int(input())
c = maximum(a, b)
print("le max de", a, "et", b, "est", c)
Essayons d'écrire une fonction permettant d'intervertir les valeurs de deux variables :
x = 1
y = 2
echange(x, y)
print(x, y)
print(temp)
Un espace de noms est un ensemble de noms (de variables, fonctions...) définies à un certain point d'un programme.
L'ensemble de tous les noms connus à un point du programme peut être constitué de plusieurs espaces de noms
superposés (du plus bas au plus haut) :
espace de nom global contenant les variables (fonctions, classes...) définies directement dans le programme
principal ;
empilement des espaces de noms locaux des appels de fonction en cours, dans l'ordre chronologique, contenant
chacun les paramètres de l'appel correspondant ainsi que les variables définies dans le corps de cette fonction
(variables locales).
L'empilement des espaces de noms locaux obéit à une politique de pile : le sommet correspond au dernier appel en
date. Quand cet appel se termine, son espace de nom est supprimé de la pile et l'exécution de l'appel précédent
reprend. Quand un nouvel appel est effectué, l'exécution de la fonction en cours s'interrompt, un nouvel espace de noms
local est créé et l'exécution de la fonction appelée commence.
En Python, il est possible d'accéder en lecture à n'importe quel nom défini dans un des espaces de noms empilés. Si
plusieurs espaces contiennent le même nom, c'est l'espace de nom le plus récent qui est sélectionné. Pour accéder en
écriture à une variable qui n'est pas dans l'espace de nom le plus récent, il faut utiliser les mots-clés global ou
non-local (à utiliser avec précaution).
Création d'un espace de noms local contenant p_1 à p_n au sommet de la pile d'appels
Chaque expression e_i est évaluée en une valeur v_i et affectée à la variable p_i
Exécution du corps de la fonction dans l'espace de noms local
Si la fonction exécute l'instruction return expr ou atteint la fin de son bloc d'instructions, l'espace de noms
local est détruit et l'expression appelante ma_fonction(e_1, ..., e_n) prend la valeur de expr
(respectivement None )
Reprise du programme principal dans l'espace global
Les noms p_1 à p_n sont parfois appelés paramètres formels, les valeurs v_1 à v_n paramètres effectifs. On
appelle parfois aussi paramètres (tout court) les paramètres formels et arguments les paramètres effectifs.
Entraînement : Pour chacun des trois exemples précédent, dessiner l'évolution de l'état de la mémoire pendant
l'exécution. Vérifier à l'aide de Python Tutor.
Documentation et test de fonctions
In [ ]: def triple(nombre):
'''
Fonction calculant le triple d'un nombre.
Paramètre : nombre (int ou float)
Résultat : le triple de nombre (même type)
'''
return nombre * 3
On peut accéder à la chaîne de documentation d'une fonction en tapant help(nom de la fonction) dans
l'interpréteur :
In [ ]: help(triple)
In [ ]: triple(3)
In [ ]: triple(9.0)
Plutôt que de perdre ces tests, il est utile de les intégrer à la documentation de la fonction, pour pouvoir s'y référer plus
tard. Si l'on change le code de la fonction, cela permet aussi de vérifier que son comportement reste correct.
In [ ]: def triple(nombre):
'''
Fonction calculant le triple d'un nombre.
Paramètre : nombre (int ou float)
Résultat : le triple de nombre (même type)
>>> triple(3)
9
>>> triple(9.0)
27.0
'''
return nombre + nombre + nombre + nombre
In [ ]: triple(3)
Il existe des outils qui permettent de lancer automatiquement tous les tests présents dans la documentation, et de
vérifier qu'ils produisent les résultats annoncés.
Par exemple, à la fin d'un programme, on peut écrire le code suivant pour lancer systématiquement tous les tests
présents dans le fichier :
import doctest
doctest.testmod()
Exemple :
In [ ]: def triple(nombre):
'''
Fonction calculant le triple d'un nombre.
Paramètre : nombre (int ou float)
Résultat : le triple de nombre (même type)
>>> triple(3)
9
>>> triple(9.0)
27.0
'''
return nombre * 3
def racine(nombre):
'''
Fonction calculant la racine carrée (positive) d'un nombre.
Paramètre : nombre (int ou float)
Résultat : la racine carrée de nombre (float)
>>> racine(0)
0.0
>>> racine(1)
1.0
>>> racine(4)
2.0
'''
return nombre ** (1/2)
import doctest
doctest.testmod()
In [ ]: