Outils pour utilisateurs

Outils du site


nsi:premiere:definition_fonctions

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
nsi:premiere:definition_fonctions [2024/08/21 16:09] goupillwikinsi: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 ======
  
-{{ :nsi:premiere:python:fonctions.eleves.pdf |Fiche élève à imprimer}}+{{ :nsi:premiere:python:fonctions.eleves.pdf |Fiche élève à imprimer}} -- [[https://diapo.goupill.fr/fonctions_organiser.html|Diaporama]]
  
 <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'algorithmes**, chaque algorithme réalisant une fonction. Un programme ordinaire est donc constitué de fonction chacune réalisant une petite partie du travail.</WRAP> <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'algorithmes**, chaque algorithme réalisant une fonction. Un programme ordinaire est donc constitué de fonction chacune réalisant une petite partie du travail.</WRAP>
Ligne 84: Ligne 84:
 print(f"Fraction réduite : {num//d}/{y//d}"); print(f"Fraction réduite : {num//d}/{y//d}");
 </code> </code>
 +
 +<WRAP tip>
 +Conventions pour les noms en plusieurs mots :
 +  * ''%%snake_case%%'', la [[https://fr.wikipedia.org/wiki/Snake_case|casse du serpent]] : tout en minuscule, mots séparés par ''%%_%%''. Pour l'exemple ''%%calcule_pgcd%%''. C'est la convention recommandée en Python.
 +  * ''%%camelCase%%'', la [[https://fr.wikipedia.org/wiki/Camel_case|casse du chameau]] : changement de mot avec une majuscule. Pour l'exemple ''%%calculePgcd%%''.
 +</WRAP>
  
 === Signature === === Signature ===
Ligne 175: Ligne 181:
 Ainsi, le principal est très lisible. On comprend en un coup d'œil ce qu'il fait. Ainsi, le principal est très lisible. On comprend en un coup d'œil ce qu'il fait.
  
-====== Définition ======+===== Avantages =====
  
-{{ :nsi:premiere:python:fonction.png?nolink&400 |}}+Les fonctions ont bien des avantages.
  
-Il s'agit d'un bloc de programme qui s'**exécute sur demande**. Lors de sa définition, on précise s'il faut lui fournir des entrées et s'il fournit en réponse des résultats en sortie.+  évitent les répétitions 
 +  facilitent les tests automatiques 
 +  les variables utilisées n'existent que le temps nécessaire. 
 +  * facilitent le travail à plusieurs 
 +  * simplifient la structure 
 +  * modularisation
  
-Quand une fonction n'a pas de sortie, on peut la qualifier de **procédure**, même si ce terme technique n'a pas grande importance.+==== return !!! ====
  
-==== Une fonction traduit un algorithme ==== +  * Une fonction ne contient **jamais** de ''print''... 
- +  * **SAUF** si la fonction est fait exprès pour l'affichage. 
-Reprenons l'exemple de l’[[nsi:premiere:alkwarizmi|algorithme de Al-Kwarizmi]]. +  * La sortie d'une fonction est faite par ''return''
- +
-<code lang-none linenums> +
-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 +
-</code> +
- +
-Les termes **entrées** / **sortie** montrent bien la proximité entre les idées d'algorithme et de fonction. +
- +
-==== Syntaxe Python ==== +
- +
-<code python linenums> +
-def extraire_solution(a, b): +
-    return (sqrt(a**2 + 4*b) - a) / 2 +
-</code> +
- +
-  * Le mot clé ''%%def%%'' introduit la définition, +
-  * La ligne de ''%%def%%'' se termine par ''%%:%%'', donc indentation après, +
-  * ''%%return%%'' est le mot-clé pour ''%%RENVOYER%%''. +
- +
-> Notez au passage que le carré est noté ''%%**2%%'' en PythonPour disposer de la fonction ''%%sqrt%%'' (square-root = racine carrée) il faudra au préalable aller la chercher dans la bibliothèque de fonction mathématique : ''%%from math import sqrt%%''+
- +
-<WRAP info> +
-En définissant la fonction, on lui donne un nom -- ici ''%%extraire_solution%%'' -- et on précise les entrées -- ou arguments -- ici ''%%a%%'' et ''%%b%%''. La ligne de définition est appelée la **signature** de la fonction+
-</WRAP> +
- +
-==== Bien nommer la fonction ==== +
- +
-Il faut choisir un nom expressif, pas ''%%f%%'' ou ''%%fonction%%'' qui ne disent rien. Le nom est choisi de façon à dire ce que fait la fonctionIci, elle extrait la solution d'une équation, il est donc naturelle de l'appeler "extraire solution". Mais on n'a pas le droit aux espaces dans les noms de variables ou de fonctions. Dans ces cas là, il existe des conventions pour harmoniser les pratiques.+
  
 <WRAP tip> <WRAP tip>
-Conventions pour les noms en plusieurs mots : +  Certaines fonctions peuvent ne rien renvoyer et ne contenir aucun ''return'' (toutefois en Pythonune fonction renvoie ''none'' à défaut d'autre chose) 
-  * ''%%snake_case%%'', la [[https://fr.wikipedia.org/wiki/Snake_case|casse du serpent]] : tout en minusculemots séparés par ''%%_%%''. Pour l'exemple ''%%extraire_solution%%''. C'est la convention recommandée en Python+  * Après l'exécution d'un ''return''la fonction se termine immédiatement
-  * ''%%camelCase%%'', la [[https://fr.wikipedia.org/wiki/Camel_case|casse du chameau]] : changement de mot avec une majusculePour l'exemple ''%%extraireSolution%%''.+  * Il peut y avoir plusieurs ''return'' dans une fonctionC'est d'ailleurs très pratique.
 </WRAP> </WRAP>
  
-==== Commenter la fonction ====+==== assert comme précondition ====
  
-Il est recommandé d'ajouter des commentaires juste après la signature de façon à expliciter l'usage de la fonction.+''assert'' permet d'indiquer une condition qui **doit** être vérifiée.
  
-<code python linenums+<code python> 
-def extraire_solution(a, b):+# monmodule.py 
 +def pgcd(a:int,b:int-> int:
     """     """
-    a, b: réels positifs + renvoie le pgcd de a et 
-    renvoie la solution réelle positive de l'équation x**2 + x = + """ 
-    """ + assert != 0 
-    return (sqrt(a**2 + 4*b) - a) / 2+ ...
 </code> </code>
  
-==== Typer entrées et sorties ====+Indique clairement la condition à laquelle la fonction fait son travail correctement.
  
-On peut ajouter des informations de types sur les entrées et sorties. Ici, nous n'avons que des réels, ce que l'on notera ''%%float%%''.+==== assert comme test élémentaire ====
  
-<code python linenums> +On sait **d'avance** que ''pgcd(15,35== 7''. On peut s'en servir comme test simple vérifiant que la fonction fait bien son travail.
-def extraire_solution(a:float, b:float) -> float: +
-    """ +
-    a, b: réels positifs +
-    renvoie la solution réelle positive de l'équation x**2 + a x = b +
-    """ +
-    return (sqrt(a**2 + 4*b- a) / 2 +
-</code>+
  
-==== Préconditions ==== +<code python> 
- +# monmodule.py 
-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é ''%%assert%%''+def pgcd(a:int,b:int) -> int:
- +
-> En mathématique, une assertion est une déclaration que l'on tient pour vraie. +
- +
- +
-<code python linenums+
-def extraire_solution(a:float, b:float) -> float:+
     """     """
-    a, b: réels positifs + renvoie le pgcd de a et 
-    renvoie la solution réelle positive de l'équation x**2 + x = + """ 
-    """ + ... 
-    assert a >= 0 +  
-    assert b >= 0 +assert pgcd(15,35== 5
-    return (sqrt(a**2 + 4*b- a) / 2+
 </code> </code>
  
 +C'est même une bonne idée de multiplier ces tests en essayant les cas bizarres.
  
-===== Exécution ===== +<code python> 
- +assert pgcd(2*3*3*7*11*233*7*23*17*17*13== 3*7 
-==== Définir n'est pas exécuter ==== +assert pgcd(0,5== 5
- +
-Si le programme entier est : +
-<code python linenums+
-# ceci est la totalité du programme +
-def extraire_solution(ab): +
-    """ +
-    a, b: réels positifs +
-    renvoie la solution réelle positive de l'équation x**2 + a x = b +
-    """ +
-    return (sqrt(a**2 + 4*b- a/ 2+
 </code> </code>
- 
-Alors à l'exécution, ce programme **ne fait rien**. En lisant ce programme, l'interpréteur Python se contente de noter qu'une fonction nommée ''%%extraire_solution%%'', demandant deux arguments, est définie des lignes 2 à 7. 
- 
-==== Demande d'exécution ==== 
- 
-<code python linenums> 
-# ceci est la totalité du programme 
-def extraire_solution(a, b): 
-    """ 
-    a, b: réels positifs 
-    renvoie la solution réelle positive de l'équation x**2 + a x = b 
-    """ 
-    return (sqrt(a**2 + 4*b) - a) / 2 
- 
-x = extraire_solution(10, 39) 
-print(x) 
-</code> 
- 
-  * Ligne 2, l'interpréteur note qu'il y a une définition pour ''%%extraire_solution%%'' et passe à la suite, ligne 8. 
-  * Ligne 9, l'interpréteur exécute ce qui est à droite de ''%%=%%'' : 
-    * fonction ''%%extraire_solution%%'' reconnue avec les arguments ''%%10%%'' et ''%%39%%'' 
-    * exécution de la fonction, retour à la ligne 2 en prenant ''%%a = 10%%'' et ''%%b = 39%%'', 
-    * ligne 7, le calcul ''%%(sqrt(a**2 + 4*b) - a) / 2%%'' donne ''%%3.0%%''. La fonction renvoie ''%%3.0%%'' 
-    * Retour à la ligne 9. L'exécution de la fonction a produit le nombre ''%%3.0%%''. Donc ''%%x = 3.0%%'', 
-  * ligne 10, l'affichage de ''%%x%%'' conduit à l'affichage de ''%%3.0%%''. 
  
 ==== Les parenthèses sont signe de fonction ==== ==== Les parenthèses sont signe de fonction ====
nsi/premiere/definition_fonctions.1724249376.txt.gz · Dernière modification : de goupillwiki