Les fonctions⚓︎
Attention
Cette partie sur les fonctions est fondamentale. N'hésitez pas à la refaire plus tard jusqu'à ce que vous ayiez bien compris.
Fonctions pré-définies dans Python⚓︎
Nous avons déjà utilisé quelques fonctions existant en Python (des fonctions natives) : print
, input
, type
, int
, str
, ...
Remarque
Vous pouvez obtenir une liste donnant les fonctions natives ainsi que les erreurs, etc. en tapant :
import builtins
dir(builtins)
La fonction dir
retourne la liste des fonctions et données d'un module.
Par exemple, si nous exécutons int(3.9)
dans la console :
>>> int(3.9)
3
Ici :
- j'appelle une fonction nommée int ;
- l'expression entre parenthèses est appelé argument de la fonction, ici 3.9 ; je ne mets qu'un argument dans la fonction
int
car celle-ci n'accepte qu'un paramètre ; - cette fonction renvoie un résultat, ici 3.
graph LR
%%{init: {'curve': 'basis'}}%%
val([3.9])--> fonc[[int]] --> res([3])
classDef params fill:#00BFFF,stroke:#333
classDef foncs fill:#f96,stroke:#333
classDef results fill:#9f6,stroke:#333
class fonc foncs
class val params
class res results
Remarques
- La fonction
int
existe dans Python mais, tant qu'elle n'est pas appelée, elle n'est pas exécutée. Il en ira de même des fonctions que nous écrirons. - Un appel de fonction se fait en tapant le nom de la fonction suivi de parenthèses contenant les valeurs des paramètres :
int
est une fonction etint(3.9)
est un appel de cette fonction. - Il est possible d'obtenir des informations sur une fonction avec la fonction
help
, par exemple :help(int)
. Vous constaterez ainsi que la fonctionint
peut avoir en fait deux paramètres. - Différence entre paramètre et argument : quand une fonction est définie par un programmeur, celui-ci décide du nombre et des types des paramètres. Quand nous utilisons cette fonction, nous lui passons des valeurs appelées arguments, il doit y avoir autant d'arguments que de paramètres. En pratique, il n'est pas rare de confondre les deux mots...
Autre exemple : si nous exécutons print("test", 5, True)
dans la console :
>>> print("test", 5, True)
test, 5, True
- la fonction appelée est print ;
- il y a ici trois arguments : "test", 5, True ;
- cette fonction provoque un affichage à l'écran mais en fait ne renvoie rien.
graph LR
%%{init: {'curve': 'basis'}}%%
val(["test"])--> fonc[[print]]
val2([5])--> fonc
val3([True])--> fonc
classDef params fill:#00BFFF,stroke:#333
classDef foncs fill:#f96,stroke:#333
class fonc foncs
class val,val2,val3 params
Exercice
- Quel est le type de
int(3.9)
? - Quel est le type de
int
? - Mêmes questions en remplaçant
int
parprint
. - En utilisant
help
, donnez le nombre d'arguments de la fonctionpow
.
Qu'est-ce qu'une fonction ?⚓︎
Une fonction "prend" des valeurs et "renvoie" des résultats, appelés aussi valeurs de retour.
graph LR
val([valeur 1])-->|entrées| fonc[[fonction]] -->|sorties| res([résultat 1])
val2([valeur 2])--> fonc
val3([valeur 3])--> fonc
val4([...])--> fonc
fonc --> res2([résultat 2])
fonc --> res3([...])
classDef params fill:#00BFFF,stroke:#333
classDef foncs fill:#f96,stroke:#333
classDef results fill:#9f6,stroke:#333
class fonc foncs
class val,val2,val3,val4 params;
class res,res2,res3 results;
Par exemple, il peut y avoir un seul paramètre et une valeur de retour (exemple : la fonction int
dans son utilisation basique) :
graph LR
val([valeur])-->|entrée| fonc[[fonction]] -->|sortie| res([résultat])
classDef params fill:#00BFFF,stroke:#333
classDef foncs fill:#f96,stroke:#333
classDef results fill:#9f6,stroke:#333
class fonc foncs
class val params
class res results
ou plusieurs paramètres et pas de valeur de retour (exemple : la fonction print
) :
graph LR
val([valeur])-->|entrées| fonc[[fonction]]
val2([valeur 2])--> fonc
val3([...])--> fonc
classDef params fill:#00BFFF,stroke:#333
classDef foncs fill:#f96,stroke:#333
class fonc foncs
class val,val2,val3 params
etc.
Modularité
Une fonction sert donc à traiter des informations, tout comme... un programme. En fait une fonction peut-être vue comme une partie d'un programme, un sous-programme.
Il est très important de découper un programme en plusieurs parties (fonctions) indépendantes les unes des autres. C'est un peu comme dans une équipe où chaque personne a sa fonction...
Imbrication de fonctions⚓︎
Il est utile de savoir passer le(s) résultat(s) d'une fonction pour le(s) transmettre à une autre fonction.
Par exemple, si je veux convertir la chaîne "3.14"
en entier (ce qui n'est pas forcément une bonne idée d'ailleurs), je taperai ceci :
>>> int(float('3.14'))
3
ce qui se décompose ainsi :
graph LR
val(['3.14'])--> fonc[[float]] --> res([3.14])
classDef params fill:#00BFFF,stroke:#333
classDef foncs fill:#f96,stroke:#333
classDef results fill:#9f6,stroke:#333
class fonc foncs
class val params
class res results
puis
graph LR
val([3.14])--> fonc[[int]] --> res([3])
classDef params fill:#00BFFF,stroke:#333
classDef foncs fill:#f96,stroke:#333
classDef results fill:#9f6,stroke:#333
class fonc foncs
class val params
class res results
donc ici le résultat de float
est envoyé à int
(sans que ce résultat intermédiaire soit affiché...) :
graph LR
%%{init: {'curve': 'basis'}}%%
val(['3.14'])--> fonc[[float]] --> res([3.14]) --> fonc2[[int]] --> res2([3])
classDef params fill:#00BFFF,stroke:#333
classDef foncs fill:#f96,stroke:#333
classDef results fill:#9f6,stroke:#333
class fonc,fonc2 foncs
class val params
class res,res2 results
Exercice
Dans chaque cas, tapez une seule instruction qui donne :
- le type de la conversion en chaîne de caractère du nombre 23 ;
- une vérification du fait que "hello" est du même type que "salut !".
Modules (bibliothèques) Python⚓︎
Une des qualités de Python est la possibilité que nous avons d'enrichir son langage en lui ajoutant des fonctions supplémentaires.
De nombreux champs d'applications ont déjà été couverts par des programmeurs, que ce soit la gestion du hasard, le traitement d'image, la gestion de bases de données, les graphismes, les interfaces graphiques, etc.
Nous allons juste voir ici sur quelques exemples comment ajouter un nouveau mot (ou plusieurs) au langage Python.
Définition : un module est un fichier dans lequel sont définies des fonctions ou des constantes. Pour pouvoir utiliser un module, il faut l'importer dans Python.
Prenons d'abord l'exemple du module random
, qui fournit des fonctions simulant le hasard.
Exercice
Entrez ceci dans la console, une ligne à la fois :
import random
random.randint(1, 6)
puis avec la flèche vers le haut du clavier, rappelez la dernière instruction et exécutez-là plusieurs fois.
Sauriez-vous expliquer ce que fait Python ici ?
Explications
- la ligne
import random
ajoute au langage Python les fonctions du modulerandom
; - la ligne
random.randint(1, 6)
appelle la fonctionrandint
qui fait partie du modulerandom
: cette fonction génére un nombre entier aléatoire entre 1 et 6 ; - le module
random
comporte bien d'autres fonctions, commerandom
, que je vous invite à tester avec :random.random()
.
Exercice
- Importez le module
math
et utilisez sa fonctionsqrt
pour obtenir une valeur approchée de la racine carrée de 7. - Affichez une valeur approchée du nombre π, constante définie dans le module
math
.
Il existe une autre syntaxe pour l'import de fonctions ; par exemple, dans le cas de randint
:
from random import randint
randint(5, 8)
Remarques :
- ici nous n'avons ajouté que la fonction
randint
, les autres fonctions du modulerandom
seraient alors inconnues ; - il n'est plus utile de préfixer le nom de la fonction avec le nom du module : j'écris
randint(5, 8)
, pasrandom.randint(5, 8)
.
Je peux également importer toutes les fonctions et constantes d'un module avec
from random import *
Remarques
- le * veut ici dire tout ;
- ici encore inutile de préfixer les noms des fonctions avec le nom du module ; nous pourrions donc nous dire que l'utilisation de
from random import *
est préférable à celle deimport random
mais cela pose un problème : que se passe-t-il si deux fonctions ayant le même nom existent dans deux modules différents ? - par sécurité, il est donc conseillé d'utiliser
import module
plutôt quefrom module import *
.