✔ Intro A (Mise en place)° Réaliser les actions suivantes :
Sortir votre feuille de TP et y noter le titre Python 7.
Ouvrir Thonny. Réduire la fenêtre de Thonny et de votre navigateur Web pour que chaque fenêtre occupe la moitié de l'écran.
Ouvrir votre dossier/répertoire personnel. Créer dans le dossier SNT un nouveau sous-dossier qu'on nommera python07.
Sur Windows : vérifier via le menu affichage de votre explorateur de dossiers que vous avez bien coché la case "Afficher les extensions".
1.1 FONCTION : notion
ENTREE(S)
⇒
Fonction
⇒
SORTIE
Principe général
Une fonction est un bloc de code qui reçoit des données d'entrée et envoie une sortie.
Un exemple avec la fonction VALEUR_ABSOLUE qui n'attend qu'une entrée (un nombre) et qui renvoie la valeur absolue du nombre (le même nombre mais sans son signe).
-12
⇒
Fonction VALEUR ABSOLUE
⇒
12
12
⇒
Fonction VALEUR ABSOLUE
⇒
12
D'autres exemples
5, 10, 50, 0, 20
⇒
Fonction MAXIMUM
⇒
50
5, 10, 50, 0, 20
⇒
Fonction MINIMUM
⇒
0
5, 10, 50, 0, 20
⇒
Fonction SOMME
⇒
85
1.2 - FONCTION : native
Une fonction native est une fonction présente de base dans Python.
Dans le cadre de ce site, les fonctions natives sont toujours écrites en vert.
On fait appel à une fonction en notant son nom suivi de parenthèses contenant les entrées séparées par des virgules :
nom_fonction(a, b, c, d...)
Fonction VALEUR ABSOLUE : cette fonction se nomme abs() en Python.
>>> abs(-12)12>>> abs(12)12
Fonction MAXIMUM : cette fonction se nomme max() en Python.
>>> max(10, 0, 50, 40)50
✔ Intro B° Réaliser les actions suivantes :
Placez ce programme dans Thonny,
1
2
3
deffois2(a):b=a*2returnb
Affichez l'onglet des variables s'il n'apparaît pas
Lancez le programme en appuyant sur la flèche verte, en le nommant fonction07.py.
Questions / Réponses
La fonction se place-t-elle en mémoire ? On voit bien que oui.
La fonction se lance-t-elle seule ? Rien n'apparaît dans la console, donc non.
✔ Intro C° Placez ce nouveau programme où on définit d'abord la fonction puis où on y fait appel plusieurs fois.
L05(appel à la fonction en envoyant 10) - L01(réception du 10) - L02 - L03(envoi de 20)
L05(retour de la réponse 20) - L06
L08(appel à la fonction en envoyant 100) - L01(réception du 100) - L02 - L03(envoi de 200)
L08(retour de la réponse 200) - L09
✔ Intro E° Testez cette version pour vérifier qu’elle fait bien la même chose : inutile de passer par une variable intermédiaire : le mot-clé return provoque d'abord l'évaluation de l'expression fournie, puis renvoie le résultat obtenu.
Définir une fonction revient à stocker ses instructions pour les utiliser plus tard.
On voit d'ailleurs que vous ne pourriez pas l'utiliser pour le moment car vous ne savez pas ce que contient réellement la variable x.
Par contre, si vous avez bien compris ce qu'est une variable, vous devriez comprendre qu'on va remplir le double de ce qu'on va recevoir un jour en entrée.
Pour définir une fonction, on utilise le mot-clé def puis
le nom de la fonction
des parenthèses contenant les entrées séparées par des virgules
le caractère : pour finir cette première ligne
le bloc tabulé contenant les instructions à réaliser un jour.
1
2
defdouble(x):return2*x
Le mot-clé return permet d'indiquer la sortie que la fonction devra renvoyer.
Placer des commentaires en français dans le code Python
On peut placer du texte à destination des développeurs qui vont lire le programme en utilisant le caractère #. Voir la partie suivante pour un exemple.
Attention : sur votre ligne, tout ce qui se trouve derrière ce # sera purement ignoré par l'interpréteur.
Lancer un appel veut dire utiliser une fonction en lui fournissant des entrées puis attendre pour récupérer la réponse qu'elle fournira.
Sur le code d'exemple, on lance un appel en ligne 4.
Lors d'un appel, l'interpréteur Python transfère les données envoyées une à une dans les variables visibles sur la définition. Pour comprendre où sont stockées les entrées, il suffit de comparer la ligne de la définition et celle de l'appel.
Avec l'appel de la ligne 5, on a 10 qui est stocké dans a lors de cet appel :
définition
appel
deffois2(a):x=fois2(10)
[Déroulé] Lors d'un appel, on part de la ligne d'appel vers la ligne de définition puis la réponse est renvoyée vers la ligne d'appel.
L06(appel en envoyant 5-10-30) - L01(réception du 5 dans a ect...) - L02(calcul de 80) - L03(envoi de 80)
L06(retour du 80 qu'on stocke dans x) - L07 - L08
⚙ 04° Utiliser ce dernier programme : on définie une fonction carre() qui permet de dessiner un carré de 20 pixels de large en fournissant les coordonnées x et y voulues ainsi que la couleur.
Lancer le programme puis
réaliser un petit dessin en pixel art contenant 9 appels (et donc 9 carrés).
1 2 3 4 5 6 7 8 91011121314151617181920
fromturtleimport*defcarre(x,y,c):largeur=20penup()goto(x*largeur,y*largeur)pendown()setheading(0)# on force la tortue à regarder à droitepencolor(c)# on définit la couleur du crayonfillcolor(c)# on définit la couleur de remplissagebegin_fill()# demande de surveillance de ce qui est dessinéfor_inrange(4):forward(20)left(90)end_fill()# fin du dessin, turtle peut maintenant colorier l'intérieurcarre(0,0,"#FF0000")# carré rougecarre(1,0,"#00FF00")# carré vertcarre(0,1,"#0000FF")# carré bleucarre(0,2,"#FFFF00")# carré jaune
✎ 05° Compléter la fonction addition() : elle doit renvoyer l’addition de deux entiers qu’on fournira lors de l’appel. Compléter également le deuxième appel pour lui envoyer les valeurs 10 et 15.
Sur votre feuille : noter la définition de la fonction sur votre copie puis l’appel qu’on doit en faire pour connaître l'image de la fonction avec a=10, x=2 et b=100.
✎ 07° Créer une fonction carre() qui a x associe x2.
Sur votre feuille : noter la définition de la fonction sur votre copie puis l’appel et l'affichage de la valeur de sortie (l'image) si on envoie 10.
...CORRECTION...
01
02
03
04
05
defcarre(x):returnx*xr1=carre(10)print(r1)
✔ 08° Tapez ceci dans la console pour vous souvenir de la façon de tester une égalité entre deux variables a et b.
>>> a = 10
>>> b = 20
>>> a == b
False>>> a*2 == b
True>>> a == b
False
✎ 09° Compléter la dernière ligne de verification() pour renvoyer True si le paramètre mot_recu passé en paramètre est le même que le bon mot de passe, contenu dans une variable mdp, locale à la fonction. Sinon, elle renvoie False.
⚙ 10° Compléter ce programme pour qu'il demande le mot de passe jusqu'à ce que l'utilisateur donne le bon.
01
02
03
04
05
06
07
08
09
10
defverification(mot_recu):mdp='1234!'return...tentative=""whileverification(tentative) ==...:print("Donnez le mot de passe :")tentative=input()print("Autorisation accordée.")
...CORRECTION...
01
02
03
04
05
06
07
08
09
10
defverification(mot_recu):mdp='1234!'returnmdp==mot_recutentative=""whileverification(tentative) ==False:print("Donnez le mot de passe :")tentative=input()print("Autorisation accordée.")
⚙ 11° Utiliser la fonction ci-dessous pour vérifier qu’elle renvoie la même chose que la précédente (mais en plus "naïve" puisque cette version teste si c'est Vrai pour renvoyer Vrai, sinon elle renvoie Faux).
Question
Un utilisateur peut-il se rendre compte que les instructions internes des deux fonctions sont différentes ?
RAPPEL sur != : cet opérateur booléen teste la différence entre les deux termes à sa gauche et à sa droite.
...CORRECTION...
L'utilisateur ne pourra pas voir la différence.
⚙ 12° Compléter la fonction verification_v3() pour qu'elle utilise plutôt l'opérateur d'égalité (==). Son utilisation doit renvoyer exactement les mêmes réponses : seule la façon dont elle est conçue à l'interne diffère. Du point de vue de l'extérieur, on ne doit se rendre compte de rien.