Académique Documents
Professionnel Documents
Culture Documents
Les Fonctions
Les Fonctions
Les sous-programmes
Notion de sous-programme
La librairie standard
Les procédures
instruction1
instruction2
instruction3
instruction4 Blocs d’instructions identiques.
instruction5
instruction6
instruction2 Pour éviter d’avoir à écrire plusieurs fois les
instruction3 mêmes instructions, nous pouvons les écrire
instruction4 dans un sous-programme et faire appel à ce
instruction7 sous-programme chaque fois que le bloc doit
instruction8 être exécuté.
instruction2
instruction3
instruction4
instruction9
Notion de sous-programme
Programme principal
instruction1
SP Sous-programme (ou routine)
instruction5
instruction6 SP
SP instruction2
instruction7 instruction3
instruction8 instruction4
SP retour
instruction9
Notion de sous-programme
Exécution du programme :
instruction1
SP
instruction5
instruction6 SP
SP instruction2
instruction7 instruction3
instruction8 instruction4
SP retour
instruction9
Notion de sous-programme
Exécution du programme :
instruction1
Appel du sous-programme
SP
instruction5
instruction6 SP
SP instruction2
instruction7 instruction3
instruction8 instruction4
SP retour
instruction9
Notion de sous-programme
Exécution du programme :
instruction1
SP
instruction5
instruction6 SP
SP instruction2
instruction7 instruction3
instruction8 instruction4
SP retour
instruction9
Notion de sous-programme
Exécution du programme :
instruction1
SP
instruction5
instruction6 SP
SP instruction2
instruction7 instruction3
instruction8 instruction4
SP retour
instruction9
Notion de sous-programme
Exécution du programme :
instruction1
SP
instruction5
instruction6 SP
SP instruction2
instruction7 instruction3
instruction8 instruction4
SP retour
instruction9
Notion de sous-programme
Exécution du programme :
instruction1
SP
instruction5
instruction6 SP
SP instruction2
instruction7 instruction3
instruction8 instruction4
SP retour
instruction9
Notion de sous-programme
Exécution du programme :
instruction1
SP
instruction5
instruction6 SP
SP instruction2
instruction7 instruction3
instruction8 instruction4
SP retour
instruction9
Notion de sous-programme
Exécution du programme :
instruction1
SP
instruction5
instruction6 SP
SP instruction2
instruction7 instruction3
instruction8 instruction4
SP retour
instruction9
Notion de sous-programme
Exécution du programme :
instruction1
SP
instruction5
instruction6 SP
SP instruction2
instruction7 instruction3
instruction8 instruction4
SP retour
instruction9
Notion de sous-programme
Exécution du programme :
instruction1
SP
instruction5
instruction6 SP
SP instruction2
instruction7 instruction3
instruction8 instruction4
SP retour
instruction9
Notion de sous-programme
Exécution du programme :
instruction1
SP
instruction5
instruction6 SP
SP instruction2
instruction7 instruction3
instruction8 instruction4
SP retour
instruction9
Notion de sous-programme
Exécution du programme :
instruction1
SP
instruction5
instruction6 SP
SP instruction2
instruction7 instruction3
instruction8 instruction4
SP retour
instruction9
Notion de sous-programme
Exécution du programme :
instruction1
SP
instruction5
instruction6 SP
SP instruction2
instruction7 instruction3
instruction8 instruction4
SP retour
instruction9
Notion de sous-programme
Exécution du programme :
instruction1
SP
instruction5
instruction6 SP
SP instruction2
instruction7 instruction3
instruction8 instruction4
SP retour
instruction9
Notion de sous-programme
Exécution du programme :
instruction1
SP
instruction5
instruction6 SP
SP instruction2
instruction7 instruction3
instruction8 instruction4
SP retour
instruction9
Notion de sous-programme
Exécution du programme :
instruction1
SP
instruction5
instruction6 SP
SP instruction2
instruction7 instruction3
instruction8 instruction4
SP retour
instruction9
Notion de sous-programme
Exécution du programme :
instruction1
SP
instruction5
instruction6 SP
SP instruction2
instruction7 instruction3
instruction8 instruction4
SP retour
instruction9
Notion de sous-programme
Exécution du programme :
instruction1
SP
instruction5
instruction6 SP
SP instruction2
instruction7 instruction3
instruction8 instruction4
SP retour
instruction9
Notion de sous-programme
Exécution du programme :
instruction1
SP
instruction5
instruction6 SP
SP instruction2
instruction7 instruction3
instruction8 instruction4
SP retour
instruction9
Notion de sous-programme
Chaque fois qu’un sous-programme est appelé par son nom, ses instructions
sont exécutées comme si elles figurées dans le corps principal appelant.
Les fonctions
Les procédures
Les fonctions sont des routines qui retournent systématiquement une valeur au
programme appelant, ce qui permet de les utiliser dans des expressions.
Exemple :
>>> a = 2
>>> b = 5
>>> hypothenuse = sqrt(a**2 + b**2)
>>> hypothenuse
5.385164807134504
Notion de sous-programme
Une procédure génère un effet de bord qui peut être la modification d’une
valeur en mémoire, l’affichage d’un message à l’écran… (modification de
l’environnement d’exécution).
Exemple :
Soit une procédure, nommée double, dont le rôle est de multiplier par deux la
valeur de la variable globale n (modification de la valeur en mémoire).
>>> n = 5
>>> double()
>>> print('La valeur de n vaut maintenant', n)
La valeur de n vaut maintenant 10
L’instruction print est aussi une procédure car elle ne renvoie pas de valeur.
Elle modifie simplement l’environnement en affichant des valeurs… (il n’y a
pas d’apostrophes autour de la chaîne affichée).
Les sous-programmes
Notion de sous-programme
La librairie standard
Les procédures
Ces fonctions sont regroupées dans des fichiers séparés que l'on appelle des
modules.
https://docs.python.org/3/library/index.html
La librairie standard : Utilisation des fonctions standard
Pour pouvoir utiliser des fonctions standard dans vos programmes il faudra
d’abord les importer des différents modules.
>>> sqrt(2)
Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
NameError: name 'sqrt' is not defined
La librairie standard : Utilisation des fonctions standard
>>> sqrt(2)
1.4142135623730951
Une autre raison de ne pas importer la totalité des modules est d'éviter
d'éventuels conflits qui peuvent se produire lorsque des fonctions intégrées
dans les différents modules importés portent le même nom.
Par exemple, la fonction sqrt est définie à la fois dans le module math, mais
aussi dans le module cmath (nombres complexes) :
La fonction sqrt étant définie dans les deux modules (cmath et math), c’est
la fonction qui se trouve dans le dernier module importé qui est utilisée…
La librairie standard : Utilisation des fonctions standard
Il est maintenant explicite que la fonction sqrt appelée est celle provenant du
module cmath, et il n'y a donc plus d'erreurs d'exécution.
La librairie standard : Utilisation des fonctions standard
Une fois qu’une fonction est importée, il est possible d’obtenir de l’aide sur
l’utilisation de celle-ci grâce à la l’instruction help.
>>> help(sqrt)
Help on built-in function sqrt in module math:
sqrt(...)
sqrt(x)
Notion de sous-programme
La librairie standard
Les procédures
• une sortie : valeur(s) renvoyée(s) par la fonction, une fois les calculs
terminés.
Les fonctions originales
Soit une fonction, appelée triple, qui ne reçoit qu’un seul paramètre nommé
valeur.
def triple(valeur) :
resultat = valeur * 3
return resultat
Ou plus directement :
def triple(valeur) :
return valeur * 3
Les fonctions originales : Appel de fonction
Pour pouvoir utiliser une fonction une fois qu'elle est écrite, il faut l'appeler.
Lors de l’appel d’une fonction, les valeurs des paramètres réels (ou arguments)
sont affectées aux paramètres formels.
paramètre formel
def triple(valeur) :
resultat = valeur * 3
return resultat
entier = 3
triple_entier = triple(entier)
paramètre réel
Les fonctions originales : Appel de fonction
Python utilise l’inférence de type lors de la création des variables, ceci est
également vrai lors du passage des arguments entre fonction appelante et
fonction appelée.
Les 3 types de variable int, float et string peuvent être utilisés en paramètre
de la fonction triple du fait de la tolérance de l'opérateur * dans Python.
def triple(valeur) :
resultat = valeur * 3
return resultat
Les fonctions originales : Appel de fonction
>>> triple(3)
9
paramètre réel de type int
Les fonctions originales : Appel de fonction
>>> triple(1.5)
4.5
paramètre réel de type float
Les fonctions originales : Appel de fonction
>>> triple('Oh!')
'Oh!Oh!Oh!'
paramètre réel de type str
Dans ce cas, les paramètres réels doivent être passés à la fonction dans le
même ordre que celui des paramètres formels correspondant à la définition
de la fonction.
>>> valeur_a = 8
>>> valeur_b = 2
>>> de_six_faces()
5
>>> de_six_faces()
2
Une fonction (au sens strict) doit toujours renvoyer une valeur lorsqu'elle se
termine. Ce qui signifie qu'une fonction doit impérativement contenir une
instruction return dans son code.
Une fonction peut s'utiliser à la droite du signe égal (qui représente l'affectation)
dans des expressions.
Pour que l'appel à une fonction soit utile, la valeur qu'elle renvoie doit être soit
affectée à une variable, soit utilisée directement dans une expression plus ou
moins complexe ou encore affichée à l’écran :
>>> a = 2
>>> coef = 5 + triple(a) / 2
Un prédicat est une fonction qui retourne une valeur booléenne (True ou False).
La valeur à retourner peut être déterminée sans passer nécessairement par une
structure conditionnelle (if… else…).
return resultat
Les sous-programmes
Notion de sous-programme
La librairie standard
Les procédures
Dans certains cas, une fonction ne renvoie pas de valeur. On parle alors de
procédure.
Une procédure génère un effet de bord qui peut être la modification d’une
valeur en mémoire, l’affichage d’un message à l’écran… (modification de
l’environnement d’exécution).
Du fait qu’elle ne renvoie pas de valeur, une procédure ne peut pas être
utilisée dans une expression…
Les fonctions originales : Procédures
>>> bonjour("John")
Bienvenue en L1 John !
Comme une procédure ne renvoie pas de valeur, l’instruction return n’est pas
obligatoire…
>>> bonjour("John")
Bienvenue en L1 John !
Les fonctions originales : Procédures
>>> x = bonjour("John")
Bienvenue en L1 John !
>>> x
None
>>> print(bonjour("John"))
Bienvenue en L1 John !
None
Les fonctions originales : Procédures
>>> n = 3
>>> m = 2 + double()
Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
En Python, une procédure est considérée comme une fonction qui ne retourne
rien (None).
Les sous-programmes
Notion de sous-programme
La librairie standard
Les procédures
Une fonction a pour objectif d'être réutilisée dans un programme, soit par son
auteur, soit par un(des) autre(s) programmeur(s)/utilisateur(s).
Il est donc important de décrire toutes les fonctions sinon elles seront
difficilement réutilisables…
• La documentation : docstring
Les termes écrits entre : sont des balises, ils identifient des informations
particulières de la docstring. Il est important de respecter cette syntaxe car
elle est utilisée par le générateur de documentation Sphinx pour extraire la
documentation et la mettre en forme dans des fichiers PDF ou HTML.
Les fonctions originales : Description d’une fonction : docstring
Exemple de docstring
>>> help(plus_grande_racine)
Help on function plus_grande_racine in module __main__:
plus_grande_racine(a, b, c)
Renvoie la plus grande racine du polynome
de second degré a(x*x) + bx + c
:param a: (int or float) coefficient a (associé à x*x)
:param b: (int or float) coefficient b (associé à x)
:param c: (int or float) coefficient c (constant)
:return: (float) la plus grande racine du polynome
Les fonctions originales : Description d’une fonction : CU
Les paramètres que l’on passe à une fonction peuvent être soumis à des
contraintes à respecter si l’on veut que le calcul se déroule sans incident.
Par exemple, la racine carrée d’un nombre réel négatif n’est pas définie. Voici
ce qu'il se passe lorsque l'on fournit un nombre négatif à la fonction sqrt en
Python :
Les nombres que l’on passe à la fonction sqrt doivent être positifs ou nuls.
C’est une contrainte d’utilisation (CU) de cette fonction.
Les fonctions originales : Description d’une fonction : CU
Tout appel à cette fonction avec les coefficients d’un polynôme dont le
discriminant est négatif déclenchera la même erreur.
>>> plus_grande_racine(1, 1, 1)
Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
File "<pyshell>", line 13, in plus_grande_racine
ValueError: math domain error
>>> plus_grande_racine(0, 1, 1)
Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
File "<pyshell>", line 13, in plus_grande_racine
ZeroDivisionError: float division by zero
• b2 − 4ac ≥ 0
•a≠0
Cela se formalise par une ligne commençant par CU, suivie des différentes
contraintes d'utilisation.
Les fonctions originales : Description d’une fonction : CU
Les lignes contenant des instructions Python devant être considérées comme
doctest doivent être incluses dans la spécification et commencer par >>> qui
est l'invite de commande de l'interpréteur Python.
Sur la ligne suivante, le résultat attendu de l'expression doit être écrit tel qu'il
apparaît dans l'interpréteur.
Les fonctions originales : Description d’une fonction : doctests
Exemples :
>>> plus_grande_racine (1, 1, -6)
2.0
>>> plus_grande_racine (3, 8, 5)
-1.0
"""
delta = b**2 - 4*a*c
x1 = (-b + sqrt(delta)) / (2*a)
x2 = (-b - sqrt(delta)) / (2*a)
return max(x1, x2)
Les fonctions originales : Description d’une fonction : doctests
Une fois les tests rédigés, ils peuvent être lancés automatiquement à l’aide de
la fonction testmod intégrée dans le module nommé doctest.
Exemples :
>>> plus_grande_racine (1, 1, -6)
2.0
>>> plus_grande_racine (3, 8, 5)
-1.0
>>> plus_grande_racine (2, 1, -6)
2.0
"""
delta = b**2 - 4*a*c
x1 = (-b + sqrt(delta)) / (2*a)
x2 = (-b - sqrt(delta)) / (2*a)
return max(x1, x2)
Les fonctions originales : Description d’une fonction : doctests
Dans ce cas, l'interpréteur affiche un message d'erreur qui peut être assez
long.
Exemples :
>>> plus_grande_racine (1, 1, -6)
2.0
>>> plus_grande_racine (3, 8, 5)
-1.0
>>> plus_grande_racine (1, 1, 1)
Traceback (most recent call last): delta = 1**2 – 4*1*1 = -3
... sqrt(-3) erreur
ValueError: math domain error
""" >>> from math import sqrt
delta = b**2 - 4*a*c >>> sqrt(-3)
x1 = (-b + sqrt(delta)) / (2*a) Traceback (most recent call last):
x2 = (-b - sqrt(delta)) / (2*a) File "<pyshell>", line 1, in <module>
return max(x1, x2) ValueError: math domain error
Les fonctions originales : Description d’une fonction : doctests
>>> doctest.testmod(optionflags=doctest.NORMALIZE_WHITESPACE |
doctest.ELLIPSIS, verbose = True)
Trying:
plus_grande_racine (1, 1, -6)
Expecting:
2.0
ok
Trying:
plus_grande_racine (3, 8, 5)
Expecting:
-1.0
ok
Trying:
plus_grande_racine (1, 1, 1)
Expecting:
Traceback (most recent call last):
...
ValueError: math domain error
ok
1 items had no tests:
__main__
1 items passed all tests:
3 tests in __main__.plus_grande_racine
3 tests in 2 items.
3 passed and 0 failed.
Test passed.
TestResults(failed=0, attempted=3)
Les fonctions originales : Description d’une fonction