Les fonctions¶
Une fonction ou une procédure sont des blocs d'instructions que l'on a nommé et que l'on peut utiliser par la suite en les rappelant par leur nom.
L'utilisation d'une fonction ou d'une procédure se fait en deux étapes:
- Sa définition: on définie son nom, ses paramètres et la suite d'instructions à exécuter;
- Son appel , call en anglais: on utilise la fonction avec des arguments explicites donnés au paramètres.
Nous avons déjà appelé quelques fonctions intégrées, builtin en anglais, à Python comme type
ou float
. Vous trouverez ici l'ensemble de ces fonctions intégrées.
Un exemple important est la fonction print
qui permet d'afficher du texte dans la console.
Elle prend en argument des expressions séparées par des virgules. Elle les évalue puis affiche les résultats séparés par une espace quelque soit le type du résultat puis va à la ligne. Vous trouverez dans la documentation les options de cette fonction.
Exemple
Exécutez le programme suivant:
La définition d'une fonction¶
La syntaxe de la déclaration d'une fonction est la suivante:
def nom_fonction(parametres):
bloc_instructions1
bloc_instruction2
def
suivie du nom de la fonction.
Les paramètres s'il y en a sont séparés par des virgules en donnant éventuellement leur type.
La première ligne se termine par un deux-points.
Le contenu de la fonction est le bloc bloc_instructions_1
qui est indenté de 4 espaces (ou d'une tabulation).
Il n'est exécuté que lors de l'appel de la fonction. Le bloc bloc_instructions_2
, s'il existe, est toujours exécuté.
Une fonction renvoie une valeur ou plusieurs valeurs: pour cela on utilise l'instruction return
. Lorsque l'instruction return
est exécutée la fonction se termine en renvoyant la valeur de la ou les expressions qui la suive.
Exemple
def prix_ttc(ht: float, tva: float) -> float:
ttc = ht * ( 1 + tva / 100)
return ttc
prix_ttc
. Elle a deux paramètres ht
et tva
. Le contenu de la fonction contient une première ligne qui affecte et définie une variable ttc
contient le calcul du prix ttc. La seconde ligne renvoie le prix ttc.
Les annotations de type ht:float
et -> float
ne sont pas obligatoires mais permettent à l'utilisateur de la fonction de connaitre le type des arguments attendus par celle-ci.
Pour en savoir plus sur les annotations de type
Remarque
Il faut faire la différence entre
return
et print
.
- Le mot clé
return
est suivi de l'expression à retourner par la fonction, mais n'affiche rien. Cela permet, comme dans l'exemple d'affecter la valeur retournée à une variable. - La fonction
print
produit un affichage, elle retourneNone
On ne peut affecter une variable à l'aide d'une fonctionprint
Définir une procédure¶
En Python, une procédure est une fonction que ne contient pas l'instruction return
.
Une procédure peut par exemple réaliser des affichages, des tracés ou écrire dans un fichier. Elle renverra alors implicitementNone
.
Exemple
def affichage(texte:str):
print('************')
print('**' + texte + '**')
print('************')
affichage
elle a un argument nommé texte
de type chaîne de caractères. Le bloc d'instructions contient la fonction #!python print
qui permet d'afficher du texte dans la console.
Appel d'une fonction ou d'une procédure¶
Pour appeler une fonction, il suffit d'utiliser la syntaxe:
nom_fonction(arguments)
Exemple
C'est un programme complet.
Les premières lignes définissent la fonction prix_tva
.
La ligne 6 appelle cette fonction avec les arguments ht = 200
et tva = 20
. Le résultat est affecté à la variable prix_tva
.
Ainsi prix_tva
est affecté de la valeur \(200 \times \left( 1 + \frac{20}{100}\right) = 200 \times 1,2\) soit \(240\).
La dernière ligne affiche "200 euros hors taxe soit 240.0 euros ttc"
dans la console.
Remarque
Les variables définie dans le bloc d'instruction et les noms des paramètres sont locaux à la fonction. On ne peut pas, par exemple, accéder au contenu de la variable tva
ou à celui de la variable ttc
en dehors de la fonction prix_ttc
. Pour plus de détails voir la partie suivante.
Pour vérifier qu'une fonction fait ce qui est attendu, une bonne pratique consiste à faire un jeu de tests.
Exemple
def somme(a,b):
return a + b
assert somme(2,2) == 4, "2 + 2 doit être égal à 4"
assert somme (0,5) == 5, "0 + 5 doit être égal à 5"
Ce programme n'affichera rien. Les deux premières lignes permettent de définir une fonction somme
qui renvoie la somme des deux nombres donnés en paramètre. Les deux dernières lignes teste cette fonction.
La syntaxe de l'instruction assert
est :
assert condition, "message d'erreur"
- Si la condition est vérifiée, le programme continue;
- Si la condition n'est pas vérifiée, le message d'erreur s'affiche et le programme s'arrête. La suite du programme ne sera pas exécutée.
Notion de variables locales et globales.¶
Les variables définies à l'intérieur d'une fonction sont dites locales.
Les variables définies à l'extérieur des fonctions sont des variables globales.
Le contenu d'une variable globale est accessible à l'intérieur d'une fonction mais ne peut être modifier.
Le contenu d'une variable locale n'est accessible qu'à l'intérieur de la fonction dans laquelle elle est définie.
Une bonne pratique de programmation consiste à ne pas modifier dans une fonction une variable globale. Il y a quelques exceptions où cela est nécessaire. Python le permet en utilisant le mot clé global
.
Attention
L'usage du mot clé global
est interdit sauf cas très particulier.
Exemples
a = 3 # variable globale
def test():
a = 2 #variable locale
print(a)
test() # affiche la valeur de la variable locale a
print(a) # affiche la valeur de la variable globale a
Ce programme affiche "2" la valeur associée à la variable locale a
contenu dans la fonction test
puis "3" la valeur associée à la variable globale a
.
2
3
def test():
a = 2
b = 3
print(a,b)
Ce programme retourne l'erreur NameError: name 'a' is not defined
La variable a
est locale ainsi elle n'existe que dans la fonction test
; elle n'est pas définie lorsqu'elle est appelée par la fonction print
.
Remarque: Lors du message d'erreur le programme s'arrête. Il n'y a pas de message d'erreur disant que la variable b
n'est pas définie alors qu'elle aussi n'est pas définie car locale.
a = 3
def test(a):
a = 0
return a + 1
print(test(a),a)
a = 0
dans la fonction remplace la valeur associée à l'argument a
de la fonction test
. La variable globale a
n'a pas été modifiée.
Ce programme affiche:
1 3
a = 3
def test():
a = a + 1
return a
test()
UnboundLocalError: local variable 'a' referenced before assignment
test
la variable a
est locale. Il n'est pas possible d'y faire référence pour évaluer a + 1
alors qu'elle n'a pas été définie.
Il est possible d'accéder dans une fonction à la valeur associée à une variable globale si elle n'est pas modifiée.
a = 3
def test():
b = a + 1
return b
print(test())
4
.
a = 3
def test():
global a
a = a + 1
return a
print(test(),a)
Ce programme affiche:
4 4
a
n'est pas un argument de la fonction test
mais le mot clé global
permet de la modifier. Dans la fonction la variable globale a
est associé à 4. Après l'appel de cette fonction, la variable globale a
est associée à 4.
Pour approfondir¶
La documentation python présente d'autres notions liées aux fonctions comme les valeur par défaut des paramètres, les paramètres nommés et les listes de paramètres arbitraires.