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⚓︎

Découverte⚓︎

Exemple 1

⌛ Avant d'exécuter le programme ci-dessous, interrogez-vous sur la valeur de la variable i à l'issue de l’exécution, puis lancer le code et lisez l'explication.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

🌵 Cliquez ici pour comprendre ...

Comme vous avez pu le constater, nous avons eu droit à une erreur : "NameError: name 'i' is not defined".

Pourquoi cette erreur, la variable i est bien définie dans la fonction fct() et la fonction fct() est bien exécutée, où est donc le problème ?

En fait, la variable i est une variable dite locale : elle a été définie dans une fonction et elle "restera" dans cette fonction.

Une fois que l'exécution de la fonction sera terminée, la variable i sera "détruite" (supprimée de la mémoire). Elle n'est donc pas accessible depuis "l'extérieur" de la fonction (ce qui explique le message d'erreur que nous obtenons).

Une variable définie dans une fonction est locale. Elle ne peut pas être utilisée en dehors de la fonction.

Exemple 2

⌛ Avant d'exécuter le programme ci-dessous, interrogez-vous sur ce qui va s'afficher, puis lancez le code et vérifiez.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

🌵 Cliquez ici pour comprendre ...

Ici, pas de message d'erreur.

En fait, la variable i est ici une variable dite globale : elle a été définie à l'extérieur de le fonction.
La fonction peut y accéder.

Exemple 3

⌛ Avant d'exécuter le programme ci-dessous, interrogez-vous sur ce qui va s'afficher, puis lancez le code et vérifiez.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

🌵 Cliquez ici pour comprendre ...

Cette fois pas d'erreur, mais à la fin de l'exécution de ce programme, la variable i référence la valeur 3.

En fait, dans cet exemple nous avons 2 variables i différentes : la variable i "globale" (celle qui a été définie en dehors de toute fonction) et la variable i "locale" (celle qui a été définie dans la fonction). Ces 2 variables portent le même nom (ce n'est pas une bonne idée), mais sont différentes.

👉 Une variable définie localement dans une fonction peut porter le même nom qu'une variable globale. Dans ce cas, ce sont deux variable distinctes mais de même nom (ce qui n'est pas une bonne pratique).

Exemple 4

⌛ Avant d'exécuter le programme ci-dessous, interrogez-vous sur ce qui va s'afficher, puis lancez le code et vérifiez.

Regardez de nouveau les exemples précédants. N'avons-nous pas déjà rencontré un exemple du même type ?

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

🌵 Cliquez ici pour comprendre ...

Nous avons juste rajouté la ligne global i dans la fonction.

Cela change tout car la variable i utilisée dans la fonction, est la variable globale i.

⚠️ Cette fonction va donc modifier une variable globale définie à l'extérieur de l fonction. C'est souvent très dangereux et déconseillé.

C'est parfois utile quand même. Pour pouvoir modifier une variable globale, il faut utiliser dans la fonction l'instruction global

🌵 En fait, l'utilisation de "global" est une (très) mauvaise pratique, car cette utilisation entraîne des "effets de bord".

👓 Observez ce qu'il se passe

Bilan sur la portée des variables⚓︎

À retenir

  • Une variable définie dans une fonction est locale.
    Elle ne peut pas être utilisée en dehors de la fonction.

  • Une variable définie à l'extérieur de la fonction est une variable globale.
    La fonction peut y accéder.

  • Il est possible qu'une variable locale et une variable globale portent le même nom. Ce n'est pas une bonne pratique. Ce sont deux variables différentes.

  • Une fonction peut modifier une variable globale a en utilisant global a

D'autres tests⚓︎

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)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

🌵 Cliquez ici pour comprendre ...

La ligne 5 fait une affectation score= donc score est une variable locale. Or score n'a pas été défini dans la fonction.
Le premier "hola" est affichée, mais une erreur est rencontrée à la fin du premier tour de boucle.

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)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

🌵 Cliquez ici pour comprendre ...

score est une variable globale qui a été modifiée par la fonction.
La variable valeur est locale, mais ne sert à rien.

Questions

Portée des variables

  1. Que va afficher le code suivant ?

    x = 'extérieur'
    
    def ma_fonction():
        print(x)
    
    ma_fonction()
    

    • 'extérieur'

    • Rien

    • Une erreur

  2. Que va afficher le code suivant ?

    def ma_fonction():
        y = 'intérieur'
        print(y)
    
    ma_fonction()
    print(y)
    

    • 'intérieur' puis 'intérieur'

    • 'intérieur' puis une erreur

    • Une erreur puis une erreur

  3. Que va afficher le code suivant ?

    z = 'global'
    
    def ma_fonction():
        z = 'local'
        print(z)
    
    ma_fonction()
    print(z)
    

    • 'local' puis 'global'

    • 'global' puis 'local'

    • 'local' puis 'local'

  4. Que va afficher le code suivant ?

    def ma_fonction():
        t = 'temporaire'
        print(t)
    
    ma_fonction()
    

    • 'temporaire'

    • Rien

    • Une erreur

  5. Que va afficher le code suivant ?

    u = 'initial'
    
    def ma_fonction():
        global u
        u = 'modifié'
        print(u)
    
    ma_fonction()
    print(u)
    

    • 'initial' puis 'modifié'

    • 'modifié' puis 'initial'

    • 'modifié' puis 'modifié'

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)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

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é:

    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 :

    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.

Créez votre fonction et des assertions

À vous de jouer 😊

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

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)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

.128013dcnw3)A=g, t:eP4(yx+p-S6kvi512hl/mrs_b;oauf050b0o0m0P0B0G0K0l0c0G0P0K0K0i010m0B0v010406050K0Q0I0I0P0J0s040x0O0G0Q0,0O0d050H0?0^0`0|0;0v04051c151f0H1c0;0b0B0A0!0$0(0*0$0d0j0Q0P0j0o0w0v0s0m0F130l0F0B0j0F0G1H0F0m0/050V0M0G0o1o0%0)011G1I1K1I0m1Q1S1O0m0J1d1C0!0 0K0v0P0d0*0E011U1q010R0X0o0d0P0I0o1O1:1=1`1W1}1S20220/0a0l0p0J0O0v0O0K0B120d0l0T1.0J0J0o0c2n15250d1d0H1C2A1*1,1+1P0b271r0B0d1 2k1O1l1n0#1V2K2M0d0O2Q1O0v2t1d2y2A2%0=1;2o2S1{2W0J0_0G1O0P1F2t0R0*030L0L0c2X0o1K2V0O0w0D0D350/0D150P2(2+0:2*262-1W2/2;2?2^0o2`012|2~30322N35371^040E3b3d1=3f2y2J013k0P2=1d2@0F2_2{2}2 0T3u2W3w0w0f0/0f3B2x3e0;3F3i0*3I3K053M3O3q3Q3t2L3v360w0q0/0q3!163$3g2,1p3j0O2:3J3m3N3o3P3s3S3?3U3^0C0/0C3}2%3%2+3G3+473/3r3R314d343^0y0/0y4j3e1g2#152Q2D0b1,2I3)014s2P1m1d2!0o2$4B3~3D054s4S260B0b0*2}2y3V0D3m4!4$4b4t334)1_2b0o4-4s3T4v374*2A3c403G0z0/0T0R3#4V3(420*0e0/0l562z504K0d0R0/2!0O0I0O0L0h5e045d582T010.040r5r5g593H5k0J0B0t0L3a4U5f5u1{5x0k5r5t4m5h5E5G0L3A5K4Y415v5x0g0n5r0;5Y504,014%2+3V3y3-0l5-3;4c4:3^1^0l4?4^3=5{3x1O0H3c0l675R3h5C52040B555Y695!2.5U5H5J2%6h3G0O0/020G0m0N5Q5B5v0d6k5W5A5M1W5x5(5Y5*2)3F5^0L4(3^3X3L5@4#5.4.4`3V3X5~214@6T4_4u6W6466686+6x6j042!5V1}200G6w6D0*6q040i6^5S5C6z6/5F6l6~6a5v6{0H756i1W0I0B0/5X6n6-1W6{0u7a4n6A7g3 5+6K6S5/1=3V3`6Q6L6$623_4=6Z605`3@377x3B6,6_016c310K0o6C6 5#0/6G4k7S4Z7t6M5:4f4+7!7A7H0w4g6Y227F4/7+4g4~5s6+687i3*6A6=3J7m4K6{6}6g7{5D725V7p3D6o810/79847M7d7f805C7k8j6y6A6m7q6J4m6L6N374x7y7)617+4x7.6!5_7;4e8v6)7^67856c2t0m0Q0J148f7T6.6:5H7~6@6H5A0H4X4C4R4E4O150m4H8+2G2B0P1R8(0H4F5*0T0V0X0K04.

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)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

.128013dcnw3)=g,8 t:eP(xy+p-Skvi12hl*/mrBs_b0oauf050b0o0m0O0z0D0J0l0c0D0O0J0J0h010m0z0u010406050J0P0G0G0O0H0s040w0N0D0P0+0N0d050F0=0@0_0{0:0u04051b141e0F1b0:0b0z0y0Z0#0%0)0#0d0i0P0O0i0o0v0u0s0m0C120l0C0z0i0C0D1G0C0m0.050U0L0D0o1n0$0(011F1H1J1H0m1P1R1N0m0H1c1B0Z0~0J0u0O0d0)0B011T1p010Q0W0o0d0O0G0o1N1/1;1_1V1|1R1 210.0a0l0p0H0N0u0N0J0z110d0l0S1-0H0H0o0c2m14240d1c0F1B2z1)1+1*1O0b261q0z0d1~2j1N1k1m0!1U2J2L0d0N2P1N0u2s1c2x2z2$0;1:2n2R1`2V0H0^0D1N0O1E2s0Q0)030K0K0c2W0o1J2U0N0v0A0B340.0A140O2%2*0/2)252,1V2.2:2=2@0o2_012{2}2 312M34361@040B3a3c1;3e2x2I013j0O2;1c2?0C2^2`2|2~0S3t2V3v0v0f0.0f3A2w3d1f2!142P2C0b1+2H3h0)3Q221c3)1d3%2(153#3:2#2*0l0z0b0)2|2x3U0A3l40423r3R2K3u35370l2a0o493:3S334e462z3b3f2+1o1V0x0.0S0Q3!3C4r3F0e0.0l4z2y4B3.3G0Q0.2Z0N0G0N0K0I4G044F3E4J0-040q4T4I4t0)0d4M0H0z0r0K393`4A4W4%014Y0j4T4V3~4J4)042Z4,0K3z4:4H4=2S4@0.0g0n4T0:543}254801432*3U3x052?5h3P3s4c3T4e1@4g204i5i4a305s4m3w1N0F3b0l5I4{3g4?4~504-1|1 0D4`4$570N0.0h5T561`4Y4!5e5U2-4*514/2$5K4s5V0.0t5Z4|5M5+4-532(5!1V4Y0g5@5L5;040E625:5#0.5%5}5^570G0z0.0k0M4#5~0)5W040F6k6d1`6f380M6j5(6l5804615e5d6c5g415z444e3W3K3 6G5q4b323U3W5w214j5r6Q6J5F5H5J5)4u0.2s0m0P0H135e5/3F5N4+5P2K3I5c4#0F3|3$0o2z3?2A3+142D730O1Q6~3(1l3e0F0S0U0W0J04.

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)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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 : À vous d'écrire les fonctions

L’éxercice consiste à réécrire le programme suivant en le décomposant en fonctions (dont il faut choisir soigneusement le nom et les paramètres) tout en renommant les différentes variables, afin de le rendre plus clair.

Rappels sur la 🐢

On rappelle ci-dessous les instructions utiles du module turtle.

Appel Rôle
hideturtle() Cache la tortue.
speed(n) Définit la vitesse de l'animation.
n est un entier entre 1 (lent) et 10 (rapide).
Si n est égal à 0 la figure s'affiche instantanément
animation(s) Autorise ou non les animations.
s est soit 'on' (avec animations, valeur par défaut)
soit 'off' (sans animations).
penup() ou up() Lève le crayon : les déplacements de la tortue ne sont plus dessinés.
pendown() ou down() Baisse le crayon : les déplacements de la tortue sont dessinés.
heading() Renvoie la direction vers laquelle pointe la tortue sous la forme d'une mesure d'angle en degrés.
setheading(d) Définit la direction vers laquelle pointe la tortue.
d est une mesure d'angle en degrés.
position() Renvoie la position de la tortue sous la forme d'un couple de nombres (x, y).
goto(x, y) La tortue se déplace à la position (x, y).
x et y sont des nombres.
left(a) La tortue tourne sur elle-même vers la gauche de a degrés.
a est un nombre.
right(a) La tortue tourne sur elle-même vers la droite de a degrés.
a est un nombre.
forward(p) La tortue avance de p pixels.
p est un nombre.
color("black") La couleur utilisée sera le noir
begin_fill() Commence le remplissage avec une couleur
end_fill() Termine le remplissage avec une couleur
from turtle import *

hideturtle()
a = 50
speed(0)
for b in range(8):
    for c in range(8):
        if (b + c) % 2 == 0:
            color("black")
        else:
            color("white")
        up()
        d = (b - 4) * a
        goto(d, c * a - a * 4)
        down()
        begin_fill()
        forward(a)
        left(90)
        forward(a)
        left(90)
        forward(a)
        left(90)
        forward(a)
        left(90)
        end_fill()

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

Votre figure

Votre tracé sera ici

Solution possible

Voici une solution parmi d'autres possibles.

Une proposition de solution
from turtle import *

def carre(a):
    forward(a)
    left(90)

def bouge(colonne, ligne, a):
    up()
    x = (colonne - 4) * a
    y = ligne*a - a*4
    goto(x, y)
    down()

def damier(a):
    speed(0)
    hideturtle()
    for colonne in range(8):
        for ligne in range(8):
            if (colonne + ligne) % 2 == 0:
                color("black")
            else:
                color("white")
            bouge(colonne, ligne, a)
            begin_fill()
            for i in range(4):
                carre(a)
            end_fill()
damier(50)  

Crédit : d'après un exercice de J. Diraison

Exercice 4 : 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)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

.128013dcnw3)=g8, t:eP4xy(p-Skvi512hl/mrs_b;oauf050b0o0m0N0z0E0I0l0c0E0N0I0I0h010m0z0u010406050I0O0G0G0N0H0s040w0M0E0O0*0M0d050F0;0?0^0`0/0u04051a131d0F1a0/0b0z0y0Y0!0$0(0!0d0i0O0N0i0o0v0u0s0m0D110l0D0z0i0D0E1F0D0m0-050T0K0E0o1m0#0%011E1G1I1G0m1O1Q1M0m0H1b1A0Y0}0I0u0N0d0(0C011S1o010P0V0o0d0N0G0o1M1.1:1^1U1{1Q1~200-0a0l0p0H0M0u0M0I0z100d0l0R1,0H0H0o0c2l13230d1b0F1A2y1(1*1)1N0b251p0z0d1}2i1M1j1l0Z1T2I2K0d0M2O1M0u2r1b2w2y2#0:1/2m2Q1_2U0H0@0E1M0N1D2r0P0(030J0J0c2V0o1I2T0M0v0B0j330-0B130N2$2)0.2(242+1U2-2/2;2?0o2^012`2|2~302L33351?040C393b1:3d2w2H013i0N2:1b2=0D2@2_2{2}0R3s2U3u0v0f0-0f3z2v3c0/3D3g0(3G3I053K3M3o3O3r2J3t340v0q0-0q3Y143!3e2*1n3h0M2.3H3k3L3m3N3q3Q3;3S3?0A0-0A3{2%1g2Z132O2B0b1*2G3%013P211b4m1c4k4i2%4t2!2)0l0z0b0(2{2w3T0B3k4F4H492 4b323?4L0l290o4O4t3R4S354L2y3a3~3E0x0-0R0P3Z3B4*4r0e0-0l4:2x4=403(0P0-0@0r0z0J3y3|4;3$4}010,040t4`4C3f590d0-0d38564{582R5a0-0k5e4_5o2,5j552%5v1U5b0g0n5e0/5m5f2m4N014I2)3T3w3+4E4G5L4P4!5O1@4W4Y3:315W4(040l5)5u4D4r4,040z4/5H5+5g5p5i045k5t4|5p0M0-020E0m0L5|5A3(5x655,595b5E5H5G5z4D5K5M1:3T3V3J5R5Z4a5#3?3V4V1 4X5T4Z4R6l1M0F3a5*6E5?3 5p5.2r0m0O0H125=5}5w5`5y3}5H4*6i0J4J3?3^6n6X6y6r353^6u206p4Q6)3@6B6D5*6Q1U5.2 0I0o695@1_6c5F5e6W5S6j0d3T4e6$755U6z4d5X6v6.5V7e5%6F6@66016J0S6M6O2#6G3E5_5{6e730F4B1e4k0F4w2z4o132C7I0N1P0o2y4m5G0R0T0V0I04.

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)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

.128013dcnw3)q=g, t:eP4xy(p-SkviR21hél/mrs_;b0oOa9uf050b0o0m0Q0z0F0J0l0c0F0Q0J0J0i010m0z0u010406050J0S0H0H0Q0I0s040w0O0F0S0.0O0d0l020Q0H0u0L0l0A0o0{0I0h0S0o0J050G0^0`0|0~0?0u04051t1m1w0G1t0?0b0z0y0$0(0*0,0(0d0j0S0Q0j0o0v0u0s0m0D150l0D0z0j0D0F1Y0D0m0;050X0M0F0o1F0)0+011X1Z1#1Z0m1+1-1)0m0I1u1T0$110J0u0Q0d0,0B011/1H010T0Z0o0d190o1)24262b1;2e1-2h0H2j040a0l0p0I0O0u0O0J0z14160V220I0I0o0c2E1m2l0d1u0G1T2Q1~201 1*0b2n1I0z0d2g2B1)1C1E0%1:2!2$0d0O2*1)0u2J1u2O2Q2`0@25162,2c2:0I0{0F1)0Q1W2J0T0,030K0K0c2;0o1#2/0O0v0C0R3l0;0C1m0Q2{2~0=2}2m301;323436380o3a013c3e3g3i2%3l3n29040B3r3t263v2O2Z013A0Q351u370D393b3d3f0V3K2:3M0v0f0;0f3R2N3u0?3V3y0,3Y3!053$3(3G3*3J2#3L3m0v0q0;0q3@1n3u1x2^1m2*2T0b202Y3|013+2t0U1D1u2@0o2_4f4e3T054q4x2m0z0b0,3d2O3/0C3C4F4H3I3,463.484L0l2r0o4O4q3-3k4T1)0G3s3w2 1G1;0x0;0V0T3^4A3{4,0,0e0;0l4=2P4*3W0d0T0;0{0r0z0K3?4z4~4@2-010:040t4}4D4+5c0d0;0d3q595i3W5e0k5h4|5b315m3Q5p4 4o5s5u5B4^3X5m582|5w1;5e0g0n5h0?5A3V4N014I2~3/3O400l5U444Q3j5Y2a4W4Y455)485Z4(040l5@5v2~500;0m1f0u5E5L0,0O0;0i605`4o5l0454565z5K675G5e5g5S6f5k5m5o6e3x6g0;5t5p5_6p6l040d6d4f615d0;0g5Q5h4 5$0K4J483;3#5#4G5V4P3h4R4#3n3;4V2i5-5(476V4%3s5^6u5j5x042J0^0F0X0m666v2c6304656t5F6w6b0K6z4?6k2c6h6G6B695}1a76735M6r6?6+3z5I7b6@7d046E5p5R6o166I6K3n4a6N6I4Z6T3/4a6X2s6Z6S5/7u6%5?5^6}2c4.6-0W0S0I0d7f5{7O6/6;6F5A0G4C4g4w4i4t1m0m4l7*2W2R0Q1,7%0G4j1s5q4o2J0H0K0T0Q0x0o0K0D6M1e1g1i1k0l5P7Z1A1v040P160u0o130l0I0E2A0d0b2J0l2g0l0S2$0l0J8i1-0l1^8v0n4|1z3v2*3W1J1L1N1P1R1T1V1?1!1$1(4u4h2|5A7#5T6P5W260v0B0N3o7w8!6R4!8%8)4U5,6Q7y5)8(3o3D3F3H8@3L8_4L2Q4)6B7N4:7j7g4_4{9750526a0Q55579b5C0;6i7q7U5n9i6q046s2`6*9n715a7c0,5D6|777i6j7k9z6D8a2`7p6A5`7s5X8_5Z377x5.8 8)297C4X8?9T3.9P2a3%3E3)8-7z9$927J5@7L4-0;2J0m7Q7S9B9y5H9e9g9w7_9q9l9L9F9}6 a09;9G5f9p6w9o9E986C9r7T685yac746D9s3u9uak6x5Ja4ag5N7Y8W7#1z4h7?4t5R0V0X0Z0J04.
Exercice 5 : 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)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

.128013dcUnw3)A=g8 t:eP4Iy(+p-S6YviLk512hEl7/mrs_bV;oO0a9uf050b0p0n0X0C0K0P0m0c0K0X0P0P0j010n0C0w010406050P0Z0N0N0X0O0t040y0U0K0Z0^0U0e050M0 1113150}0w04051l1e1o0M1l0}0b0C0B0-0/0;0?0/0e0k0Z0X0k0p0x0w0t0n0I1c0m0I0C0k0I0K1Q0I0n0{050(0R0K0p1x0:0=011P1R1T1R0n1Z1#1X0n0O1m1L0-180P0w0X0e0?0H011%1z010!0*0p0e0X0N0p1X1|1~231)261#292b0{0a0m0q0O0U0w0U0P0C1b0e0m0$1`0O0O0p0c2w1e2e0e1m0M1L2J1?1^1@1Y0b2g1A0C0e282t1X1u1w0.1(2T2V0e0U2Z1X0w2C1m2H2J2:0~1}2x2#242)0O120K1X0X1O2C0!0?030Q0Q0c2*0p1T2(0U0x0H0r0x0G0{0G1e0X2;2@0|2?2f2_1)2{2}2 310p33013537393b2W3e3g21040H3l3n1~3p2H2S013u0X2~1m300I323436380$3E2)3G0x0g0{0g3L2G3o0}3P3s0?3S3U053W3Y3A3!3D2U3F3f0x0r0{0r3.1f3:3q2^1y3t0U2|3T3w3X3y3Z3C3$403(420F0{0F472:3;2@3Q3^4h3|3B3#3a4n3d420z0{0z4t493=4c3@4e3v3V3x3z4B3 3c3)0L0{0L4K3N4v3r4N3R4P4g4R4i4T3~4m4W420l0{0l4#2I1p2.1e2Z2M0b1^2R3?014C2Y1v1m2-0p2/3o3/3N054C5c2f0C0b0?362H3)3i4R5k5m4l4D4=3g3i0m2k0p5t4C3%4F5x1X0M3m4a4x0{0S0V0A0J0D0D0J0y5e2I0m5K540U0{0j5V045X4M2$010P5q02030g0Y0T0X0p0C0U0Z0t0i0J0s0V0d0A5/5;0T5%0}485f3P5s015n2@3)3I3`0m6b4:5v413H225A5C4V6m3e5H3m672=6a5l6c0Q5o423+5r6z6k5E3)3+5z2a5B6A5D4E6J6u5i4b5+0E0{0$0!5%5Y4)0f0{5X684{5*2`0!0{0e0R0Q0B0U0t3a1#0P6!6,1)0`040u6|4w540e0{0N0U0n724(5+6 0h0o667a2x6j6B6e42446F6q4;6s446L2b7p6l4o3g7n3L0m7B5)734)75046:5%7D7b245!045$6*5(6#5+0N0C0{0W7g7Q5K7j6C3g4q7o6O6r7x0x4q7t6N6H6Q4p6S7C7K6U246W040!4e7J7S2`0{1#1/2C806}0?0U6%042U877E5+7G77797Z88016 7f7Q6w5d6y5t7$0x4H7)7;5w8v6o6M7v6I4G7@7^7C811)7|0C6Z7Q7_5L04841?0p8e7L1)8a0{8d8O8J3@5M5O5Q5S5U8k8f248n7Y6x4w7#7l3g4Y8x5u8E8_8B7u7*7q7,8`7A8H968$3R6/0R8V7`8X5#9c8Q7I8#8l7N0v9g547U3j8;8r8?6G7k1~3)4@8{6P8z4@7/8D7=3g9y957B987|2C0n0Z0O1d9j8.3t9a9r5f0M5h4|5b4~581e0n519%2P2K0X1!9!0M4 670$0(0*0P04.
Exercice 6 : 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)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

.128013dcnw3)%=g t:eP4(y+p-Skvi512hl*/mrs_b0oauf050b0n0l0N0y0D0I0k0c0D0N0I0I0i010l0y0t010406050I0O0G0G0N0H0r040v0M0D0O0*0M0d050F0;0?0^0`0/0t04051a131d0F1a0/0b0y0x0Y0!0$0(0!0d0j0O0N0j0n0u0t0r0l0C110k0C0y0j0C0D1F0C0l0-050T0K0D0n1m0#0%011E1G1I1G0l1O1Q1M0l0H1b1A0Y0}0I0t0N0d0(0B011S1o010P0V0n0d0N0G0n1M1.1:1^1U1{1Q1~200-0a0k0o0H0M0t0M0I0y100d0k0R1,0H0H0n0c2l13230d1b0F1A2y1(1*1)1N0b251p0y0d1}2i1M1j1l0Z1T2I2K0d0M2O1M0t2r1b2w2y2#0:1/2m2Q1_2U0H0@0D1M0N1D2r0P0(030J0J0c2V0n1I2T0M0u0B0z0u0A0-0A130N2$2)0.2(242+1U2-2/2;2?0n2^012`2|2~302L33351?040B3a3c1:3e2w2H013j0N2:1b2=0C2@2_2{2}0R3t2U3v0u0f0-0f3A2v3d0/3E3h0(3H3J053L3N3p3P3s2J3u340u0p0-0p3Z143#3f2*1n3i0M2.3I3l3M3n3O3r3R3=3T3@0z0-0z3|2%1g2Z132O2B0b1*2G3(013Q211b4n1c4l4j2%4u2!2)0k0y0b0(2{2w3U373K4F4H013:4b314L1@290n4I4a2 4c323@4M3Z3%410(0w0-0R0P3!3C3 3F0e0-0k4;2x4?4s0d0P0-0;1k1:0l4{4D3g4+010,040q564}590d0-123}4=4*2R5a0-0g0m560/5k4|3E4G4Y4K3@3x3,4O4Y4u3S4$3w4V1 4X4Q4Z5G3U5B0F3b0k5T4`5m1_4-040y4:5u045V4E4~5i565(585n0M0-0h5,5f5n0G0y0-3z5$5-405/0-0i0i5?5W1U5_0-0L5e650(5b5r5$5t2%5w4P4J2)3U3W4N5x5M5F4#6m5J205E3;4T3@6n3A5U6C5~3F5Y2r0l0O0H5j2#6E5*046L3d6N595:040F0F645)59673y5s6a4E6p6k1:3U3_6o6j5N6s3@3_0k4W6w4S3?356.6B5U5@5X0-2 0I0n6(5.1_6d6%5$4?6*0J5z354f6/6`4!6y7h6u5L4R7l6|0u7i6 6D6S5n6G0S6J6Q3C7x1_6#3Y7c6b016U0E775 2,5+5}711U6U0s6Y78665`04396f5e0F4C1e4l0F4x2z4p132C7:0N1P0n2y4n5t0R0T0V0I04.

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)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

.128013dc!nw3)=g t:eP4(y+p-S6kvi512hl7/mrs_b0oauf050b0n0l0O0z0E0J0k0c0E0O0J0J0i010l0z0t010406050J0P0H0H0O0I0r040v0N0E0P0+0N0e050G0=0@0_0{0:0t04051b141e0G1b0:0b0z0y0Z0#0%0)0#0e0j0P0O0j0n0u0t0r0l0D120k0D0z0j0D0E1G0D0l0.050U0L0E0n1n0$0(011F1H1J1H0l1P1R1N0l0I1c1B0Z0~0J0t0O0e0)0C011T1p010Q0W0n0e0O0H0n1N1/1;1_1V1|1R1 210.0a0k0o0I0N0t0N0J0z110e0k0S1-0I0I0n0c2m14240e1c0G1B2z1)1+1*1O0b261q0z0e1~2j1N1k1m0!1U2J2L0e0N2P1N0t2s1c2x2z2$0;1:2n2R1`2V0I0^0E1N0O1E2s0Q0)030K0K0c2W0n1J2U0N0u0C0F0u0B0.0B140O2%2*0/2)252,1V2.2:2=2@0n2_012{2}2 312M34361@040C3b3d1;3f2x2I013k0O2;1c2?0D2^2`2|2~0S3u2V3w0u0g0.0g3B2w3e0:3F3i0)3I3K053M3O3q3Q3t2K3v350u0p0.0p3!153$3g2+1o3j0N2/3J3m3N3o3P3s3S3?3U3^0A0.0A3}2$3%2*3G3+473/3r3R304d333^0w0.0w4j3e1f2!142P2C0b1+2H3)014s2O1l1c2Z0n2#4B3~3D054s4S250z0b0)2|2x3V383L0k4!4$4b4t324)1^2a0n4.4s3T4v364*3!3(420)0x0.0S0Q3#4V502S010f0.0k572y404n0Q0.0l0n0H0t0J0K0S0K0y0~5f4Y415a0-040q5v5h4K0e0.134U5g591`5z0h0m5v0:5I5w4,4#014%2*3V3y3-5T4_3=4;3^1@0k4@5$4c5(3x1N0G3c0k5@5e5K3j0.2~5n5l0P0I5v5_4m4K0N0.0i625D51010H0z0.0M5P5C3F4-5V0K4(3^3X4+6k3;5.3@363X5+204^6l4`4u3V6p3B5^633h6b53040f1F1R695`3*5G6P646b66040d685R6H5x1`6d396i6U5y0.5O5R5Q2(6j5U5W1;3V3`6q6?4/4{6_4?6y5-4:6u3_5;5?6G5^6a5a5F045}0t5 616!7a1`6W6Z2$6#4n5|0N5~0n606T6I5a6W0s7v6$1V6(043a6/6*4Z6|6n364g6{726~4f70217O6C7Q2z77787o5E6S7i6Q017l7A7p040=1l1;0l7H7B0)5z5B5R7j5{045H6;6+5L0.0h6h7_6=4.7K0u4x7N6A5%744x6x7S8b6t4e36896F797%6K2s0l607}3e7Z6b7c7e7g832(0G4X4C4R4E4O140l4H8I2F2A0O1Q8F0G4F5Q0S0U0W0J04.

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)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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

.128013dcnw3)=g8, t:eP4xy(+p-S6kvi512hl7/mrs_b0;oauf050b0o0m0R0B0G0L0l0c0G0R0L0L0h010m0B0v010406050L0S0J0J0R0K0s040x0Q0G0S0.0Q0d050I0^0`0|0~0?0v04051e171h0I1e0?0b0B0A0$0(0*0,0(0d0i0S0R0i0o0w0v0s0m0F150l0F0B0i0F0G1J0F0m0;050X0N0G0o1q0)0+011I1K1M1K0m1S1U1Q0m0K1f1E0$110L0v0R0d0,0E011W1s010T0Z0o0d0R0J0o1Q1=1@1|1Y1 1U22240;0a0l0p0K0Q0v0Q0L0B140d0l0V1:0K0K0o0c2p17270d1f0I1E2C1,1.1-1R0b291t0B0d212m1Q1n1p0%1X2M2O0d0Q2S1Q0v2v1f2A2C2)0@1?2q2U1}2Y0K0{0G1Q0R1H2v0T0,030M0M0c2Z0o1M2X0Q0w0E0j0w0D0;0D170R2*2-0=2,282/1Y2;2?2^2`0o2|012~3032342P37391`040E3e3g1@3i2A2L013n0R2@1f2_0F2{2}2 310V3x2Y3z0w0f0;0f3E2z3h0?3I3l0,3L3N053P3R3t3T3w2N3y380w0q0;0q3%183)3j2.1r3m0Q2=3M3p3Q3r3S3v3V3_3X3{0C0;0C402)3*2-3J3.4a3=3u3U334g363{0y0;0y4m423+453-473o3O3q3s4u3^353Y0H0;0H4D3G4o3k4G3K4I494K4b4M3@4f4P3{0j0;0j4U2B1i2%172S2F0b1.2K3,014v2R1o1f2$0o2(3h3(3G054v55280B0b0,2 2A3Y3b4K5d5f4e4w4+393b0l2d0o5m4v3W4y5q1Q0I3f433J0z0;0V0T574;4F2V010e0;0l5J5b445M0d0T0;0m0o0J0v0L0M0{0r5R5D4}0:040t5*5L2:0;1641585;1Y5-0g0n5R0?5^5K4p5l015g2-3Y3B3:0l644)5o3`3A1{5t5v4O6f375A3f0l6p5Q5`3-0;5(0B0J0_5R6r4p4}0Q0;0h6z5+4Y0J0B0;0O5 5:635e650M5h3{3!5k6Q6d5x3Y3!5s235u6R5w4x6!6n046q6A4X5M5F040T476G6s3K0;0z6`6B4Y0Q5O042N6 6;2:0N0;0K1@1z6O775{0;5/615S3J6J3c7e5T1}5-0k767p3m5?7t3J6D040u7x4}7m043d7j6H5M5|5~7j602+3I6c6S673{3}6W6j4*6l3}6$247W6e4h397U3E6/6/7I5=040b0S2v0o7C716E7^5U5X5Z5#0M0V0M0A117o3J5-7i7O707|046~7H6{5|6N8e6P5m6T394j7V6)6k7(0w4j7!6(6Y6+4i6-7,6q7.1Y6?0B5I7j6:7u6t7:7=0o7@8H8C0,7z020i0m0P7{7/6v6x0J855,0;7L4n857Q8l0w4A8o8w5p8.6h6%7$6Z4z8z8A7,8Q6|048Z6y8P6{7z6F948a7/7;7?8h895c6X7R1@4Q3p7Q6*8=4R8u8_8x394R2C6o8}7-6{0d5G0o1?0K0m8X1Y969F8K8d8*8i9f8k7S394-8:5n8`9Q8@7#8p7X8r9R7+8B6{6?2v0m7=5@2)8I867h8$4Y9z910R0r6w939e8J017r9I900V9C9E9M9~8g7M5*0I5a4=544@51170m4`ah2I2D0R1Tae0I4^600V0X0Z0L04.
Exercice 7 : un peu de binaire

Cet exerccie est à réaliser après avoir étudié Le binaire

Nombre de bits sur CodEx

V. Bilan⚓︎

Exemple

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.

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

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

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 :

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 :

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 :

def ma_fonction() :
    instruction du bloc

ma_variable  = ma_fonction()

Remarque 2 :⚓︎

Des fonctions qui ne renvoient rien

Certaines fonctions ne renvoient rien.

Exemple :

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:

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 :

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

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.