Les fonctions

a) Notion de fonction

Les fonctions sont des blocs de code qui permettent de diviser un programme complexe en plusieurs sous-programmes plus simples. Cela facilite la lecture, la compréhension et la maintenance du code.

Pourquoi utiliser des fonctions ?

Fonction en mathématiques vs informatique

En mathématiques, une fonction associe à une valeur d’entrée une valeur de sortie. Par exemple, la fonctiony=3x+2 y=3x+2 associe à chaque valeur de xx une valeur de yy.

En informatique, la fonction suit la même idée : pour une ou plusieurs entrées (appelées paramètres), elle renvoie une sortie (appelée valeur de retour).


Syntaxe Python pour définir une fonction

def nom_de_la_fonction(parametre1, parametre2, ...):
    instruction_1
    instruction_2
    ...
    return valeur

Exemple simple

On traduit la fonction mathématiquey=3x+2 y=3x+2 en Python :

def ma_fonction(x):
    y = 3 * x + 2
    return y

Pour utiliser la fonction, on écrit :

resultat = ma_fonction(4)
print(resultat)  # Affiche 14

Passage de plusieurs paramètres

On peut définir une fonction avec plusieurs paramètres :

def calcul(x, b):
    y = 2 * x + b
    return y

On appelle la fonction en précisant l’ordre des paramètres :

valeur = calcul(4, 3)
print(valeur)  # Affiche 11 (2*4 + 3)

Attention : l’ordre des paramètres est important, x prendra la valeur 4, b la valeur 3.


Les paramètres peuvent être de différents types

Les paramètres ne sont pas limités aux nombres. Ils peuvent être :

Exemple avec des chaînes de caractères :

def dit_bonjour(nom, age):
    phrase = f"Bonjour {nom}, vous avez {age} ans."
    return phrase

message = dit_bonjour("Alice", 25)
print(message)  # Affiche : Bonjour Alice, vous avez 25 ans.

Ici, on utilise la f-string (littéral de chaîne formatée) pour insérer les variables dans la chaîne.


b) Les fonctions natives de Python

Python possède de nombreuses fonctions intégrées, appelées fonctions natives, que l’on peut utiliser directement.

Quelques fonctions natives importantes

print("Hello world")
print(len("azerty"))  # Affiche 6
print(type(3))        # Affiche <class 'int'>
print(type("texte"))  # Affiche <class 'str'>
print(str(4))         # Affiche '4'

Il en existe beaucoup d’autres, couvrant divers besoins (conversion, mathématiques simples, manipulation de données, etc.).


c) Les modules en Python

Python permet d’utiliser des fonctions supplémentaires via des modules. Un module est un fichier contenant des fonctions, classes, constantes, etc., que l’on peut importer dans son programme.

Exemple : module math

Le module math contient des fonctions mathématiques classiques :

Pour utiliser un module, on importe le module au début du programme :

import math

Puis on appelle les fonctions avec la syntaxe : nom_du_module.nom_de_la_fonction(paramètre)

resultat = math.sqrt(16)
print(resultat)  # Affiche 4.0

Exemple complet avec module math

import math

a = 5
b = 16
c = 3.14

puissance = math.pow(a, 3)    # 5^3 = 125
racine = math.sqrt(b)         # racine carrée de 16 = 4
sinus = math.sin(c)           # sinus de 3.14 ≈ 0.00159

print(puissance)
print(racine)
print(sinus)

d) Le mot-clé return

Le mot-clé return sert à indiquer la valeur que la fonction doit renvoyer à son appelant.

Exemple sans return

def ma_fonction(i):
    d = 5
    z = i + d

resultat = ma_fonction(3)
print(resultat)  # Affiche None

7) Variables locales et variables globales

a) Variables et fonctions

Variables locales

Une variable définie à l’intérieur d’une fonction est dite locale : elle existe uniquement pendant l’exécution de la fonction.

Exemple :

def ma_fonction():
    i = 5  # variable locale

ma_fonction()
print(i)  # Erreur : i n'est pas défini ici

Ici, i existe seulement dans ma_fonction et n’est pas accessible en dehors, donc on obtient une erreur.


Variables globales

Une variable définie en dehors de toute fonction est dite globale : elle est accessible dans tout le programme, sauf si elle est cachée par une variable locale du même nom.

Exemple :

i = 3  # variable globale

def ma_fonction():
    print(i)  # affiche la variable globale i

ma_fonction()  # Affiche 3
print(i)       # Affiche 3

Variables locales cachant une variable globale

Si une variable locale porte le même nom qu’une variable globale, la locale cache la globale à l’intérieur de la fonction.

i = 3  # globale

def ma_fonction():
    i = 5  # locale, différente de la globale
    print(i)  # Affiche 5

ma_fonction()
print(i)  # Affiche 3 (la globale n'a pas changé)

Modifier une variable globale dans une fonction : le mot-clé global

Par défaut, on ne peut pas modifier une variable globale directement dans une fonction. Si on essaye, on obtient une erreur.

i = 3

def ma_fonction():
    i = i + 1  # erreur : i local utilisée avant d'être définie

ma_fonction()
print(i)

Pour modifier une variable globale, on doit utiliser global :

i = 3

def ma_fonction():
    global i
    i = i + 1  # modifie la variable globale

ma_fonction()
print(i)  # Affiche 4

b) Les effets de bord

Qu’est-ce qu’un effet de bord ?

Un effet de bord survient lorsqu’une fonction modifie une variable globale, c’est-à-dire qu’elle modifie l’état du programme en dehors d’elle-même.

Cela peut poser problème car :

Pourquoi éviter les effets de bord ?

Dans des programmes simples, ce n’est pas un souci. Mais dans des programmes complexes, il vaut mieux que les fonctions :

C’est le principe de la programmation fonctionnelle, qui limite les effets de bord pour rendre le code plus sûr et plus facile à tester.