Aller au contenu

Chapitre 1.6 - Fonctions (découverte)

I. PremiĂšre situation : le parc d'attraction⚓

Chair-O-Planes, night

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 ?

###(DĂ©s-)Active le code aprĂšs la ligne # Tests (insensible Ă  la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activĂ©, le texte copiĂ© dans le terminal est joint sur une seule ligne avant d'ĂȘtre copiĂ© dans le presse-papier

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

prix(3, 2)
Exécuter, puis recopier dans la console (à la main !) ci-dessous

prix(2, 3)

Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activĂ©, le texte copiĂ© dans le terminal est joint sur une seule ligne avant d'ĂȘtre copiĂ© dans le presse-papier

Vos propres essais

A vous ...

Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activĂ©, le texte copiĂ© dans le terminal est joint sur une seule ligne avant d'ĂȘtre copiĂ© dans le presse-papier

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 ?

###(DĂ©s-)Active le code aprĂšs la ligne # Tests (insensible Ă  la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activĂ©, le texte copiĂ© dans le terminal est joint sur une seule ligne avant d'ĂȘtre copiĂ© dans le presse-papier

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 €.

###(DĂ©s-)Active le code aprĂšs la ligne # Tests (insensible Ă  la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activĂ©, le texte copiĂ© dans le terminal est joint sur une seule ligne avant d'ĂȘtre copiĂ© dans le presse-papier
Évaluations restantes : 5/5

ENCRYPTION_TOKEN

Solution

🐍 Proposition de correction
1
2
3
def prix_etudiants(nbre_adultes, nbre_enfants, nbre_etudiants):
    resultat = 37  *nbre_adultes + 28 * nbre_enfants + 30 * nbre_etudiants
    return resultat

ENCRYPTION_TOKEN

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.

###(DĂ©s-)Active le code aprĂšs la ligne # Tests (insensible Ă  la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activĂ©, le texte copiĂ© dans le terminal est joint sur une seule ligne avant d'ĂȘtre copiĂ© dans le presse-papier

Solution
Python
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 ?

###(DĂ©s-)Active le code aprĂšs la ligne # Tests (insensible Ă  la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activĂ©, le texte copiĂ© dans le terminal est joint sur une seule ligne avant d'ĂȘtre copiĂ© dans le presse-papier

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'abrd, 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 ?

###(DĂ©s-)Active le code aprĂšs la ligne # Tests (insensible Ă  la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activĂ©, le texte copiĂ© dans le terminal est joint sur une seule ligne avant d'ĂȘtre copiĂ© dans le presse-papier

Solution
(7, 10)
<class 'tuple'>

😹 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.

###(DĂ©s-)Active le code aprĂšs la ligne # Tests (insensible Ă  la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activĂ©, le texte copiĂ© dans le terminal est joint sur une seule ligne avant d'ĂȘtre copiĂ© dans le presse-papier

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.

###(DĂ©s-)Active le code aprĂšs la ligne # Tests (insensible Ă  la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activĂ©, le texte copiĂ© dans le terminal est joint sur une seule ligne avant d'ĂȘtre copiĂ© dans le presse-papier

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Ăšs return 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Ă©faut None 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.

###(DĂ©s-)Active le code aprĂšs la ligne # Tests (insensible Ă  la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activĂ©, le texte copiĂ© dans le terminal est joint sur une seule ligne avant d'ĂȘtre copiĂ© dans le presse-papier

Remarque sur la "portée des variables"

  • euros est une variable locale dans la fonction euros_vers_dollars
  • dollars est une variable locale dans la fonction dollar_vers_yuan
  • montant une variable locale dans la fonction euro_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 :

###(DĂ©s-)Active le code aprĂšs la ligne # Tests (insensible Ă  la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activĂ©, le texte copiĂ© dans le terminal est joint sur une seule ligne avant d'ĂȘtre copiĂ© dans le presse-papier

Variable locale montant

Ici nous avons trois variables locales différentes montant dans les trois fonctions du script.

ConsĂ©quence 2 : une variable “locale”, n’est pas reconnue Ă  "l’extĂ©rieur"⚓

Les monnaies

Exécuter, et tester le script suivant :

###(DĂ©s-)Active le code aprĂšs la ligne # Tests (insensible Ă  la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activĂ©, le texte copiĂ© dans le terminal est joint sur une seule ligne avant d'ĂȘtre copiĂ© dans le presse-papier

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 :

###(DĂ©s-)Active le code aprĂšs la ligne # Tests (insensible Ă  la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activĂ©, le texte copiĂ© dans le terminal est joint sur une seule ligne avant d'ĂȘtre copiĂ© dans le presse-papier

Attention

⚠ Ne pas utiliser des noms de variables et des noms de fonctions identiques.

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 :

def euro_vers_dollar(euro_vers_dollar):
"""
Cette fonction renvoie la valeur de euros convertie en dollars.
par exemple euro_vers_dollar(2) doit renvoyer 2,38
"""
return montant * 1.19 # en supposant qu'un euro vaut 1,19 dollars

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.

###(DĂ©s-)Active le code aprĂšs la ligne # Tests (insensible Ă  la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activĂ©, le texte copiĂ© dans le terminal est joint sur une seule ligne avant d'ĂȘtre copiĂ© dans le presse-papier
Évaluations restantes : 5/5

ENCRYPTION_TOKEN

Solution

🐍 Proposition de correction
def reaction(vitesse):
    """
    Cette fonction renvoie la distance de réaction pour une
    certaine valeur de vitesse
    Par exemple reaction(50) doit renvoyer 13.888888....
    """
    dist_reac = vitesse / 3.6
    return dist_reac

def freinage(vitesse):
    """
    Cette fonction renvoie la distance de freinage pour une
    certaine valeur de vitesse
    Par exemple freinage(50) doit renvoyer 12.5
    """
    dist_freinage = vitesse ** 2 / 200
    return dist_freinage

def arret(vitesse):
    """
    Cette fonction renvoie la distance totale d arret pour une
    certaine valeur de vitesse
    Par exemple arret(50) doit renvoyer 26.388888....
    """
    # On appelle la fonction reaction et on affecte la
    # valeur renvoyée à la variable distance_reac
    distance_reac = reaction(vitesse)

    # On appelle la fonction freinage et on affecte la
    # valeur renvoyée à la variable distance_freinage
    distance_freinage = freinage(vitesse)

    # on calcule la distance d'arret et on renvoie le résultat
    distance_arret = distance_reac + distance_freinage

    return distance_arret

vitesse = float(input("Quelle est votre vitesse en km/h : "))
distance_reaction = reaction(vitesse)
distance_freinage = freinage(vitesse)
distance_arret = arret(vitesse)

# Test
# Vos affichages ci-dessous
print("distance parcourue pendant la reaction : ", distance_reaction, " m")
print("distance parcourue pendant le freinage : ", distance_freinage, " m")
print("distance parcourue pendant l arret : ", distance_arret, " m")

ENCRYPTION_TOKEN