Aller au contenu

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 :

🐍 Script Python
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 et int(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 fonction int 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

  1. Quel est le type de int(3.9) ?
  2. Quel est le type de int ?
  3. Mêmes questions en remplaçant int par print.
  4. En utilisant help, donnez le nombre d'arguments de la fonction pow.

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 :

🐍 Script Python
>>> 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 :

🐍 Script Python
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 module random ;
  • la ligne random.randint(1, 6) appelle la fonction randint qui fait partie du module random : cette fonction génére un nombre entier aléatoire entre 1 et 6 ;
  • le module random comporte bien d'autres fonctions, comme random, que je vous invite à tester avec : random.random().

Exercice

  • Importez le module math et utilisez sa fonction sqrt 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 :

🐍 Script Python
from random import randint
randint(5, 8)

Remarques :

  • ici nous n'avons ajouté que la fonction randint, les autres fonctions du module random 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), pas random.randint(5, 8).

Je peux également importer toutes les fonctions et constantes d'un module avec

🐍 Script Python
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 de import 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 que from module import *.