Aller au contenu

Fonctions - Généralités

I. Les fonctions en Python⚓︎

Notion de fonction⚓︎

Les fonctions

En informatique, les fonctions servent à mieux structurer votre code. On dit aussi que les fonctions servent à factoriser le code. Elles permettent d'éviter de répéter plusieurs fois des portions de codes identiques. Ainsi, une fonction peut être vue comme un «petit» programme :

  • à qui on donne des paramètres en entrée,
  • puis qui effectue alors un traitement sur ces paramètres, dans le corps de la fonction.
  • qui renvoie enfin un résultat en sortie.

fonction

Une fonction qui modifie des variables mais sans renvoyer de résultat est appellée une procédure. Le langage Python ne fait pas de différence dans la syntaxe entre fonction et procédure.

Syntaxe en Python⚓︎

En Python, une fonction peut s'écrire en suivant toujours le même formalisme :

Syntaxe

  • Le mot clé def + nom de la fonction + les paramètres entre parenthèses (pour chacun un nom de variable). + Terminer par deux points :
  • Si la fonction ne prend aucun paramètres, on met quand même les parenthèses sans rien à l'intérieur.
  • En dessous, écrire le blocs des instructions. Attention il faut indenter (décaler) ce bloc.
  • Si la fonction renvoie un résultat, finir en dernière ligne par le mot clé return suivi de ce que renvoie la fonction. Attention, cette ligne est indentée également et marque la fin de la fonction.

Visuellement cela donne quelque chose comme ceci:

🐍 Script Python
def ma_fonction(liste de parametres):
    instructions
    return resultat

return

Dès que l'instruction return est exécutée, on "sort" de la fonction.

Un return dans une boucle provoque donc une sortie anticipée de la boucle.

🌵 Il ne faut pas l'oublier ...

Appeler (utiliser) une fonction En Python⚓︎

Appel de fonction

Lorsque l'on définit une fonction, on ajoute une fonctionalité à python, mais la fonction n'est pas exécutée. Elle ne le sera que lorsque l'on va appeler cette fonction.

Une fonction est utilisée comme une instruction quelconque. Un appel de fonction est constitué du nom de la fonction suivi entre parenthèses des valeurs des paramètres d'entrée. Cet appel peut être fait :

  • Soit, comme nous l'avons vu, dans le programme principal (ou dans une autre fonction)
def double(nombre) :
    return 2*nombre

a = 5
reponse = double(a) # La fonction est appelée ici
print("le double de ", a,"vaut :", reponse)
  • Soit par un appel en console :
>>>double(6)
12

Vocabulaire :⚓︎

paramètre et argument

Lorsqu'on écrit double(nombre), nombre est appelé paramètre de la fonction double.

Lorsqu'on appelle la fonction double avec une valeur explicite pour nombre comme dans double(6), on dit que 6 est un argument de la fonction double.

Ainsi, si on appelle la fonction doubleavec l'argument 5, celle-ci renvoie 10 .

II. Portée des variables⚓︎

Suivre ce lien, et bien l'étudier :

Portée des variables

III. Assertions⚓︎

Tester - 1

Exécuter le script ci-dessous :

###(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
Que s'est-il passé ?

Il ne se passe rien, le assert a bien été vérifié.

Tester - 2

Exécuter le script ci-dessous :

###(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
Que s'est-il passé ?

😢 On a une erreur : assertion erreur.

Le message de l'erreur est celui que nous avons indiqué sur la ligne assert

assert

👉assert est souvent utilisé pour signaler qu’il y a une erreur dans le code de la fonction.

👉 Lorsque l'on crée une fonction, on crée en même temps un "jeu de tests" que l'on vérifiera avec des assert

Tester - 3

Corrigeons notre fonction. Tester ci-dessous :

###(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
Que s'est-il passé ?

On constate que tous les tests se sont bien passés.

🐘 A retenir

A partie de maintenant, vous écrirez toujours les assert avant de réaliser le code de votre fonction.

😊 C'est ainsi que l'on doit mettre au point un programme

Remarque

🌵 Souvent, on n'écrit pas de message dans l'assertion.

Voir ci-dessous.

À vous de jouer

Compléter la fonction suivante qui calcule la somme \(1+2+...+n\)

Ajouter un jeu de tests avec des assert (Les messages ne sont pas obligatoires)

###(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
🐍 Script Python
def somme(n):
    resultat = 0
    for i in range(n + 1):
        resultat = resultat + i
    return resultat

assert somme(0) == 0
assert somme(3) == 6
assert somme(4) == 10

IV. Exercices⚓︎

Exercice 1 : promotions

🎁 Dans une parfumerie, on propose deux promotions différentes pour l'achat de deux articles :

  • Formule A : une réduction de 50% sur le prix du 2ème article (le moins cher)
  • Formule B : une réduction de 20% sur le montant total à payer.

Muni d'un billet de 50€, Nicolas souhaite offrir deux parfums à sa mère .

1. Ecrire une fonction promo_A qui prend en paramètres prix1 et prix2 et qui renvoie le prix total à payer pour l’achat de deux parfums aux prix prix1 et prix2.
Par exemple :

  • promo_A(10, 20) doit renvoyer 25, et
  • promo_A(20, 10) doit également renvoyer 25.

Compléter ci-dessous. Il faut exécuter votre code, et ensuite obligatoirement le valider () pour voir la solution.

###(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
.128013vP/2iSpn1g;o klefa=,)6+5_y-xmdAtus(34rh:bc050E0q0G0s0f0p0I0n0Q0p0s0I0I0t010G0f0h010406050I0H0D0D0s0M0A040g0m0p0H0+0m0i050d0=0@0_0{0:0h04141b051e0d1b0:0E0f0b0Z0#0%0)0#0i0k0H0s0k0q0B0h0A0G0N120n0N0f0k0N0p1G0N0G0.050U0P0p0q1n0$0(011F1H1J1H0G1P1R1N0G0M1c1B0Z0~0I0h0s0i0)0e011T1p010r0W0q0i0s0D0q1N1/1;1_1V1|1R1 210.0a0n0c0M0m0h0m0I0f110i0n0S1-0M0M0q0Q2m14240i1c0d1B2z1)1+1*1O0E261q0f0i1~2j1N1k1m0!1U2J2L0i0m2P1N0h2s1c2x2z2$0;1:2n2R1`2V0M0^0p1N0s1E2s0r0)030z0z0Q2W0q1J2U0m0B0L0B0j0.0j140s2%2*0/2)252,1V2.2:2=2@0q2_012{2}2 312M340B1@040e3a3c1;3e2x2I013j0s2;1c2?0N2^2`2|2~0S3t2V3v0K0.0K3A2w3d0:3E3h0)3H3J053L3N3p3P3s2K3u350L0.0L3Y153!3f2+1o3i0m2/3I3l3M3n3O3r3R3;3T350y0.0y3`2$3#2*3F3)443-3q3Q304a33350w0.0w4g3d1d2!142P2C0E1+2H3%014p2O1l1c2Z0q2#4y3{3C054p4P250f0E0)2|2x3v373K0n4X4Z484q324$1^2a0q4+4p3S4s361N0d3b3}3F0o0.0S0r3Z3C0n4~4H0i0r0.2Z0m0D0m0z0F542y563$3 0)0-040J5i4V3~2S3G5b0M0f0C0z394R2y575m015o0u5r5k4j585w5y0z3z5C5s3F5o0v0O5r0:5R4~4*014!2*3v3x3+4)4Y5$4,4^5)4:204=5.4@4r5;2z3b0n5~5K3g5F50040f535R605t2-5N5z5B2$683F0m0.020p0G0l5J5E5u0i6b5P5r6o1`5o5W5R5Y2(3E5#5%1;3U3l6C5/5`353V0n4;4?3:4.6K4{5}5 6U6u3i6r1|1 0p6n5l5u6h040t6$5L5F6q042Z5O6d3d6f4H6)0d6,615u0D0f0.5Q6e6W0)6)0x6|696X6:5x5z723|5Z6B5-6D0i3v3@4(6H5_6Q345=216O497q7m3A6V6%1`63300I0q6t7A1V6w5X7G4j6H4#4c6G7i6I7q4d6M5?7u4-3=0B4d5|046U7z6-6p6Y2K3I786g0.6+67745v7b5O7e557@6`7/4H6 717 5F76837+7_6c7K7g7M7R7O0B4u7n7R7p7Z4u7V7t5^6P8k6S7%5 7@632s0G0H0M137?7H3(7,6!8a2(0d4U4z4O4B4L140G4E8O2F2A0s1Q8L0d4C5Y0S0U0W0I04.

2. Ecrire de même, une fonction promo_B.
Par exemple :

  • promoB(10, 20) doit renvoyer 24
  • promoB(20, 10) doit également renvoyer 24.

Compléter ci-dessous.

###(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
.128013vP/2iSpn1g0o klefa=,)8+5_y-xmdtus(3Brh*:bc050E0q0F0s0f0p0H0n0Q0p0s0H0H0t010F0f0h010406050H0G0D0D0s0L0A040g0m0p0G0+0m0i050d0=0@0_0{0:0h04141b051e0d1b0:0E0f0b0Z0#0%0)0#0i0k0G0s0k0q0B0h0A0F0M120n0M0f0k0M0p1G0M0F0.050U0P0p0q1n0$0(011F1H1J1H0F1P1R1N0F0L1c1B0Z0~0H0h0s0i0)0e011T1p010r0W0q0i0s0D0q1N1/1;1_1V1|1R1 210.0a0n0c0L0m0h0m0H0f110i0n0S1-0L0L0q0Q2m14240i1c0d1B2z1)1+1*1O0E261q0f0i1~2j1N1k1m0!1U2J2L0i0m2P1N0h2s1c2x2z2$0;1:2n2R1`2V0L0^0p1N0s1E2s0r0)030z0z0Q2W0q1J2U0m0B0y0B0j0.0j140s2%2*0/2)252,1V2.2:2=2@0q2_012{2}2 312M340B1@040e3a3c1;3e2x2I013j0s2;1c2?0M2^2`2|2~0S3t2V3v0J0.0J3A2w3d1d2!142P2C0E1+2H3h0)3Q221c3(1f3$2(153!3/2#2*0n0f0E0)2|2x3v373K3~40013P3s2K3u35370n2a0q413r3R4c3T4e1N0d3b3f2+1o1V0o0.0S0r3Z3C0n4s3F0i0r0.2Z0m0D0m0z0K4A2y4C3E3-010-040I4O3|3g4u0)0i4H0L0f0C0z393_3C4D4S4U0u4X4Q3}4S4$042Z4)0z3z4-2y4/4!4T0.0v0O4X0:504Y2n3 4j43353x052?5d494k304m335g1^4h4j3/3S5p3w4p3b0n5A4@4Z2S3G4%4}1|1 0p4?525E0m0.0t5L4R534U4W5a5M2-5G4*4,2$5C4t5N0.0x5R4^534`4|4*4 2(5S5E4U0v5,5D1`5O040N5{5(1`5U4X5X1V0D0f0.0w0l655@5}0.0d6d5-5E68380l6c5W6e1V5_586i255k422*3U3l6w5m5v6z4g204i5l5u5o6z2z5z5B660)4w042s0F0G0L135a5%4E5Z0z5I3I6t5W0d3{3#0q2z3=2A3*142D6?0s1Q6.3%1l3e0d0S0U0W0H04.

3. Ajouter le programme principal :
Il doit demander la saisie du prix des deux parfums, afficher le prix avec la formule A et la formule B, Afficher quelle est la formule la plus avantageuse, et si Nicolas pourra offrir les deux parfums à sa mère (il ne dispose que de 50 euros).
Vous testerez votre code pour :

  • Un parfum à 10 € et un autre à 20 €
  • Un parfum à 12 € et un autre à 45 €
  • Un parfum à 35 € et un autre à 20 €

Les fonctions promo_A et promo_B sont dans du code caché. Il est inutile de les écrire.

###(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
prix_1 = float(input("prix_1 = "))
prix_2 = float(input("prix_2 = "))
prix_final_A = promo_A(prix_1, prix_2)
prix_final_B = promo_B(prix_1, prix_2)
print("le prix final a payer avec la promotion A est de : ", prix_final_A, "euros")
print("le prix final a payer avec la promotion B est de : ", prix_final_B, "euros")

if prix_final_A < prix_final_B:
    print("la promotion A est plus avantageuse que que la promotion B")
    prix_final = prix_final_A

elif prix_final_A == prix_final_B:
    print("les deux promotions donnent des prix identiques")
    prix_final = prix_final_A

else:
    print("la promotion B est plus avantageuse que que la promotion A")
    prix_final = prix_final_B

if prix_final > 50:
    print("Nicolas ne peut pas acheter, il n a que 50 euros")   
Utilisation de la tortue

###(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

Le tracé sera affiché ici
Exercice 2 : Des triangles avec la tortue

1. Tester ci-dessous

###(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

Le tracé sera affiché ici

2. Compléter ci-dessous pour qu'il s'affiche :

3 triangles

Contrainte

Il est interdit de modifier la fonction.
Il faudra l'appeler plusieurs fois.

###(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

Le tracé sera affiché ici
Solution
from turtle import *
def triangle(n): # n est le nombre de pixels
    for i in range(3):
        forward(n)
        left(120)

n = int(input("nombre de pixels : "))
left(30)
triangle(n)
for i in range(2):
    left(120)
    triangle(n)        

3. Question facultative : Compléter ci-dessous pour qu'il s'affiche :

3 triangles autres

Contrainte

Il est interdit de modifier la fonction.
Il faudra l'appeler plusieurs fois.

###(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

Le tracé sera affiché ici
Solution
  • Si votre figure correspond à ce que vous avez demandé, c'est que c'est juste. 👍
  • Sinon, réfléchissez encore ! 😅 Cette question est facultative ...
Solution
from turtle import *
def triangle(n):
    for i in range(3):
        forward(n)
        left(120)


n=int(input("nombre de pixels : "))
left(30)
triangle(n)
forward(n)
triangle(n)
left(120)
forward(n)
right(120)
triangle(n)
Exercice 3 : Des maximums

1. Ecrire une fonction maxi_2 qui prend en paramètre deux nombres entiers n1 et n2 et renvoie le plus grand des deux.

###(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
.128013vP/2iSpn1g;o kl9efa=,)5_y-xmdtus(34rh:bc050D0r0E0t0f0p0G0n0O0p0t0G0G0u010E0f0h010406050G0F0C0C0t0K0z040g0m0p0F0)0m0i050d0:0=0@0_0.0h041219051c0d190.0D0f0b0X0Z0#0%0Z0i0k0F0t0k0r0A0h0z0E0L100n0L0f0k0L0p1E0L0E0,050S0N0p0r1l0!0$011D1F1H1F0E1N1P1L0E0K1a1z0X0|0G0h0t0i0%0e011R1n010s0U0r0i0t0C0r1L1-1/1@1T1`1P1}1 0,0a0n0c0K0m0h0m0G0f0 0i0n0Q1+0K0K0r0O2k12220i1a0d1z2x1%1)1(1M0D241o0f0i1|2h1L1i1k0Y1S2H2J0i0m2N1L0h2q1a2v2x2!0/1.2l2P1^2T0K0?0p1L0t1C2q0s0%030y0y0O2U0r1H2S0m0A0q0A0j0,0j120t2#2(0-2%232*1T2,2.2:2=0r2@012_2{2}2 2K320A1=040e383a1/3c2v2G013h0t2/1a2;0L2?2^2`2|0Q3r2T3t0I0,0I3y2u3b0.3C3f0%3F3H053J3L3n3N3q2I3s330J0,0J3W133Y3d2)1m3g0m2-3G3j3K3l3M3p3P3/3R330x0,0x3^2$1f2Y122N2A0D1)2F3#013O201a4j1d4h4f2$4q2Z2(0n0f0D0%2`2v3t353I4B4D013-47304H1?280r4E462~4831334I3W3!3}0%0o0,0Q0s3X3A0n3{3D0i0s0,0?0B0f0y3x3_3A4:4o0+040H4-2w4 4%3E0,0i374}554$2Q01510v54044/5e2+594|2$5m1T510w0M5j0.5c4z234C4U4G333v3)4K4U4q3Q4Y3u4R1~4T4M4V5K3t5F0d390n5X5l4A4o4)040f4,5y5Z3e570i595b2!5+3|5f0m0,020p0E0l5j5=4;5o5~565f515v5y5x5q4A5B5Q5D0A3T4J6b4N4W4P333T0n4S5I3.6k6e1L5V5k5Y6w631^5$2q0E0F0K115*6y3g61675j4:6h0y6d3=6g4L6i5S3;5N1 6p4O3:0A6Q3y6x5r4(0,2~0G0r626)5g0,662!683b6M6S6O2(3t4b6R6Y6j6!4b6n5O716U0A6 6%6w5Y6H6*046B6D6F5;7e58045a5w6L0d4y1b4h0d4t2y4l122B7z0t1O0r2x4j5x0Q0S0U0G04.

2. Ecrire une fonction maxi_3 qui prend en paramètre trois nombres entiers n1, n2 et n3 et renvoie le plus grand des trois.

Contrainte

Vous appelerez obligatoirement la fonction maxi_2

###(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
.128013vP/2iSpn1g0;o kléefa=,)OR_y-xmdtqus(34rh:bc050F0s0G0u0f0q0J0o0R0q0u0J0J0v010G0f0h010406050J0I0E0E0u0N0B040g0n0q0I0,0n0i0o020u0E0h0m0o0z0s0_0N0H0I0s0J050d0?0^0`0|0;0h041k1r051u0d1r0;0F0f0b0!0$0(0*0$0i0k0I0u0k0s0C0h0B0G0O130o0O0f0k0O0q1W0O0G0/050V0Q0q0s1D0%0)011V1X1Z1X0G1)1+1%0G0N1s1R0!0 0J0h0u0i0*0e011-1F010t0X0s0i170s1%2224291/2c1+2f0E2h040a0o0c0N0n0h0n0J0f12140T200N0N0s0R2C1k2j0i1s0d1R2O1|1~1}1(0F2l1G0f0i2e2z1%1A1C0#1.2Y2!0i0n2(1%0h2H1s2M2O2^0=23142*2a2.0N0_0q1%0u1U2H0t0*030A0A0R2/0s1Z2-0n0C0j0l3j0/0j1k0u2_2|0:2{2k2~1/303234360s38013a3c3e3g2#3j3l27040e3p3r243t2M2X013y0u331s350O37393b3d0T3I2.3K0C0L0/0L3P2L3s0;3T3w0*3W3Y053!3$3E3(3H2Z3J3k0C0M0/0M3=1l3s1t2?1k2(2R0F1~2W3`013)2r0S1B1s2=0s2@4d4c3R054o4v2k0f0F0*3b2M3-0j3A4D4F3G3*443,464J0o2p0s4M4o3+3i4R1%0d3q3u2}1E1/0p0/0T0t3?3R0o4(3U0i0t0/0_0D0f0A3;4x2N4?4m0.040K4:513_4*3{0/0i3o504B4)2+01540w57044=595i0i5c3O5f525a5j0/5l5f5o2|4@5c4 2`5p2a540x0P5m0;5u3T4L014G2|3-3M3~0o5Q424O3h5U284U4W435#465V4$5n0o5:5v5q0/0G1d0h5m5B3v5w0n0/0v5{5=2 4`0u4|0A5t5G5C530/565O6b5w5r045d5m631/5k625H3x5s6l6q0*5J5M6t5C5Y0A4H463/3Z5X4E5R4N3f4P4Z3l3/4T2g5)5!456N4#3q5:5;6u3V0/2H0?0q0V0G6p6g5i5 04615A6m5b044{4}694d6Z546e6a5}5?045^186y705I5y6+766r6j5F6{6,77040x6x6f4C6H5S243-486F6A4X6L7p5%6Q6I7t5+3l7q3P6X5|5h2a4,042H0G0I0N0i797G7b6$0I6(0u6*5f5N2`0d4A4e4u4g4r1k0G4j7*2U2P0u1*7%0d4h1q5g3U2H0E0A0t0u0p0s0A0O6E1c1e1g1i0o5L5u1x3t1r0y140h0s110o0N0r2y0i0F2H0o2e0o0I2!0o0J8i1+0o1?8v0P4=8c1z1B3U1H1J1L1N1P1R1T1;1Y1!1$4s4f7Z2`7#5P7m6B5T0j0j3m7r8!7z458(4S5(7y5*8-3m3B3D3F8,4Q8.6V7_4m7I4.7P4@4_6@664}7d4y6|6d757Q6?6k7k9e5x045z2^7F5D6j6`9a7f6n786;6Z6i0i99589s6v0/5K7j6 146A6C8(5V357s8=8|0C276P2q6R6K5+9K283#3C3%6J4Y3j9X2O6W6X6=017I7K7M7O9v9B6!96679q9A7a9C559d9o6^68a06c9 9h9o9g9G3U6o9?9}9^0i9{8 5w5J9l3s9n4m9x9zai5i6w7X6l7!3e2O4t2O7@4g0U0W0Y04.
Exercice 4 : Des voyelles

1. Recopier, une à une les instructions ci-dessous dans la console, et observer le résultat

>>> "e" in "aeiouy"
>>> "f" in "aeiouy" 

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
>>> "e" in "aeiouy"
True
>>> "f" in "aeiouy" 
False

Tester ci-dessous :

###(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

2. Compléter la fonction suivante qui renvoie le nombre de voyelles dans mot.
Vous pourrez utiliser les syntaxes vues au 1.

###(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
.128013vP/2iSpn1g07oU kIlefa=)86+O5V_y-EmwdAtLus(3Y4rh:bc050K0t0M0v0f0s0P0p0Y0s0v0P0P0w010M0f0h010406050P0O0I0I0v0U0F040g0n0s0O0?0n0i050d0}0 11130{0h041c1j051m0d1j0{0K0f0b0+0-0/0;0-0i0k0O0v0k0t0G0h0F0M0V1a0p0V0f0k0V0s1O0V0M0_050$0X0s0t1v0.0:011N1P1R1P0M1X1Z1V0M0U1k1J0+160P0h0v0i0;0e011#1x010u0(0t0i0v0I0t1V1`1|211%241Z27290_0a0p0c0U0n0h0n0P0f190i0p0!1^0U0U0t0Y2u1c2c0i1k0d1J2H1;1?1=1W0K2e1y0f0i262r1V1s1u0,1$2R2T0i0n2X1V0h2A1k2F2H2.0|1{2v2Z222%0U100s1V0v1M2A0u0;030E0E0Y2(0t1R2$0n0G0j0C3c0_0j1c0v2/2=0`2;2d2@1%2_2{2}2 0t3101333537392U3c3e1 040e3i3k1|3m2F2Q013r0v2|1k2~0V303234360!3B2%3D0G0R0_0R3I2E3l0{3M3p0;3P3R053T3V3x3X3A2S3C3d0G0T0_0T3+1d3-3n2?1w3q0n2`3Q3t3U3v3W3z3Z3}3#3 0C0_0C442.3.2=3N3=4e3_3y3Y384k3b3 0z0_0z4q463/493;4b3s3S3u3w4y3|3a3$0m0_0m4H3K4s3o4K3O4M4d4O4f4Q3{4j4T3 0y0_0y4Y2G1l2,1c2X2K0K1?2P3:014z2W1t1k2+0t2-3l3,3K054z592d0f0K0;342F3$0j3t5h5j4i4A4/3e5n0p2i0t5q4z3!4C5u1V0d3j474u0_0D0B0S0H0N0N0H0g5b2G0p5H510n0_0w5S045U4J2!010P5n04000v0t0f0n0O0F0L0H0r0B0o0S005!0{455c3M5p015k2=3$3F3@0p634-5s3~3E205x5z4S6e0G685F3m604^625i640E5l3 3(4O6b5r5B3$3(5w285y6t5A4B6C5E5G5%220q0_0!0u5!5$4t510i0u0_0i0X0E0b0n0F381Z0P5!5V4$0^040Q6-6N3q0_0I0n0M6?6V6/0_0x0W5~6}5g6s651|3$416y766A6J3 416E296i4.6k7a3I0p7o6U4#5(0i6Z0X6T6.5(5X045Z6p5#7x220I0f0_0l737C5H6z6v3e4n7b7j6d4l7P6g6F7S6B4m6L5#7p7E1%6P040u4b7w6@3;0_1Z1-2A7.6~7y0J0_2S7^7r2^6_6{74485(6:727C5 2:6r5q7O0G4E7R6H6j7U8e7W7i8h7k8j8f7n7p8s7(0;7*0f6S7C7q8480047=1;0t7~8B1%0n7{047}8z8u3O5J5L5N5P5R7L7/01867K8a4t7N663 4V8g6c7Z3e4V7h6G8,7e8.7#8s8_7%8X7t046!8H3N7z7B2.8A5I8~7v8O8X7z0A90517G3g8!5a8b6t8d4;8+7d5t0G4;8:7Y8?9q8^8{7_6O0_2A0M0O0U1b999y6^979h5c0d5e4_584{551c0M4~9S2N2I0v1Y9P0d4|5 0!0$0(0P04.
Exercice 5 : La suite de Syracuse

La conjecture de Syracuse (ou de Collatz) postule ceci :

Prenons un nombre \(n\) :

  • si \(n\) est pair, on le divise par 2
  • sinon on le multiplie par 3 puis on ajoute 1.

On recommence cette opération tant que possible. Au bout d'un certain temps, on finira toujours par tomber sur le nombre 1.

1. Compléter la fonction suivant qui prend en paramètre un entier n et renvoie son successeur en respectant les règles énoncées ci-dessus.

###(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
.128013vP/2iSpn1g0o klefa=)6+5_y-%mdtus(34rh*:bc050D0q0E0s0f0p0G0n0P0p0s0G0G0t010E0f0h010406050G0F0C0C0s0K0z040g0m0p0F0*0m0i050d0;0?0^0`0/0h04131a051d0d1a0/0D0f0b0Y0!0$0(0!0i0k0F0s0k0q0A0h0z0E0L110n0L0f0k0L0p1F0L0E0-050T0O0p0q1m0#0%011E1G1I1G0E1O1Q1M0E0K1b1A0Y0}0G0h0s0i0(0e011S1o010r0V0q0i0s0C0q1M1.1:1^1U1{1Q1~200-0a0n0c0K0m0h0m0G0f100i0n0R1,0K0K0q0P2l13230i1b0d1A2y1(1*1)1N0D251p0f0i1}2i1M1j1l0Z1T2I2K0i0m2O1M0h2r1b2w2y2#0:1/2m2Q1_2U0K0@0p1M0s1D2r0r0(030y0y0P2V0q1I2T0m0A0j0v330-0j130s2$2)0.2(242+1U2-2/2;2?0q2^012`2|2~302L33351?040e393b1:3d2w2H013i0s2:1b2=0L2@2_2{2}0R3s2U3u0A0I0-0I3z2v3c0/3D3g0(3G3I053K3M3o3O3r2J3t340A0J0-0J3Y143!3e2*1n3h0m2.3H3k3L3m3N3q3Q3;3S3?0x0-0x3{2%1g2Z132O2B0D1*2G3%013P211b4m1e4k4i2%4t2!2)0n0f0D0(2{2w3T0j3k4F4H492 4b323?4L0n290q4O4t3R4S354L2y3a3~3E0o0-0R0r3Z3B0n4*4r0i0r0-0;1k1:0E4:2x4?400(0,040H4 4C3f523F0-123|3B512R01540u0N570/5e503D4N014I2)3T3w3+4E4G5s4P4!5v1@4W4Y3:315D4(040n5M4=3$5a4,040f4/5o5L5g2,5c575O4D4r0m0-0B5!5X1U0C0f0-3y5V5#595h5(040t0t5+5P5h5.0-0l575,530-5l5V5n2%5q5z5t1:3T3V3J5y5G4a5I3?3V4V1 4X5A4Z4R6f1M0d3a5N6y5?3 5h5R2r0E0F0K5d2#6A3E0i5Z5=64015_0d0d5}5$5a603x5m636b4O4J3?3^6h5r3/6k3=353^6o206j4Q6l6/6v6x5N6P5R2 0G0q6!6V5h54672#693c4*6+0y6%354e6*6c5B6t4d5E6p6?5C7k5K6z6|5~1_6D0S6G6I3c6K4r6X3X5V6P5_0M725@5Y047y4;7F0-0w6U7J5-5/043868630d4B1c4k0d4w2z4o132C7+0s1P0q2y4m5n0R0T0V0G04.

2. Écrire une fonction syracuse qui prend en paramètre un entier n et qui affiche tous les termes de la suite de Syracuse jusqu'à 1 (on l'espère !).
Vous appelerez obligatoirement la fonction du 1.

###(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
def syracuse(n):
    print(n)
    while n != 1:
        n = suivant(n)
        print(n)

3. Écrire une fonction temps_de_vol qui prend en paramètre un entier n et qui renvoie le nombre d'étapes pour arriver à 1, en partant de n.
Par exemple temps_de_vol(5) doit renvoyer 5.

###(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
.128013vP/2iSpn1g0o kl!efa=)86+5_y-mwdtus(34rh:bc050F0r0G0t0f0p0I0n0Q0p0t0I0I0u010G0f0h010406050I0H0D0D0t0M0B040g0m0p0H0+0m0i050d0=0@0_0{0:0h04141b051e0d1b0:0F0f0b0Z0#0%0)0#0i0k0H0t0k0r0C0h0B0G0N120n0N0f0k0N0p1G0N0G0.050U0P0p0r1n0$0(011F1H1J1H0G1P1R1N0G0M1c1B0Z0~0I0h0t0i0)0e011T1p010s0W0r0i0t0D0r1N1/1;1_1V1|1R1 210.0a0n0c0M0m0h0m0I0f110i0n0S1-0M0M0r0Q2m14240i1c0d1B2z1)1+1*1O0F261q0f0i1~2j1N1k1m0!1U2J2L0i0m2P1N0h2s1c2x2z2$0;1:2n2R1`2V0M0^0p1N0t1E2s0s0)030A0A0Q2W0r1J2U0m0C0j0w340.0j140t2%2*0/2)252,1V2.2:2=2@0r2_012{2}2 312M34361@040e3a3c1;3e2x2I013j0t2;1c2?0N2^2`2|2~0S3t2V3v0C0K0.0K3A2w3d0:3E3h0)3H3J053L3N3p3P3s2K3u350C0L0.0L3Z153#3f2+1o3i0m2/3I3l3M3n3O3r3R3=3T3@0z0.0z3|2$3$2*3F3*463.3q3Q304c333@0x0.0x4i3d1d2!142P2C0F1+2H3(014r2O1l1c2Z0r2#4A3}3C054r4R250f0F0)2|2x3U0j3l4Z4#4a4s324(1^2a0r4,4r3S4u364)2z3b3 3F0o0.0S0s3!3C0n4 4J0i0s0.0G0r0D0h0I0A0S0A0b0~552y58410)0-040J5n4X402S3G0.134T5o3%5q015s0v0O5v0:5C5w0n4+014$2*3U3x3,5O4!5Q4-4_5T4;204?5Y4^4t5#4}040n5/575E5y0i0.2~5f5d0H0M5v5;4l4J0m0.0u5~5p5y0D0f0.0l5K5v4 5P5R1;3U3W3K5W4@3;4/3@3W0n4=6m4b6o366j3A5:5 3g5F51040E1F1R655=2-5A6I605F62040q645M6A5x1`68386d6J1V5s5J5M5L2(3E6f0A4%3@3_6k6,5*6v3^5$216t4.3?366:6y6z5:666K045_0h5{5}6T731V6P6S2$6U4m5^0m5`0r5|6M6B5y6P0y7n6V1V6X04396(6Z4l6,6.364f6;5X3:6u6}0C4f6r5%6{5!4e1N0d3b71726!3)6L7a7W017d7s7h040=1l1;0G7z7o1`5s5u5M7b7X045B6*6N5y5H6c7?6+7G6-5S4v4*826?7J4w7M6`5)6n897R7T7V7|1`6D2s0G5|7`3d7g597i7k7m7y7?0d4W4B4Q4D4N140G4G8E2F2A0t1Q8B0d4E5L0S0U0W0I04.

4. Compléter la fonction suivante pour afficher le nombre de départ inférieur ou égal à n donnant le plus grand temps de vol, ainsi que le temps de vol correspondant . Vous pourrez appeler les fonctions écrites aux questions précédentes.

###(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
.128013vP/2iSpn1g07;o kl9efa=,)86+5_y-xmwdtus(34rh:bc050J0t0K0v0f0r0M0p0U0r0v0M0M0w010K0f0h010406050M0L0H0H0v0Q0E040g0o0r0L0/0o0i050d0_0{0}0 0@0h04181f051i0d1f0@0J0f0b0%0)0+0-0)0i0k0L0v0k0t0F0h0E0K0R160p0R0f0k0R0r1K0R0K0=050Y0T0r0t1r0*0,011J1L1N1L0K1T1V1R0K0Q1g1F0%120M0h0v0i0-0e011X1t010u0!0t0i0v0H0t1R1?1^1}1Z201V23250=0a0p0c0Q0o0h0o0M0f150i0p0W1;0Q0Q0t0U2q18280i1g0d1F2D1-1/1.1S0J2a1u0f0i222n1R1o1q0(1Y2N2P0i0o2T1R0h2w1g2B2D2*0^1@2r2V1~2Z0Q0|0r1R0v1I2w0u0-030D0D0U2!0t1N2Y0o0F0j0s380=0j180v2+2.0?2-292:1Z2=2@2_2{0t2}012 3133352Q383a1{040e3e3g1^3i2B2M013n0v2^1g2`0R2|2~30320W3x2Z3z0F0O0=0O3E2A3h0@3I3l0-3L3N053P3R3t3T3w2O3y390F0P0=0P3%193)3j2/1s3m0o2?3M3p3Q3r3S3v3V3_3X3{0C0=0C402*3*2.3J3.4a3=3u3U344g373{0A0=0A4m423+453-473o3O3q3s4u3^363Y0m0=0m4D3G4o3k4G3K4I494K4b4M3@4f4P3{0z0=0z4U2C1h2(182T2G0J1/2L3,014v2S1p1g2%0t2)3h3(3G054v55290f0J0-302B3Y0j3p5d5f4e4w4+3a5j0p2e0t5m4v3W4y5q1R0d3f433J0q0=0W0u572C0p5D4}0i0u0=0K0t0H0h0M0D0|0G5J5b442W010;040N5Z5M4Y0i0=1741584F5$5(0y0S5Z0@5;4;3I5l015g2.3Y3B3:0p604)5o3`3A1|5t5v4O6b0F655B040p6m5L5?2;0=5X0f0H0`5Z6o4p4}0o0=0w6w5,5$0H0f0=0l5{5+5 5e610D5h3{3!4K685n5x3Y3!5s245u6O5w4x6X5A3f6n6x4X5$5F040u476D6p3m0=0q6@6y4Y0o0I0=2O6|6.2;0T0=0Q1^1A6L6}5@0=5*5}5!3J6G3c7b741Z5(0x735#6q045:2*6-7r1Z6A040B7q7i6H043d7g6E1~5^5`7g5|2,6M5m6Q3a3}6T6N696W3{3}6Z256f4*6h7T3E6,6,7I6_040J0L2w0t7C6z6B7@5-5Q5S5U0D0W0D0b127l7x0-5(7f7O7c7s6{7H6^860=0y6K8d4p6U7R0F4j7U7$6a4h3a4j7!6#7W6(4i6*6l7+6m7-0-6:0f5I7g7w4q5G7;0t7?8J8E017z020k0K0n7`5$5.046s6u0H843J5(7L4n8)8l634z5k7V6V8y3a4A8v8q7X8_8A8C8C8R8!8$6v8Q8e8S7_968a7.7:7=8i895c8?8m4R8p6$6g8s0F4R8{9m7%9o9k7*907,978!0W1@0Q0K8Y1~7z6C9a7m3-6`9f567P6O8m4-9l8x5p0F4-9r9U6h9S9w8D976:2w0K7;7u3h8K4}878)5N6r0v0G6t959g855%0=7p9J9}9A0t9C9E8j9K9~048h7M5+0d5a4=544@51180K4`ak2J2E0v1Uah0d4^5|0W0Y0!0M04.

V. Bilan⚓︎

Exemple

🐍 Script Python
def prix(nbre_adultes, nbre_enfants):                   # définition
    resultat = 37 * nbre_adultes + 28 * nbre_enfants    |
    return resultat                                     | corps de la fonction (bloc indenté)

prix(3, 2)                                              # Appel de la fonction prix

Définition d'une fonction

La 1ère ligne de la fonction est la définition de la fonction :

🐍 Script Python
def prix(nbre_adultes, nbre_enfants):
Elle commence par le mot clef def, suivie du nom de la fonction, puis entre parenthèse, les paramètres de la fonction.

Elle se termine par : qui indique qu'en dessous va se trouver un bloc d'instructions.

Paramètres d'une fonction

Dans def prix(nbre_adultes, nbre_enfants), on dit que nbre_adultes et nbre_enfants sont des paramètres de la fonction.

Ce sont des variables dont les valeurs seront déterminées lors de l'appel de la fonction.

🐍 Script Python
def prix(nbre_adultes, nbre_enfants):                   
    resultat = 37 * nbre_adultes + 28 * nbre_enfants  # (1)
    return resultat                                    
  1. 👉 Remarque importante : Cette ligne utilise les variables nbre_adultes et nbre_enfants qui ne sont pas initialisée dans la fonction. C'est normal, comme nous l'avons dit juste au-dessus, ces variables seront initialisées lors de l'appel de la fonction.

Prenez le temps de lire les commentaires (cliquez sur le +)

Corps de la fonction

🐍 Script Python
def prix(nbre_adultes, nbre_enfants):                   
    resultat = 37 * nbre_adultes + 28 * nbre_enfants 
    return resultat  # (1)                               
  1. return signifie renvoyer, c'est cette ligne qui indique ce que va renvoyer la fonction. Ici elle renvoie resultat, donc elle renvoie la valeur de la variable resultat

Prenez le temps de lire les commentaires (cliquez sur le +)

Appel de la fonction

🐍 Script Python
prix(3, 2)

Cette ligne de code ne fait pas partie de la fonction (Elle n'est pas dans le bloc indenté). Les lignes de codes qui ne sont pas dans une fonction font partie de ce qu'on appelle le programme principal.

Une fois qu'une fonction est définie, il est possible de l'appeler (l'utiliser) dans le programme principal, mais aussi dans une autre fonction.

Utiliser le résultat renvoyé par une fonction

Toutefois, l'appel ci-dessus ne fait qu'appeler la fonction, qui renvoie le résultat. Ceci ne sera pas utile si nous ne conservons pas ce résultat (afin de pouvoir l'utiliser dans la suite du programme). Pour cela nous allons en général affecter ce résultat à une variable :

🐍 Script Python
prix_a_payer = prix(3, 2)
print("le prix à payer : ", prix_a_payer) 

Si on veut seulement afficher le résultat, on peut directement afficher ainsi :

🐍 Script Python
print("le prix à payer : ", prix(3, 2)) 

Arguments de la fonction

Quand on « appelle » prix(3, 2) :
• 3 est automatiquement affecté au 1er paramètre : la variable nbre_adultes
• 2 est automatiquement affecté au second paramètre : la variable nbre_enfants

3 et 2 sont les valeurs données en arguments.

Remarque 1 :⚓︎

Une fonction sans paramètres

Certaines fonctions n'ont aucun paramètre. Dans ce cas, on met des parenthèses vides aussi bien dans la définition que dans l'appel de la fonction :

🐍 Script Python
def ma_fonction() :
    instruction du bloc

ma_variable  = ma_fonction()

Remarque 2 :⚓︎

Des fonctions qui ne renvoient rien

Certaines fonctions ne renvoient rien.

Exemple :

🐍 Script Python
def ma_fonction(nom) :
    print("Votre nom est :",nom)
    return None # ou simplement return, ou pas de return du tout ...

ma_fonction()
Cette fonction ne renvoie rien

De telles fonctions sont, dans certains langages, appelées des procédures. En python, on ne fait pas de différence. Une procédure fait quelques chose : ici par exemple, elle sert à afficher (dans la console) un message.

Notez que dans l'appel d'une procédure, on n'affecte pas le résultat à une variable. C'est logique car il n'y a pas de résultat, puisque la fonction ne renvoie rien.

Notion d'espace de noms⚓︎

Portée des variables

Une variable définie dans une fonction n'est connue qu'à l'"intérieur" de celle-ci.

Par exemple si on exécute ceci:

🐍 Script Python
def prix(nbre_adultes, nbre_enfants):                  
    resultat = 37 * nbre_adultes + 28 * nbre_enfants    
    return resultat                                    

prix(resultat)      # Cette ligne provoquera un message d'erreur !

On obtient le message :

🐍 Script Python
NameError: name 'resultat' is not defined

En effet, la variable resultat n'est connue qu'à l'"intérieur" de la fonction

Définitions ❤

  • Les variables définies dans le corps d'une fonction sont appelées variables locales.
  • Les variables définies dans le corps du programme (sous-entendu : pas à l'intérieur d'une fonction) sont appelées variables globales.

Règles d'accès aux variables locales et globales ❤

  • règle 1 : une variable locale (définie au cœur d'une fonction) est inaccessible hors de cette fonction.
  • règle 2 : une variable globale (définie à l'extérieur d'une fonction) est accessible en lecture à l'intérieur d'une fonction.
  • règle 3 : une variable globale (définie à l'extérieur d'une fonction) ne peut pas être modifiée à l'intérieur d'une fonction.

global_regles.png

Source : Gilles Lassus

Tester les variables locales et globales - 1

Exécuter le code ci-dessous, et comprendre le message d'erreur :

###(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
Tester les variables locales et globales - 2

Exécuter le code ci-dessous, et comprendre ce qui se passe :

###(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

Testez vos fonctions

  • Choisir un cas ou vous pouvez, sans l'aide du code, déterminer ce que la fonction doit renvoyer.

  • Ajouter l'instruction assert

Exemple d'utilisation pour une fonction carre qui élève au carré:

🐍 Script Python
    assert carre(3) == 9, "l'appel carre(3) devrait renvoyer 9"

Si le test est réussi, il ne se passera rien, sinon le code lève une exception AssertionError et affiche le message.

👉 Remarque : souvent nous n'écrirons pas de message explicatif. Nous nous contenterons par exemple de :

🐍 Script Python
    assert carre(3) == 9

Dans ce cas-là, si le test est réussi, il ne se passera rien, sinon le code lève une exception AssertionError et n'affiche pas de message.

Une fonction peut appeler une autre fonction

Toutes nos fonctions (que nous écrivons ou que nous importons) sont définies avant toute exécution du programme. De sorte que, lorsque l'exécution du code commence, elles sont toutes reconnues et utilisables en tout point du code, y compris dans d'autres fonctions.