06 Cours Fonctions
Introduction⚓︎
Les fonctions permettent de réutiliser des blocs de code dans des endroits différents sans avoir à copier ce bloc. Un programme peut ainsi être décomposé en plusieurs modules indépendants les uns des autres. Ce qui peut être très utile dans le cadre d’un travail en équipe.
Dans certains langages, on distingue les procédures qui exécutent des instructions sans renvoyer de valeur, et les fonctions qui retournent une valeur. En Python, les procédures sont gérées par les objets de type fonctions, avec ou sans valeur de retour.
def <nom fonction>(param1, param2, ...):
<bloc d instructions>
return <valeur> # instruction optionnelle
On distingue :
- les fonctions qui renvoient un résultat, une sortie (avec
return), des fonctions sans résultat (sansreturn) - les fonctions sans paramètres (pour lesquelles
()est vide) des fonctions avec paramètres(param1, param2, ...)
<nom fonction>(param1, param2, ...) est appelé signature de la fonction.
Procédures = Fonctions sans sortie / sans résultat⚓︎
Fonctions sans sortie et sans paramètre⚓︎
Définir une fonction⚓︎
def func1(): # définition de la fonction
print('You know what?')
print("I'm happy!")
On peut également écrire return à la fin de la fonction, mais s'il n'y a rien derrière le return, elle ne renvoie rien, elle n'a pas de sortie.
def func1(): # définition de la fonction
print('You know what?')
print("I'm happy!")
return
Appeler une fonction : utiliser une fonction que l’on a définie⚓︎
# Pour appeler la fonction, et lancer son exécution, on l'appelle, avec ses parenthèses :
func1() # premier appel de la fonction
You know what?
I'm happy!
func1() # deuxième appel
You know what?
I'm happy!
# En revanche, elle ne retourne rien, il n'y a pas de valeur de retour (pas de sortie) :
print("3e appel :")
x = func1()
print(x)
3e appel :
You know what?
I'm happy!
None # si on affiche la valeur d'une procédure (qui n'a pas de return), on obtient None
Fonctions sans sortie, avec paramètres⚓︎
Pour définir une fonction qui prend des paramètres, on nomme ces paramètres entre les parenthèses de la ligne def. Ces paramètres seront définis comme des variables à l’intérieur de la fonction et recevront les valeurs passées lors des appels de celle-ci.
def func2(nom):
print("Bonjour " + nom)
Pour utiliser cette fonction avec diverses valeurs, il suffit de l’appeler en précisant dans les parenthèses la valeur du paramètre à utiliser :
func2("mesdames")
func2("messieurs")
Bonjour mesdames
Bonjour messieurs
Fonctions avec sortie / avec return⚓︎
Les fonctions utilisant return "retournent" (= "renvoient") une valeur. Ce sont les fonctions qui ressemblent le plus aux fonctions mathématiques.
On peut afficher la valeur de retour, ou la sauvegarder dans une variable, ou l'utiliser dans un calcul...
Fonction sans paramètre⚓︎
def func3(): # définition de la fonction
return "I'm happy" # cette fonction retourne une chaine de caractère
print("Premier appel : ")
func3() # premier appel de la fonction : la valeur retournée n'est pas utilisée
Premier appel :
Il faut utiliser la valeur de retour de la fonction :
print("Deuxième appel : ")
y = func3() # le retour du deuxième appel est stocké dans une variable
print(f"\tLa fonction func3() nous a renvoyé la valeur : {y}")
Deuxième appel :
La fonction func3() nous a renvoyé la valeur : I'm happy
Fonction avec paramètres⚓︎
Pour définir une fonction qui prend des paramètres, on nomme ces paramètres entre les parenthèses de la ligne def. Ces paramètres seront définis comme des variables à l’intérieur de la fonction et recevront les valeurs passées lors des appels de celle-ci.
def somme(x, y):
return x + y
Pour utiliser cette fonction avec diverses valeurs, il suffit de l’appeler en donnant les valeurs de chaque paramètre :
print(somme(1, 2)) # affiche 3
print(somme(4, 7)) # affiche 11
print(somme(2 + 2, 7)) # affiche 11
print(somme(somme(2, 2), 7)) # affiche 11
Premiers tests⚓︎
Pour vérifier à l'écran les résultats de vos fonctions, vous pouvez les appeler avec print().
Mais pour tester plus automatiquement, on peut utiliser des assertions : on utilise le mot clé assert qui signifie en substance "assure-toi que la condition est vraie, sinon, arrête le programme et envoie un message erreur adapté".
On peut utiliser assert pour tester certaines valeurs de retours de la fonction et vérifier qu'elles suivent des condtitions, ou qu'elles valent certaines valeurs attendues.
Par exemple, avec notre exemple précédent somme(x, y) :
assert somme(0, 10) == 10
assert somme(-6, 14) == 8
assert somme(-6, 6) == 0
# mais attention aux égalités de flottants !!
assert somme(0.01, 0.02) == 0.03
Lorsque les tests sont réussis, aucun message n'est envoyé, rien ne s'affiche. Mais si un test échoue, tout s'arrête, et cela produit une erreur.
Inconvénient : dès qu'un test échoue, tout s'arrête. Cela ne permet pas de lancer plusieurs tests en même temps.
On peut noter un message erreur personnalité après une virgule :
assert somme(0, 10) == 10, "erreur dans la somme de 0 et 10"
Fonctions natives⚓︎
Dans Python, de nombreuses fonctions sont déjà définies. Ces fonctions sont disponibles dans tous les contextes. La liste complète est détaillée ici. En voici une sélection :
dir(obj): retourne une liste des toutes les méthodes et attribut de l’objetobjdir(): retourne une liste de tous les objets du contexte couranteval(expr): analyse et exécute la chaîne de caractèreexpr
a = 1
b = eval('a + 1')
print(f"b est de type {type(b)} et vaut {b}")
b est de type <class 'int'> et vaut 2
-
globals(): retourne un dictionnaire des variables présentes dans le contexte global -
locals(): commeglobals()mais avec le contexte local -
help(obj): affiche l’aide au sujet d’un objet -
help(): affiche l’aide générale (s’appelle depuis l’interpréteur interactif) -
input(prompt): retourne une chaîne de caractère lue dans la console après le messageprompt
reponse = input('Ca va ? ')
if reponse.lower() in ('o', 'oui', 'yes', 'y', 'ok', 'da', 'jawohl', 'ja'):
print('Supercalifragilisticexpialidocious')
else:
print('Faut prendre des vacances...')
-
len(seq): retourne la longueur de la séquenceseq -
max(seq): retourne le maximum de la séquenceseq -
min(seq): retourne le minimum de la séquenceseq -
range([start=0], stop[, step=1]): retourne un itérateur d’entiers allant destartàstop - 1, par pas destep.
print(list(range(10)))
print(list(range(5, 10, 2)))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[5, 7, 9]
repr(obj): affiche la représentation de l’objetobj.reversed(seq): retourne l’inverse de la séquenceseqsorted(seq): retourne une séquence triée à partir de la séquenceseqsum(seq): retourne la somme des éléments de la séquenceseq