nsi:premiere:definition_fonctions
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| nsi:premiere:definition_fonctions [2021/06/21 11:48] – 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' | ||
| Ligne 5: | Ligne 7: | ||
| <WRAP important> | <WRAP important> | ||
| - | ====== Définition ====== | + | ===== Besoin d' |
| - | {{ : | + | ==== Un programme mal écrit ==== |
| - | Il s'agit d'un bloc de programme | + | Prenons |
| - | Quand une fonction n'a pas de sortie, on peut la qualifier de **procédure**, | + | <code python linenums> |
| + | x = int(input()) | ||
| + | y = int(input()) | ||
| + | a = x | ||
| + | b = y | ||
| + | while | ||
| + | r = a % b | ||
| + | a = b | ||
| + | b = r | ||
| + | z = b | ||
| + | print(x// | ||
| + | print(y// | ||
| + | </ | ||
| - | ==== Une fonction traduit | + | * Celui qui écrit le programme est encore dans son idée, il se comprend peut-être... mais dès qu'il oublie |
| + | * Pour un autre, la compréhension de ce programme demandera beaucoup d' | ||
| - | Reprenons l' | + | **Le programmeur doit faire un effort |
| - | <code lang-none linenums> | + | ==== Mieux nommer |
| - | ENTRÉES : a et b, réels positifs | + | |
| - | SORTIE : solution réelle positive de x^2 + a * x = b | + | |
| - | DÉBUT | + | |
| - | RENVOYER (racine(a^2 + 4*b) - a) / 2 | + | |
| - | FIN | + | |
| - | </ | + | |
| - | + | ||
| - | Les termes **entrées** / **sortie** montrent bien la proximité entre les idées d' | + | |
| - | ==== Syntaxe Python ==== | + | Les variables doivent être mieux nommées pour qu'on sache ce qu' |
| <code python linenums> | <code python linenums> | ||
| - | def extraire_solution(a, b): | + | num = int(input(" |
| - | | + | den = int(input(" |
| + | a = num | ||
| + | b = den | ||
| + | while a % b != 0: | ||
| + | | ||
| + | | ||
| + | b = r | ||
| + | d = b | ||
| + | print(f" | ||
| </ | </ | ||
| - | * Le mot clé '' | + | C' |
| - | * La ligne de '' | + | |
| - | * '' | + | |
| - | > Notez au passage que le carré est noté '' | + | ==== Extraire |
| - | <WRAP info> | + | Le programme contient |
| - | En définissant la fonction, on lui donne un nom -- ici '' | + | |
| - | </ | + | |
| - | ==== Bien nommer la fonction ==== | + | <code python linenums> |
| + | def ma_fonction(a, | ||
| + | while a % b != 0: | ||
| + | r % b | ||
| + | a = b= a | ||
| + | b = r | ||
| + | return b | ||
| - | Il faut choisir un nom expressif, pas '' | + | num = int(input(" |
| + | den = int(input(" | ||
| + | d = ma_fonction(num, den) | ||
| + | print(f" | ||
| + | </ | ||
| + | |||
| + | On peut améliorer les choses en nommant convenablement | ||
| + | |||
| + | <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"Fraction réduite : {num// | ||
| + | </ | ||
| <WRAP tip> | <WRAP tip> | ||
| Conventions pour les noms en plusieurs mots : | Conventions pour les noms en plusieurs mots : | ||
| - | * '' | + | * '' |
| - | * '' | + | * '' |
| </ | </ | ||
| - | ==== Commenter la fonction ==== | + | === Signature |
| - | Il est recommandé d' | + | <code python linenums: |
| + | def pgcd(a, | ||
| + | </ | ||
| - | <code python linenums> | + | Cette ligne est la définition de la fonction. Elle indique le **nom** de la fonction et elle indique les entrées nécessaires. |
| - | def extraire_solution(a, b): | + | |
| - | "" | + | {{ : |
| - | a, b: réels positifs | + | |
| - | renvoie la solution réelle positive de l' | + | === principal === |
| - | """ | + | |
| - | | + | <code python linenums:8> |
| + | num = int(input(" | ||
| + | den = int(input("Dénominateur : ")) | ||
| + | d = pgcd(num, den) | ||
| + | print(f" | ||
| </ | </ | ||
| - | ==== Typer entrées et sorties ==== | + | Ces lignes constituent la partie principale du programme. À la ligne 10 notamment, on appelle la fonction '' |
| - | On peut ajouter des informations | + | <WRAP important> |
| + | |||
| + | === Documenter la fonction === | ||
| + | |||
| + | On appelle **documentation** le bloc de texte que l' | ||
| <code python linenums> | <code python linenums> | ||
| - | def extraire_solution(a:float, b:float) -> float: | + | def pgcd(a, b): |
| """ | """ | ||
| - | | + | a: entier |
| - | renvoie | + | |
| + | renvoie | ||
| """ | """ | ||
| - | | + | |
| + | r % b | ||
| + | | ||
| + | b = r | ||
| + | return b | ||
| </ | </ | ||
| - | ==== Préconditions ==== | + | Vous **devez** documenter vos fonctions. |
| - | S'il est important de vérifier que les préconditions sont bien remplies, on peut forcer une vérification grâce au mot-clé '' | + | === Typer === |
| - | > En mathématique, | + | 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> | <code python linenums> | ||
| - | def extraire_solution(a:float, b:float) -> float: | + | # monmodumle.py |
| + | |||
| + | def pgcd(a:int, b:int) -> int: | ||
| """ | """ | ||
| - | | + | a: entier |
| - | renvoie | + | |
| + | renvoie | ||
| """ | """ | ||
| - | | + | |
| - | | + | |
| - | | + | a = b= a |
| + | b = r | ||
| + | return b | ||
| </ | </ | ||
| + | </ | ||
| + | <WRAP half column> | ||
| + | <code python linenums> | ||
| + | # main.py | ||
| + | from monmodule import pgcd | ||
| - | ===== Exécution ===== | + | num = int(input(" |
| + | den = int(input(" | ||
| + | d = pgcd(num, den) | ||
| + | print(f" | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| - | ==== Définir n'est pas exécuter ==== | + | Ainsi, le principal |
| - | Si le programme entier | + | ===== Avantages ===== |
| - | <code python linenums> | + | |
| - | # ceci est la totalité du programme | + | Les fonctions ont bien des avantages. |
| - | def extraire_solution(a, b): | + | |
| - | """ | + | * évitent les répétitions |
| - | a, b: réels positifs | + | * facilitent les tests automatiques |
| - | renvoie | + | * les variables utilisées n' |
| + | * facilitent le travail à plusieurs | ||
| + | * simplifient la structure | ||
| + | * modularisation | ||
| + | |||
| + | ==== return !!! ==== | ||
| + | |||
| + | * Une fonction ne contient **jamais** de '' | ||
| + | * **SAUF** si la fonction | ||
| + | * 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:int,b:int) -> int: | ||
| """ | """ | ||
| - | return (sqrt(a**2 + 4*b) - a) / 2 | + | renvoie le pgcd de a et b |
| + | """ | ||
| + | assert b != 0 | ||
| + | ... | ||
| </ | </ | ||
| - | Alors à l' | + | Indique clairement la condition |
| - | ==== Demande d' | + | ==== assert comme test élémentaire |
| - | <code python linenums> | + | On sait **d'avance** que '' |
| - | # ceci est la totalité du programme | + | |
| - | def extraire_solution(a, | + | |
| - | """ | + | |
| - | a, b: réels positifs | + | |
| - | renvoie la solution réelle positive de l'équation x**2 + a x = b | + | |
| - | """ | + | |
| - | return | + | |
| - | x = extraire_solution(10, 39) | + | <code python> |
| - | print(x) | + | # monmodule.py |
| + | def pgcd(a:int,b:int) -> int: | ||
| + | """ | ||
| + | renvoie le pgcd de a et b | ||
| + | """ | ||
| + | ... | ||
| + | |||
| + | assert pgcd(15,35) == 5 | ||
| </ | </ | ||
| - | * Ligne 2, l'interpréteur note qu'il y a une définition pour '' | + | C'est même une bonne idée de multiplier ces tests en essayant les cas bizarres. |
| - | * Ligne 9, l' | + | |
| - | * fonction '' | + | <code python> |
| - | * exécution de la fonction, retour à la ligne 2 en prenant '' | + | assert pgcd(2*3*3*7*11*23, 3*7*23*17*17*13) == 3*7 |
| - | | + | assert pgcd(0, |
| - | * Retour à la ligne 9. L' | + | </ |
| - | * ligne 10, l' | + | |
| ==== Les parenthèses sont signe de fonction ==== | ==== Les parenthèses sont signe de fonction ==== | ||
| Ligne 147: | Ligne 250: | ||
| </ | </ | ||
| - | '' | + | '' |
nsi/premiere/definition_fonctions.1624268887.txt.gz · Dernière modification : de goupillwiki
