Fonctions - découverte
I. PremiĂšre situation : le parc d'attractionâïž
user:Solipsist, CC BY-SA 2.0 https://creativecommons.org/licenses/by-sa/2.0, via Wikimedia Commons
1. La caisse est tombĂ©e en panne đȘâïž
Le droit d'entrĂ©e journalier dans un parc dâattraction est de 37⏠pour un adulte et de 28⏠pour un enfant.
Alice et Bob doivent faire payer les entrĂ©es, mais leur caisse est malheureusement tombĂ©e en panne, et la queue sâallonge trĂšs viteâŠ
On leur fourni en urgence une calculatrice qui dispose de Python pour les aider.
- Un groupe de 2 adultes et 2 enfants se présente à la caisse. Il faut donc calculer : \(2 \times 37 + 2 \times 28\)
- Un groupe de 3 adultes et 5 enfants se présente à la caisse. Il faut donc calculer : \(3 \times 37 + 5 \times 28\)
- Un groupe de 1 adulte et 3 enfants se présente à la caisse. Il faut donc calculer : \(1 \times 37 + 3 \times 28\)
đą Ces calculs sont trĂšs rĂ©pĂ©titifs, et prennent du temps. La queue continue Ă sâallonger âŠ
Ils remarquent quâil suffirait de saisir le nombre dâadultes et le nombre dâenfants pour automatiser le calcul. Ils dĂ©cident dâĂ©crire une fonction en Python :
Exécuter ce script
Que se passe-t-il ?
Solution
đą Il ne se passe rien ...
Si on « appelle » prix(3, 2)
:
⹠3 est automatiquement affecté à la variable nbre_adultes
⹠2 est automatiquement affecté à la variable nbre_enfants
Tester des appels de fonction
Recopier dans la console (Ă la main !) ci-dessous.
â ïž Attention, il faut bien avoir exĂ©cutĂ© le code ci-dessus pour que cela fonctionne. Sinon, la fonction prix
ne sera pas connue.
Vos propres essais
A vous ...
Résumé
đ Alice et Bob ont crĂ©Ă© la fonction dont le nom est prix
, qui a deux paramĂštres nbre_adultes
et nbre_enfants
.
2. La situation dâAlice et Bob s'amĂ©liore đâïž
La situation dâAlice et Bob sâest nettement amĂ©liorĂ©e, mais ils veulent aller encore plus vite.
Ils voudraient juste saisir les nombres dâadultes et dâenfants, par exemple 3 et 2 , et ne pas avoir Ă Ă©crire prix(3, 2)
Pour cela, ils Ă©crivent le script suivant :
Exécuter ce script
Que se passe-t-il ?
# Tests
(insensible Ă la casse)(Ctrl+I)
(Shift+Esc ; Ctrl pour inverser les colonnes)
(Esc)
Ce qu'il s'est passé
đLa fonction prix
a été appelée. Le résultat renvoyé par la fonction a été affecté à la variable a_payer
. Cette variable a ensuite été affichée.
3. Le tarif Ă©tudiantâïž
On vient signaler Ă Alice et Bob quâun nouveau tarif entre en vigueur instantanĂ©ment : le tarif « Ă©tudiant » Ă 30âŹ.
đ» A vous de jouer 1
En vous inspirant de ce que vous avez déjà vu, compléter ce script qui tient compte de ce nouveau tarif.
Le tester pour 1 adulte, 2 Ă©tudiants, 3 enfants. Le prix Ă payer doit ĂȘtre 181 âŹ.
# Tests
(insensible Ă la casse)(Ctrl+I)
(Shift+Esc ; Ctrl pour inverser les colonnes)
(Esc)
4. đ Jour d'anniversaireâïž
NouveautĂ© : si câest le jour dâanniversaire dâune personne du groupe, tout le groupe bĂ©nĂ©ficie dâune rĂ©duction de 10 %.
đ» A vous de jouer 2
Recopier sans la modifier la fonction du 3., complĂ©ter le programme pour quâil demande si câest un jour anniversaire, et quâil affiche le prix Ă payer suivant les cas.
On rappelle que pour diminuer un prix de 10%, il suffit de le multiplier par 0.9.
# Tests
(insensible Ă la casse)(Ctrl+I)
(Shift+Esc ; Ctrl pour inverser les colonnes)
(Esc)
Solution
def prix(nbre_adultes, nbre_enfants, nbre_etudiants):
resultat = 37 *nbre_adultes + 28 * nbre_enfants + 30 * nbre_etudiants
return resultat
anniv = input("Jour d'anniversaire : saisir en toutes lettres oui ou non ")
adultes = int(input("nombre d'adultes ? "))
enfants = int(input("nombre d'enfants ? "))
etudiants = int(input("nombre d'Ă©tudiants ? "))
a_payer = prix(adultes, enfants, etudiants)
if anniv == "oui":
a_payer = 0.9 * a_payer
print("A payer : ", a_payer)
II. DeuxiĂšme situation : les tables de multiplicationâïž
Aider le petit frĂšre de Bob
Le petit frĂšre de Bob doit apprendre ses tables de multiplication.
Pensant lâaider, Bob Ă©crit la fonction suivante :
Exécuter ce script. Que s'affiche-t-il ?
# Tests
(insensible Ă la casse)(Ctrl+I)
(Shift+Esc ; Ctrl pour inverser les colonnes)
(Esc)
Solution
Il ne s'affiche que 9
đš Ce qu'il s'est passĂ©
đ A noter : losque l'on rencontre l'instruction return
, on sort de la fonction. Si un return
se trouve dans une boucle for
, on sort donc de la fonction dĂšs la premiĂšre rencontre de l'instruction return
.
Note
Nous verrons dans le paragraphe IV. comment on peut faire.
Mais d'abord, regardons si une fonction peut renvoyer plusieurs choses.
III. Et si l'on veut que notre fonction fasse plusieurs choses ?âïž
Une fonction bizarre
Vous rencontrerez souvent des fonctions comme celle se trouvant dans le script ci-dessous :
Exécuter ce script. Que s'affiche-t-il ?
# Tests
(insensible Ă la casse)(Ctrl+I)
(Shift+Esc ; Ctrl pour inverser les colonnes)
(Esc)
đš Ce qu'il s'est passĂ©
đVous observez que des parenthĂšses sont apparues dans lâaffichage du rĂ©sultat.
En fait il y a une seule variable renvoyée, et non deux, qui est de type tuple
(ici un "couple" de deux entiers), comme lâaffichage de la ligne suivante le confirme. Nous Ă©tudierons plus tard les tuples.
IV. Comment crĂ©er une fonction qui nous donne une table de multiplication ?âïž
đ MĂ©thode 1 :
On écrit une fonction qui renvoie une « liste » ou un « tuple. »
Une telle fonction renverra par exemple pour la table de 9
- Si la fonction renvoie une liste : [9, 18, 27, 36, 45, 54, 63, 72, 81, 90]
- Si la fonction renvoie un tuple : (9, 18, 27, 36, 45, 54, 63, 72, 81, 90)
Nous Ă©tudierons les listes et les tuples un peu plus tard
đ MĂ©thode 2 : avec une procĂ©dure :
On peut Ă©crire une fonction qui ne renvoie rien, mais qui fait des actions, comme par exemple des affichages.
procédure
đ Une fonction qui ne renvoie rien sâappelle une procĂ©dure.
De plus en plus on appelle ce type de fonction des ... fonctions.
Table de multiplication
Exécuter le script ci-dessous et observer l'affichage obtenu.
# Tests
(insensible Ă la casse)(Ctrl+I)
(Shift+Esc ; Ctrl pour inverser les colonnes)
(Esc)
Pas de return ?
đ Dans une procĂ©dure, la ligne return None
est facultative
Supprimez-lĂ dans l'exercice ci-dessus, puis testez Ă nouveau.
V. Une fonction sans paramĂštre ?âïž
Jouons aux dés
Exécuter le script ci-dessous et observer l'affichage obtenu.
# Tests
(insensible Ă la casse)(Ctrl+I)
(Shift+Esc ; Ctrl pour inverser les colonnes)
(Esc)
VI. A retenirâïž
Résumé
-
Une fonction commence par le mot
def
, suivi du nom de la fonction, de la liste des paramĂštres entre parenthĂšses, et de :. Toutes les instructions dâune fonction sont indentĂ©es. -
Sâil nây a pas de paramĂštres, il faut obligatoirement mettre des parenthĂšses vides.
-
Une fonction ne peut renvoyer quâune seule variable. Cela se fait avec lâinstruction
return
. -
LâexĂ©cution de lâinstruction
return
provoque obligatoirement la sortie de la fonction. Si dâautres instructions se trouvent aprĂšsreturn
elles ne seront jamais exécutées. -
La valeur renvoyĂ©e est indiquĂ©e par lâinstruction (optionnelle)
return
. Si celle-ci nâest pas prĂ©sente, la valeur par dĂ©fautNone
est renvoyée.
VII. đ€ Appeler une fonction dans une fonction ...âïž
Les monnaies
La fonction euro_vers_yan
appelle deux autres fonctions. Cela ne pose aucun problĂšme.
Exécuter le script ci-dessous et observer l'affichage obtenu.
# Tests
(insensible Ă la casse)(Ctrl+I)
(Shift+Esc ; Ctrl pour inverser les colonnes)
(Esc)
Remarque sur la "portée des variables"
euros
est une variable locale dans la fonctioneuros_vers_dollars
dollars
est une variable locale dans la fonctiondollar_vers_yuan
montant
une variable locale dans la fonctioneuro_vers_yuan
.
Ces variables ne sont "connues" que dans ces fonctions.
ConsĂ©quence 1 : choix du nom des paramĂštresâïž
Nous aurions donc pu choisir pour chaque fonction le mĂȘme nom de paramĂštre.
Les monnaies
Exécuter, et tester le script suivant :
# Tests
(insensible Ă la casse)(Ctrl+I)
(Shift+Esc ; Ctrl pour inverser les colonnes)
(Esc)
Variable locale montant
Ici nous avons trois variables locales différentes montant
dans les trois fonctions du script.
Les flottants
On devrait obtenir le résultat suivant : \(2 \times 1,19 \times 6,93 = 16,4934\)
Or le résultat affiché est : 16.493399999999998
C'est dû à la façon dont les nombres flottants sont codés dans la machine. C'est un problÚme général à tous les langages, et pas spécifique à Python.
Nous étudierons précisément pendant l'année comment sont codés les nombres flottants dans la machine.
ConsĂ©quence 2 : une variable âlocaleâ, nâest pas reconnue Ă "lâextĂ©rieur"âïž
Les monnaies
Exécuter, et tester le script suivant :
# Tests
(insensible Ă la casse)(Ctrl+I)
(Shift+Esc ; Ctrl pour inverser les colonnes)
(Esc)
Variable locale montant
đ La variable resultat_dollars
n'est pas connue à l'extérieur de la fonction euro_vers_dollar(montant):
ConsĂ©quence 3 : mĂ©thode souvent utilisĂ©eâïž
đ A retenir
đĄ On affecte Ă une variable la valeur renvoyĂ©e par une fonction
Les monnaies
Exécuter, et tester le script suivant :
# Tests
(insensible Ă la casse)(Ctrl+I)
(Shift+Esc ; Ctrl pour inverser les colonnes)
(Esc)
Attention
â ïž Ne pas utiliser des noms de variables et des noms de fonctions identiques.
Les flottants
Si vous saisissez 10, vous devriez obtenir \(10 \times 1,19 = 11,9\) Or le résultat affiché est : 11.899999999999999
C'est dû à la façon dont les nombres flottants sont codés dans la machine. C'est un problÚme général à tous les langages, et pas spécifique à Python.
Nous étudierons précisément pendant l'année comment sont codés les nombres flottants dans la machine.
VIII. Docstring dâune fonctionâïž
Docstring
Nous reviendrons plus tard dans lâannĂ©e sur les "docstring" dâune fonction, et ajouterons dâautres Ă©lĂ©ments. Pour le moment, nous les utiliserons pour expliquer le rĂŽle dâune fonction.
Cette "docstring" est composée de lignes de texte écrites entre """
et """
.
Ces lignes ne sont pas exécutées par le programme, et simplement destinées à donner des explications à celui qui lit le code (script).
Par exemple :
IX. Exerciceâïž
Pour dĂ©terminer la distance dâarrĂȘt dâune voiture on applique la formule suivante :
Distance dâarrĂȘt (en m) = distance parcourue pendant le temps de rĂ©action (en m) + distance de freinage (en m)
Une documentation donne les informations suivantes pour une route sĂšche : Notations :
- V la vitesse dâun vĂ©hicule en km/h
- R la distance parcourue pendant le temps de réaction (en m)
- F la distance de freinage (en m)
- A la distance dâarrĂȘt du vĂ©hicule (en m)
On donne les formules suivantes :
- R = V/3.6
- F = VÂČ/200
Nous rappelons que les noms de variables en informatique doivent ĂȘtre explicites (avoir un sens) et commencer par une lettre minuscule.
ComplĂ©ter le script suivant, pour que : si lâon saisit la vitesse dâun vĂ©hicule, le programme affiche les trois renseignements suivants : la distance parcourue pendant le temps de rĂ©action (en m), la distance de freinage (en m), et enfin la distance dâarrĂȘt totale du vĂ©hicule (en m). Dans les fonctions donnĂ©es ci-dessous, il faut remplacer le mot pass par les instructions python nĂ©cessaires.
# Tests
(insensible Ă la casse)(Ctrl+I)
(Shift+Esc ; Ctrl pour inverser les colonnes)
(Esc)
# Tests
(insensible Ă la casse)(Ctrl+I)
(Shift+Esc ; Ctrl pour inverser les colonnes)
(Esc)