nsi:premiere:definition_fonctions
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
| nsi:premiere:definition_fonctions [2021/06/21 10:53] – créée goupillwiki | nsi:premiere:definition_fonctions [2024/08/21 16:21] (Version actuelle) – goupillwiki | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | ====== Fonctions : Définition et syntaxe Python | + | ====== Fonctions : organiser le code ====== |
| + | |||
| + | {{ : | ||
| <WRAP tip>On a dit qu'un programme était la traduction d'un algorithme dans un langage de programmation. Ce n'est pas tout à fait exact. Il est plus juste de dire que le programme traduit un **ensemble d' | <WRAP tip>On a dit qu'un programme était la traduction d'un algorithme dans un langage de programmation. Ce n'est pas tout à fait exact. Il est plus juste de dire que le programme traduit un **ensemble d' | ||
| <WRAP important> | <WRAP important> | ||
| + | |||
| + | ===== Besoin d' | ||
| + | |||
| + | ==== Un programme mal écrit ==== | ||
| + | |||
| + | Prenons un programme mal écrit : | ||
| + | |||
| + | <code python linenums> | ||
| + | x = int(input()) | ||
| + | y = int(input()) | ||
| + | a = x | ||
| + | b = y | ||
| + | while a % b != 0: | ||
| + | r = a % b | ||
| + | a = b | ||
| + | b = r | ||
| + | z = b | ||
| + | print(x//z) | ||
| + | print(y//z) | ||
| + | </ | ||
| + | |||
| + | * Celui qui écrit le programme est encore dans son idée, il se comprend peut-être... mais dès qu'il oublie un peu, il ne se comprend plus lui-même ! | ||
| + | * Pour un autre, la compréhension de ce programme demandera beaucoup d' | ||
| + | |||
| + | **Le programmeur doit faire un effort de lisibilité !** | ||
| + | |||
| + | ==== Mieux nommer les variables ==== | ||
| + | |||
| + | Les variables doivent être mieux nommées pour qu'on sache ce qu' | ||
| + | |||
| + | <code python linenums> | ||
| + | num = int(input(" | ||
| + | den = int(input(" | ||
| + | a = num | ||
| + | b = den | ||
| + | while a % b != 0: | ||
| + | r = a % b | ||
| + | a = b | ||
| + | b = r | ||
| + | d = b | ||
| + | print(f" | ||
| + | </ | ||
| + | |||
| + | C'est un peu mieux. | ||
| + | |||
| + | ==== Extraire la fonction ==== | ||
| + | |||
| + | Le programme contient un calcul basé sur le '' | ||
| + | |||
| + | <code python linenums> | ||
| + | def ma_fonction(a, | ||
| + | while a % b != 0: | ||
| + | r % b | ||
| + | a = b= a | ||
| + | b = r | ||
| + | return b | ||
| + | |||
| + | num = int(input(" | ||
| + | den = int(input(" | ||
| + | d = ma_fonction(num, | ||
| + | print(f" | ||
| + | </ | ||
| + | |||
| + | On peut améliorer les choses en nommant convenablement la fonction. | ||
| + | |||
| + | <code python linenums> | ||
| + | def pgcd(a,b): | ||
| + | while a % b != 0: | ||
| + | r % b | ||
| + | a = b= a | ||
| + | b = r | ||
| + | return b | ||
| + | |||
| + | num = int(input(" | ||
| + | den = int(input(" | ||
| + | d = pgcd(num, den) | ||
| + | print(f" | ||
| + | </ | ||
| + | |||
| + | <WRAP tip> | ||
| + | Conventions pour les noms en plusieurs mots : | ||
| + | * '' | ||
| + | * '' | ||
| + | </ | ||
| + | |||
| + | === Signature === | ||
| + | |||
| + | <code python linenums: | ||
| + | def pgcd(a,b): | ||
| + | </ | ||
| + | |||
| + | Cette ligne est la définition de la fonction. Elle indique le **nom** de la fonction et elle indique les entrées nécessaires. | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | === principal === | ||
| + | |||
| + | <code python linenums: | ||
| + | num = int(input(" | ||
| + | den = int(input(" | ||
| + | d = pgcd(num, den) | ||
| + | print(f" | ||
| + | </ | ||
| + | |||
| + | Ces lignes constituent la partie principale du programme. À la ligne 10 notamment, on appelle la fonction '' | ||
| + | |||
| + | <WRAP important> | ||
| + | |||
| + | === Documenter la fonction === | ||
| + | |||
| + | On appelle **documentation** le bloc de texte que l'on écrit sous la signature : | ||
| + | |||
| + | <code python linenums> | ||
| + | def pgcd(a, b): | ||
| + | """ | ||
| + | a: entier | ||
| + | b: entier non nul | ||
| + | renvoie le pgcd de a, b | ||
| + | """ | ||
| + | while a % b != 0: | ||
| + | r % b | ||
| + | a = b= a | ||
| + | b = r | ||
| + | return b | ||
| + | </ | ||
| + | |||
| + | Vous **devez** documenter vos fonctions. | ||
| + | |||
| + | === Typer === | ||
| + | |||
| + | On peut indiquer dans la signature les types des entrées et sorties de la fonction. Ce n'est pas obligatoire et n'est pas exigé en NSI. C'est bien de le faire du moment que cela reste simple. | ||
| + | |||
| + | <code python linenums> | ||
| + | def pgcd(a: | ||
| + | ... | ||
| + | </ | ||
| + | |||
| + | ==== Modulariser ==== | ||
| + | |||
| + | On peut pousser l' | ||
| + | |||
| + | <WRAP group> | ||
| + | <WRAP half column> | ||
| + | <code python linenums> | ||
| + | # monmodumle.py | ||
| + | |||
| + | def pgcd(a:int, b:int) -> int: | ||
| + | """ | ||
| + | a: entier | ||
| + | b: entier non nul | ||
| + | renvoie le pgcd de a, b | ||
| + | """ | ||
| + | while a % b != 0: | ||
| + | r % b | ||
| + | a = b= a | ||
| + | b = r | ||
| + | return b | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <WRAP half column> | ||
| + | <code python linenums> | ||
| + | # main.py | ||
| + | from monmodule import pgcd | ||
| + | |||
| + | num = int(input(" | ||
| + | den = int(input(" | ||
| + | d = pgcd(num, den) | ||
| + | print(f" | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Ainsi, le principal est très lisible. On comprend en un coup d'œil ce qu'il fait. | ||
| + | |||
| + | ===== Avantages ===== | ||
| + | |||
| + | Les fonctions ont bien des avantages. | ||
| + | |||
| + | * évitent les répétitions | ||
| + | * facilitent les tests automatiques | ||
| + | * les variables utilisées n' | ||
| + | * facilitent le travail à plusieurs | ||
| + | * simplifient la structure | ||
| + | * modularisation | ||
| + | |||
| + | ==== return !!! ==== | ||
| + | |||
| + | * Une fonction ne contient **jamais** de '' | ||
| + | * **SAUF** si la fonction est fait exprès pour l' | ||
| + | * La sortie d'une fonction est faite par '' | ||
| + | |||
| + | <WRAP tip> | ||
| + | * Certaines fonctions peuvent ne rien renvoyer et ne contenir aucun '' | ||
| + | * Après l' | ||
| + | * Il peut y avoir plusieurs '' | ||
| + | </ | ||
| + | |||
| + | ==== assert comme précondition ==== | ||
| + | |||
| + | '' | ||
| + | |||
| + | <code python> | ||
| + | # monmodule.py | ||
| + | def pgcd(a: | ||
| + | """ | ||
| + | renvoie le pgcd de a et b | ||
| + | """ | ||
| + | assert b != 0 | ||
| + | ... | ||
| + | </ | ||
| + | |||
| + | Indique clairement la condition à laquelle la fonction fait son travail correctement. | ||
| + | |||
| + | ==== assert comme test élémentaire ==== | ||
| + | |||
| + | On sait **d' | ||
| + | |||
| + | <code python> | ||
| + | # monmodule.py | ||
| + | def pgcd(a: | ||
| + | """ | ||
| + | renvoie le pgcd de a et b | ||
| + | """ | ||
| + | ... | ||
| + | |||
| + | assert pgcd(15,35) == 5 | ||
| + | </ | ||
| + | |||
| + | C'est même une bonne idée de multiplier ces tests en essayant les cas bizarres. | ||
| + | |||
| + | <code python> | ||
| + | assert pgcd(2*3*3*7*11*23, | ||
| + | assert pgcd(0,5) == 5 | ||
| + | </ | ||
| + | |||
| + | ==== Les parenthèses sont signe de fonction ==== | ||
| + | |||
| + | <code python> | ||
| + | >>> | ||
| + | >>> | ||
| + | TypeError: ' | ||
| + | </ | ||
| + | |||
| + | '' | ||
| + | |||
nsi/premiere/definition_fonctions.1624265591.txt.gz · Dernière modification : de goupillwiki
