fiche mémo : 1.2. Fonctions¶
Organisez votre code et évitez les redondances.¶
Vincent GODARD - V2- 10/02/2025¶
Cours Introduction à la programmation¶
Département de géographie - L3 - Université de Paris 8¶
Traduction librement (largement) inspirée de : https://www.kaggle.com/code/alexisbcook/functions
Sources :
Kaggle : https://www.kaggle.com/learn
Python Tutorial : https://www.w3schools.com/python/default.asp
Cours de Python : https://python.sdv.u-paris.fr/00_avant_propos/
Téléchargement des documents nécessaires :
Dossier compressé à télécharger => (pas utile ici).
1. Introduction¶¶
Dans cette leçon, vous apprendrez à organiser votre code avec des fonctions. Une fonction est un bloc de code conçu pour effectuer une tâche spécifique. Comme vous le verrez, les fonctions vous permettront d'effectuer à peu près le même calcul plusieurs fois sans dupliquer aucun code.
2. Introduction aux fonctions : exemples simples¶¶
Nous commençons par un exemple simple de fonction. La fonction add_three() ci-dessous accepte n'importe quel nombre, lui ajoute trois, puis renvoie le résultat.
# Définir la fonction
def add_three(input_var):
output_var = input_var + 3
return output_var
Chaque fonction est composée de deux parties : un en-tête (header) et un corps (body) :
2.1. En-tête¶¶
L'en-tête de fonction définit le nom de la fonction et son ou ses arguments.
○ Chaque en-tête de fonction commence par def, qui indique à Python que nous sommes sur le point de définir une fonction.
○ Dans l'exemple, le nom de la fonction est add_three.
○ Dans l'exemple, l'argument est input_var. L'argument est le nom de la variable qui sera utilisée comme entrée de la fonction. Il est toujours entouré de parenthèses qui apparaissent immédiatement après le nom de la fonction. (Notez qu'une fonction peut également n'avoir aucun argument, ou qu'elle peut en avoir plusieurs. Vous en verrez quelques exemples plus tard dans la leçon.)
○ Pour chaque fonction, les parenthèses entourant le ou les arguments de la fonction doivent être suivies de deux points ":".
2.2. Corps¶¶
Le corps de la fonction spécifie le travail effectué par la fonction.
○ Chaque ligne de code dans le corps de la fonction doit être indentée de quatre espaces exactement. Vous pouvez le faire en appuyant quatre fois sur la barre d'espacement ou en appuyant une fois sur la touche « Tab » de votre clavier. (Au fur et à mesure de votre apprentissage de Python, il se peut que vous deviez indenter votre code de plus de quatre espaces, mais vous en apprendrez plus à ce sujet plus tard dans ce cours).
○ La fonction exécute son travail en parcourant toutes les lignes indentées de haut en bas.
• Elle prend l'argument en entrée, qui dans l'exemple est input_var.
• La fonction crée une nouvelle variable output_var avec le calcul output_var = input_var + 3.
• Ensuite, la dernière ligne de code, appelée "return statement", renvoie simplement la valeur de output_var en tant que résultat de la fonction.
La cellule de code ci-dessus définit simplement la fonction, mais ne l'exécute pas. Les détails du corps de la fonction prendront plus de sens après la cellule de code suivante, lorsque nous exécuterons réellement la fonction.
2.3. Comment exécuter (ou « appeler ») une fonction¶¶
Lorsque nous exécutons une fonction, on peut également parler d'« appel » de la fonction.
Dans la cellule de code ci-dessous, nous exécutons la fonction avec 10 comme valeur d'entrée. Nous définissons une nouvelle variable new_number qui est définie sur la sortie de la fonction.
# Exécutez la fonction avec 10 en entrée
new_number = add_three(10)
# Vérifiez que la valeur est 13, comme prévu
print(new_number)
Plus en détail,¶
○ add_three(10) est la valeur que nous obtenons en sortie lorsque nous fournissons 10 comme valeur pour input_var et appelons la fonction add_three(). Lorsque la fonction s'exécute, elle exécute tout le code de son corps, de haut en bas :
• Elle calcule d'abord output_var = input_var + 3, ce qui définit output_var = 13.
• La dernière ligne de code est l'instruction return, qui renvoie la valeur de output_var, qui est 13.
○ En définissant new_number = add_three(10), nous définissons new_number = 13.
Remarque : lorsque nous faisons référence à la fonction add_three() dans ce didacticiel, nous utilisons des parenthèses fermantes vides après le nom de la fonction. Cela correspond à la façon dont les gens écrivent généralement des explications sur le code Python, et les parenthèses vides indiquent simplement que nous faisons référence à une fonction, par opposition à une variable ou à un autre objet Python. Ces parenthèses doivent toujours être vides, même si la fonction a des arguments.
2.4. Nommer des fonctions¶¶
Dans l'exemple ci-dessus, le nom de la fonction a été sélectionné pour vous. Lorsque vous nommez vos propres fonctions, vous ne devez utiliser que des lettres minuscules, avec des mots séparés par des traits de soulignement au lieu d'espaces.
Nommer des fonctions vous semblera naturel au fil du temps, et il est normal que cela soit inconfortable au début. La meilleure façon d'apprendre est de visualiser beaucoup de code Python.
2.5. Un deuxième exemple simple¶
Un exemple plus "géographique". Calculez la température en degrés Celsius pour préparer votre garde robe pour les USA qui utilisent le degré Fahrenheit (https://fr.wikipedia.org/wiki/Degr%C3%A9_Fahrenheit).
Pour l'exemple, vous allez à Hudson (https://www.google.com/maps/place/Hudson,+Massachusetts,+%C3%89tats-Unis/@42.3974805,-71.6884415,10.25z/data=!4m6!3m5!1s0x89e38ce4f8008d01:0x902bfa2d939e7fa!8m2!3d42.3913641!4d-71.5697117!16zL20vMDFtODEx?entry=ttu&g_ep=EgoyMDI1MDExNS4wIKXMDSoASAFQAw%3D%3D) dans l'ouest de Boston, dans le Massachusetts.
Pour connaître la température en °F (https://weather.com/weather/tenday/l/Hudson+MA+01749:4:US).
# Définir la fonction
def quelle_temp_Celcius(deg_F):
# temperature en Celcius
temp_Celcius = (deg_F - 32) * (5/9)
return temp_Celcius
# Rentrer la température lue sur la carte pour la ville de Hudson, MA.
temp_Celcius = quelle_temp_Celcius(32)
print(temp_Celcius)
Les amis qui vous attendent, voudraient savoir quelle température vous avez à Paris. Comment pouvez-vous leur convertir des °C ef °F ?
# Définir la fonction
# temperature en Fahrenheit
return temp_Fahrenheit
# Rentrer la température lue sur la carte pour la ville de Paris.
temp_Fahrenheit = quelle_Fahrenheit(??)
print(temp_Fahrenheit)
4. Des exemples plus complexes¶
Maintenant que vous comprenez les bases, nous pouvons passer à des exemples avec des calculs plus longs.
4.1. 1er exemple plus complexe¶
Exemple 1 : vous aidez un ami à calculer son salaire hebdomadaire après impôts.
○ Il se situe dans une tranche d'imposition de 12 % (en d'autres termes, 12 % de son salaire sont prélevés pour les impôts, et il n'en ramène que 88 %) et
○ Il est payé à l'heure, à un taux de 15 $/heure.
La fonction ci-dessous calcule le salaire en fonction du nombre d'heures travaillées. La fonction est plus compliquée que dans le premier exemple, car elle comporte plus de lignes de code et de commentaires. Comme dans l'exemple ci-dessus, la fonction comporte un seul argument (num hours). Dans le corps de la fonction, nous :
○ Utilisons la valeur de num_hours pour spécifier la valeur d'une nouvelle variable pay_pretax.
○ Utilisons la valeur de pay_pretax pour spécifier la valeur d'une nouvelle variable pay_aftertax.
○ Renvoyons la valeur de la variable pay_aftertax.
# Définir la fonction
def get_pay(num_hours):
# Salaire avant impôts, basé sur la perception de 15 $/heure
pay_pretax = num_hours * 15
# Salaire après impôts, basé sur le fait d'être dans une tranche d'imposition de 12 %
pay_aftertax = pay_pretax * (1 - 0.12)
return pay_aftertax
Nous appelons cette fonction de la même manière que nous avons appelé la première fonction. La cellule de code suivante calcule le salaire sur la base de 40 heures de travail. (Après impôts, il s'élève à 528 $.)
# Calculer le salaire en fonction de 40 heures de travail
pay_fulltime = get_pay(40)
print(pay_fulltime)
Pour calculer rapidement le salaire en fonction d'un nombre différent d'heures travaillées, vous devez fournir à la fonction un nombre différent. Par exemple, supposons que votre ami travaille 32 heures. (Il recevra alors 422,40 $.)
# Calculer le salaire en fonction de 32 heures de travail
pay_parttime = get_pay(32)
print(pay_parttime)
Comme vous avez écrit une fonction, vous pouvez calculer le salaire pour différentes heures sans avoir à réécrire tout le code des calculs.
Les fonctions peuvent vous aider à éviter les erreurs dans votre code et vous faire gagner beaucoup de temps. En général, lorsque vous codez, vous devez essayer d'écrire le moins possible, car chaque fois que vous tapez un calcul, c'est une autre occasion d'introduire accidentellement une faute de frappe ou une erreur.
4.2. Variable « scope »¶¶
Les variables définies dans le corps de la fonction ne sont pas accessibles en dehors de la fonction. Par exemple, la cellule de code suivante génère une erreur, car pay_aftertax n'existe qu'à l'intérieur de la fonction.
print(pay_aftertax)
Vous obtiendrez la même erreur si vous essayez d'imprimer pay_pretax ou num_hours. Pour cette raison, si vous avez besoin d'informations provenant d'une fonction, vous devez vous assurer qu'elles apparaissent dans l'instruction de retour à la fin de la fonction.
Nous faisons référence à la portée d'une variable comme à la partie du code où elle est accessible. Les variables définies à l'intérieur d'une fonction (comme pay_aftertax) ont une portée locale de cette fonction uniquement. Cependant, comme vous l'avez vu, les variables définies en dehors de toutes les fonctions (comme pay_parttime) ont une portée globale et sont accessibles n'importe où.
5. Fonctions avec plusieurs arguments¶¶
Jusqu'à présent, vous avez appris à définir une fonction avec un seul argument. Pour définir une fonction avec plusieurs arguments, il vous suffit d'ajouter d'autres arguments entre parenthèses dans l'en-tête de la fonction et de les séparer par une virgule.
5.1. 1er exemple plus complexe¶
Nous le faisons avec la fonction get_pay_with_more_inputs() ci-dessous, qui calcule un chèque de paie hebdomadaire en fonction de trois arguments :
○ num_hours - nombre d'heures travaillées dans une semaine
○ hourly_wage - le salaire horaire (en $/heure)
○ tax_bracket - pourcentage de votre salaire qui est déduit des impôts
# Définir la fonction
def get_pay_with_more_inputs(num_hours, hourly_wage, tax_bracket):
# Salaire avant impôts
pay_pretax = num_hours * hourly_wage
# Salaire après impôts
pay_aftertax = pay_pretax * (1 - tax_bracket)
return pay_aftertax
Ensuite, pour appeler la fonction, vous devez fournir une valeur pour chaque entrée, encore une fois séparée par une virgule.
Dans la cellule de code ci-dessous, nous calculons le salaire après impôts d'une personne qui travaille 40 heures, gagne 24 $/heure et se situe dans une tranche d'imposition de 22 %.
# Calcul du salaire en fonction de : 40 heures de travail, 24 $/heure et tranche d'imposition de 22 %.
higher_pay_aftertax = get_pay_with_more_inputs(40, 24, 0.22)
print(higher_pay_aftertax)
La cellule de code suivante donne le même résultat que lorsque nous avons exécuté get_pay(40), car hourly_wage est défini sur 15 et tax_bracket est défini sur 12 %, ce qui correspond à la façon dont nous avons conçu get_pay.
# Calcul du salaire en fonction de : 40 heures de travail, 15 $/heure et tranche d'imposition de 12 %.
same_pay_fulltime = get_pay_with_more_inputs(40, 15, .12)
print(same_pay_fulltime)
Selon la manière dont nous prévoyons d'utiliser cette nouvelle fonction get_pay_with_more_inputs(), elle peut être plus utile que la fonction get_pay() d'origine, car elle traite davantage de cas. Au lieu de supposer potentiellement de manière incorrecte le salaire horaire et la tranche d'imposition, la nouvelle fonction permet à l'utilisateur de spécifier les valeurs correctes. Mais, si vous êtes sûr que le salaire horaire et la tranche d'imposition n'auront pas besoin de changer, la nouvelle fonction est simplement plus compliquée que nécessaire. En général, lors de la définition des fonctions, vous devrez tenir compte du degré de flexibilité dont vous avez besoin, en fonction de votre cas d'utilisation.
5.2. 2ème exemple plus complexe¶
Exemple 2 : votre SIG n'accepte que les valeurs en degrés décimaux et votre correspondant vous a fourni des degrés sexagésimaux (https://fr.wikipedia.org/wiki/Syst%C3%A8me_sexag%C3%A9simal). Comment faire la conversion ?
Les coordonnées géographiques sont souvent données en degrés (1/90 d'angle droit), minutes d'arc (1/60 de degré) et secondes d'arc (1/60 de minute d'arc).
La formulation générale est => latitude (degrés décimaux) = degrés + (minutes / 60) + (secondes / 3600).
# Définir la fonction
def deg_decimaux(degres, minutes, secondes):
# Calcul du nombre de degrés
calc_deg = degres
# Calcul du nombre des minutes
calc_min = minutes/60
# Calcul du nombre des secondes
calc_sec = secondes/3600
# Conversion en DD (degrés décimaux)
conversion_DD = calc_deg + calc_min + calc_sec
return conversion_DD
Ensuite, pour appeler la fonction, vous devez fournir une valeur pour chaque entrée, encore une fois séparée par une virgule.
Dans la cellule de code ci-dessous, nous calculons le degré décimal d'une latitude de 45° 54' 36" (45 degrés, 54 minutes et 36 secondes).
# Calcul du degré décimal d'une latitude de 45° 54' 36"
latitude_DD = deg_decimaux(45, 54, 36)
print(latitude_DD)
# Habillage du résultat avec "°" et 3 décimales
print(f"{latitude_DD:.3f}°")
5.3. 3ème exemple (encore) plus complexe¶
Cette fois-ci votre GPS vous donne la longitude en degrés décimaux et votre interlocuteur n'est autre que le Capitaine Hadock. Ce fameux marin est les pieds ancrés dans le XXème siècle et veux des coordonnées en degrés géographiques ! Comment faire ?
Conversion d'une fraction décimale de degrés en minutes et secondes.
Exemple : soit une longitude de 121,136°.
La formulation générale est =>
○ Extraire la partie entière qui indique les degrés ⇒ 121°
○ Puis, multiplier la partie décimale par 60 ⇒ 0,136 * 60 = 8,16
○ En extraire la partie entière qui indique les minutes (8')
○ Puis, multiplier la partie décimale par 60 ⇒ 0,16 * 60 = 9,6
○ Le résultat indique les secondes (9,6").
La longitude est donc de 121° 8' 9,6"
# Définir la fonction
def degres_sexa(degres_DD):
# Partie entière des degrés DD
integ_degres = int(degres_DD)
# Minutes : Multiplication de la partie décimale des degrés DD par 60
minutes = (degres_DD - int(degres_DD)) * 60
# pour récupérer les minutes (partie entière du résultat)
integ_minutes = int((degres_DD - int(degres_DD)) * 60)
# Secondes : Multiplication de la partie décimale des minutes par 60
# pour récupérer les secondes et leur partie décimale aussi
secondes = (minutes - int(integ_minutes)) * 60
# Conversion en DS (degrés sexagésimaux)
conversion_DS = integ_degres, integ_minutes, secondes
return conversion_DS
Ensuite, pour appeler la fonction, vous devez fournir une valeur pour chaque entrée. Dans la cellule de code ci-dessous, nous calculons le degré sexagésimal d'une longitude de 121,136°.
# Calcul du degré sexagésimal d'une longitude de 121,136°.
longitude_DS = degres_sexa(121.136)
print(longitude_DS)
Bon, le résultat est à habiller ! Pour cela, un petit ajout est à faire !¶
## idem avec habillage de la sortie
# Définir la fonction
def degres_sexa(degres_DD):
# Partie entière des degrés DD
integ_degres = int(degres_DD)
# Minutes : Multiplication de la partie décimale des degrés DD par 60
minutes = (degres_DD - int(degres_DD)) * 60
# pour récupérer les minutes (partie entière du résultat)
integ_minutes = int((degres_DD - int(degres_DD)) * 60)
# Secondes : Multiplication de la partie décimale des minutes par 60
# pour récupérer les secondes et leur partie décimale aussi
secondes = (minutes - int(integ_minutes)) * 60
# Conversion en DS (degrés sexagésimaux)
conversion_DS = integ_degres, integ_minutes, secondes
return conversion_DS
# Introduction d'une deuxième fonction pour formater l'affichage
def formatage_DS(degres, minutes, secondes):
return f"{degres}° {minutes}' {secondes:.1f}\""
# Calcul du degré sexagésimal d'une longitude de 121.136°
longitude_DS = degres_sexa(121.136)
# Formater le résultat
formatted_longitude = formatage_DS(*longitude_DS)
# Ajouter la phrase demandée
resultat_final = f"La longitude est de : {formatted_longitude}"
# Afficher le résultat final
print(resultat_final)
5.4. 4ème exemple (encore) plus complexe¶
Saurez-vous aider les Dupondt et le Capitaine Hadock à localiser leur navire ? Voici leur position géographique :
latitude Nord : 51° 29' 58.27"
longitude West : 0° 7' 38.34"
Il faut la convertir en degrés décimaux pour la mettre dans Google Map puis dire où ils sont et pourquoi ils enlèvent leur casquette ! Il y a une astuce !
Sources : https://archive.org/details/12-le-tresor-de-rackam-le-rouge/page/n25/mode/2up p.22-23 et l'original (cf. le cadre jaune ci-après) : https://tintinomania.com/tintin-edouard8
# C'est à vous :
6. Fonctions sans arguments¶¶
Notez qu'il est possible de définir une fonction sans arguments et sans instruction de retour. La fonction print_hello() dans la cellule de code ci-dessous en est un exemple.
# Définir la fonction sans argument et sans retour
def print_hello():
print("Bonjour, Camarade géographe !")
print("Bonjour, Camarade géomaticien !")
# Appeler la fonction
print_hello()
Cette fiche mémo est courte et se veut une introduction à la programmation. Nous n'aborderons donc pas tout ce que vous devez savoir sur les fonctions dans ce didacticiel. Vous en apprendrez encore plus sur les fonctions dans le cours Python.