Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Prochaine révisionLes deux révisions suivantes |
python:bases:fonction [2022/09/03 10:05] – [1.4 Signature d'une fonction] phil | python:bases:fonction [2022/09/03 10:22] – [6. La fonction main()] phil |
---|
* **Mots-clés** : fonction, paramètre, déclaration, appel, signature, docstring, indication de type, lambda, espace de nom. | * **Mots-clés** : fonction, paramètre, déclaration, appel, signature, docstring, indication de type, lambda, espace de nom. |
| |
<note important>Les mots ci-dessous sont dits "réservés". Ils ne peuvent pas être utilisés comme nom de variable. Les mots __soulignés__ sont une nouveauté de Python 3. Les mots en **gras** sont utilisés dans cette page.</note> | <callout type="warning" icon="true">Les mots ci-dessous sont dits "réservés". Ils ne peuvent pas être utilisés comme nom de variable. Les mots __soulignés__ sont une nouveauté de Python 3. Les mots en **gras** sont utilisés dans cette page.</callout> |
| |
| and | continue | finally | is | raise | | | and | continue | finally | is | raise | |
En programmation, une fonction est un « **sous-programme** » permettant d'effectuer des opérations répétitives. Au lieu d'écrire le code complet autant de fois que nécessaire, on crée une fonction que l’on appellera pour l'exécuter, ce qui peut aussi alléger le code et le rendre plus lisible. <html><a href="https://fr.wikiversity.org/wiki/G%C3%A9n%C3%A9ralit%C3%A9s_sur_les_fonctions" target="_blank">Wikiversité</a></html> | En programmation, une fonction est un « **sous-programme** » permettant d'effectuer des opérations répétitives. Au lieu d'écrire le code complet autant de fois que nécessaire, on crée une fonction que l’on appellera pour l'exécuter, ce qui peut aussi alléger le code et le rendre plus lisible. <html><a href="https://fr.wikiversity.org/wiki/G%C3%A9n%C3%A9ralit%C3%A9s_sur_les_fonctions" target="_blank">Wikiversité</a></html> |
| |
<note>Pour utiliser une fonction, deux étapes sont nécessaires : \\ | <callout type="primary" icon="true">Pour utiliser une fonction, deux étapes sont nécessaires : \\ |
1. **déclarer** la fonction \\ | 1. **déclarer** la fonction \\ |
2. **appeler** la fonction | 2. **appeler** la fonction |
</note> | </callout> |
| |
=== 1.1 Forme simple de la déclaration et de l'appel (ordonnée)=== | === 1.1 Forme simple de la déclaration et de l'appel (ordonnée)=== |
> L'instruction **//return//** renvoie la valeur calculée par une fonction. On peut ainsi l'affecter à une variable. Cette instruction arrête le déroulement de la fonction. Le code situé après //return// ne s'exécutera pas. | > L'instruction **//return//** renvoie la valeur calculée par une fonction. On peut ainsi l'affecter à une variable. Cette instruction arrête le déroulement de la fonction. Le code situé après //return// ne s'exécutera pas. |
| |
<note>En Python, une fonction **peut renvoyer plusieurs valeurs**, séparées par une virgule, que l'on affecte à plusieurs variables également séparées par une virgule.</note> | <callout type="primary" icon="true">En Python, une fonction **peut renvoyer plusieurs valeurs**, séparées par une virgule, que l'on affecte à plusieurs variables également séparées par une virgule.</callout> |
| |
//Exemple// | //Exemple// |
Python ne disposant pas d'accolade pour délimiter les blocs de code, il existe une instruction **pass**, qui ne fait rien. | Python ne disposant pas d'accolade pour délimiter les blocs de code, il existe une instruction **pass**, qui ne fait rien. |
| |
<note tip>**pass** permet de définir une **fonction vide**. </note> | <callout type="tip" icon="true">**pass** permet de définir une **fonction vide**.</callout> |
| |
//Exemple// | //Exemple// |
=== 1.4 Signature d'une fonction === | === 1.4 Signature d'une fonction === |
| |
<note>En Python, **la signature** d'une fonction est **son nom**. </note> | <callout type="primary" icon="true">En Python, **la signature** d'une fonction est **son nom**.</callout> |
| |
//Exemple// | //Exemple// |
| |
=== 1.5 Indication de type === | === 1.5 Indication de type === |
<note>Depuis **Python 3.5**, il est possible de fournir des indicateurs de type lors de la définition des fonctions.</note> | <callout type="primary" icon="true">Depuis **Python 3.5**, il est possible de fournir des indicateurs de type lors de la définition des fonctions.</callout> |
| |
//Exemple// | //Exemple// |
| |
=== 2.1 Paramètres par défaut (optionnels) === | === 2.1 Paramètres par défaut (optionnels) === |
<note>On peut préciser une **valeur par défaut** pour les paramètres de la fonction.</note> | <callout type="primary" icon="true">On peut préciser une **valeur par défaut** pour les paramètres de la fonction.</callout> |
| |
<code python exfonc2.py> | <code python exfonc2.py> |
</code> | </code> |
| |
<note>La chaîne placée entre **' ' '** et **' ' '** est une **docstring**, elle est affichable par **help(//nomfonction//)** | <callout type="primary" icon="true">La chaîne placée entre **' ' '** et **' ' '** est une **docstring**, elle est affichable par **help(//nomfonction//)** |
</note> | </callout> |
| |
// Exemple// | // Exemple// |
{{ :python:docstring.png?nolink&500 |}} | {{ :python:docstring.png?nolink&500 |}} |
| |
<note tip>Les arguments peuvent être passés dans un** ordre quelconque** si on précise le nom des paramètres.</note> | <callout type="tip" icon="true">Les arguments peuvent être passés dans un** ordre quelconque** si on précise le nom des paramètres.</callout> |
| |
// Exemple// | // Exemple// |
</code> | </code> |
| |
<note warning>Ne **pas** utiliser **d'objet mutable** pour les valeurs par défaut. A <html><a href="https://docs.python.org/3/faq/programming.html#why-are-default-values-shared-between-objects" target="_blank">voir.</a></html></note> | <callout icon="fa fa-hand-stop-o" color="red" title="ATTENTION">Ne **pas** utiliser **d'objet mutable** pour les valeurs par défaut. A <html><a href="https://docs.python.org/3/faq/programming.html#why-are-default-values-shared-between-objects" target="_blank">voir.</a></html></callout> |
| |
//Exemple// | //Exemple// |
=== 2.2 Liste et paramètres de fonction === | === 2.2 Liste et paramètres de fonction === |
| |
<note>Lorsque le **nombre de paramètres** d'une fonction est **inconnu**, on lui passe une liste en plaçant une étoile <html><strong>*</strong></html> devant le nom du paramètre destiné à recevoir la liste.</note> | <callout type="primary" icon="true">Lorsque le **nombre de paramètres** d'une fonction est **inconnu**, on lui passe une liste en plaçant une étoile <html><strong>*</strong></html> devant le nom du paramètre destiné à recevoir la liste.</callout> |
| |
//Exemple// | //Exemple// |
=== 2.3 Dictionnaires et paramètres de fonction === | === 2.3 Dictionnaires et paramètres de fonction === |
| |
<note>On peut récupérer les **paramètres nommés** dans une fonction en plaçant **deux étoiles** <html><strong>**</strong></html> devant le nom du paramètre destiné à recevoir le dictionnaire.</note> | <callout type="primary" icon="true">On peut récupérer les **paramètres nommés** dans une fonction en plaçant **deux étoiles** <html><strong>**</strong></html> devant le nom du paramètre destiné à recevoir le dictionnaire.</callout> |
| |
//Exemple// | //Exemple// |
| |
=== 2.4 Synthèse === | === 2.4 Synthèse === |
<note> | <callout type="primary" icon="true"> |
Lors de la **définition de l'en-tête** d'une fonction, les 4 familles de **paramètres** que l'on peut déclarer sont : | Lors de la **définition de l'en-tête** d'une fonction, les 4 familles de **paramètres** que l'on peut déclarer sont : |
- les paramètres positionnels (usuels), | - les paramètres positionnels (usuels), |
- passés avec la forme <nowiki>*</nowiki> (tuple unpacking) | - passés avec la forme <nowiki>*</nowiki> (tuple unpacking) |
- passés avec la forme <nowiki>**</nowiki> (dictionnaire) | - passés avec la forme <nowiki>**</nowiki> (dictionnaire) |
</note> | </callout> |
==== 3. Portée des variables ==== | ==== 3. Portée des variables ==== |
Les **arguments** passés dans les fonctions sont des //**variables locales**//. Elles n'existent qu'à l'intérieur de la fonction contrairement aux //**variables globales**// déclarées dans le programme principal. Pour plus d'informations, voir "[[python:bases:variables|Variables, types numériques et entrées / sorties dans la console]]" | Les **arguments** passés dans les fonctions sont des //**variables locales**//. Elles n'existent qu'à l'intérieur de la fonction contrairement aux //**variables globales**// déclarées dans le programme principal. Pour plus d'informations, voir "[[python:bases:variables|Variables, types numériques et entrées / sorties dans la console]]" |
Python permet de définir des **mini-fonctions** sur une ligne. Empruntées à Lisp, ces fonctions dites **lambda** peuvent être employées partout où une fonction est nécessaire. | Python permet de définir des **mini-fonctions** sur une ligne. Empruntées à Lisp, ces fonctions dites **lambda** peuvent être employées partout où une fonction est nécessaire. |
| |
<note>Une fonction lambda est une fonction qui prend un nombre quelconque d’arguments (y compris des arguments optionnels) et **retourne la valeur d’une unique expression**.</note> | <callout type="primary" icon="true">Une fonction lambda est une fonction qui prend un nombre quelconque d’arguments (y compris des arguments optionnels) et **retourne la valeur d’une unique expression**.</callout> |
| |
* //Syntaxe// | * //Syntaxe// |
</code> | </code> |
| |
<note warning>Les fonctions lambda ne peuvent ni contenir des commandes ni contenir plus d’une expression. </note> | <callout icon="fa fa-hand-stop-o" color="red" title="ATTENTION">Les fonctions lambda ne peuvent ni contenir des commandes ni contenir plus d’une expression. </callout> |
| |
==== 5. Les fonctions natives (buit-in) ==== | ==== 5. Les fonctions natives (buit-in) ==== |
* **Source** : <html><a href="https://docs.python.org/fr/3.5/library/functions.html" target="_blank">fonctions natives</a></html> sur python.org | * **Source** : <html><a href="https://docs.python.org/fr/3.5/library/functions.html" target="_blank">fonctions natives</a></html> sur python.org |
| |
<note>L’interpréteur Python propose quelques **fonctions** et types natifs qui sont **toujours disponibles**. \\ La liste et la description sont accessibles à partir du lien ci-dessus.</note> | <callout type="primary" icon="true">L’interpréteur Python propose quelques **fonctions** et types natifs qui sont **toujours disponibles**. \\ La liste et la description sont accessibles à partir du lien ci-dessus.</callout> |
| |
==== 6. La fonction main() ==== | ==== 6. La fonction main() ==== |
Néanmoins, avoir un point de départ défini pour l'exécution d'un programme est utile pour comprendre le fonctionnement d'un programme. Les programmeurs Python ont mis au point plusieurs conventions pour définir ce point de départ. | Néanmoins, avoir un point de départ défini pour l'exécution d'un programme est utile pour comprendre le fonctionnement d'un programme. Les programmeurs Python ont mis au point plusieurs conventions pour définir ce point de départ. |
| |
<note>Il existe deux manières de demander à l'interpréteur Python d'exécuter ou d'utiliser du code : \\ | <callout type="primary" icon="true">Il existe deux manières de demander à l'interpréteur Python d'exécuter ou d'utiliser du code : \\ |
1. En tant que **script** à l'aide de la ligne de commande. \\ | 1. En tant que **script** à l'aide de la ligne de commande. \\ |
2. En **important** le code d'un fichier Python dans un autre fichier ou dans l'interpréteur interactif. \\ \\ | 2. En **important** le code d'un fichier Python dans un autre fichier ou dans l'interpréteur interactif. \\ \\ |
Quelle que soit la façon d'exécuter le code, Python définit une variable spéciale appelée **<nowiki>__name__</nowiki>** qui contient une chaîne dont la valeur dépend de la façon dont le code est utilisé. | Quelle que soit la façon d'exécuter le code, Python définit une variable spéciale appelée **<nowiki>__name__</nowiki>** qui contient une chaîne dont la valeur dépend de la façon dont le code est utilisé. |
</note> | </callout> |
| |
* // Première illustration de la valeur de <nowiki>__name__</nowiki> // : on crée le fichier //methodes.py// ci-dessous et on l'exécute. | * // Première illustration de la valeur de <nowiki>__name__</nowiki> // : on crée le fichier //methodes.py// ci-dessous et on l'exécute. |
</code> | </code> |
| |
<note important>Un module **<nowiki>__name__</nowiki>** est égal à '**<nowiki>__main__</nowiki>**' lorsqu'il est lu à partir d'une entrée standard, d'un script ou d'une invite interactive.</note> | <callout type="warning" icon="true">Un module **<nowiki>__name__</nowiki>** est égal à '**<nowiki>__main__</nowiki>**' lorsqu'il est lu à partir d'une entrée standard, d'un script ou d'une invite interactive.</callout> |
| |
* **//Bonnes pratiques//** | * **//Bonnes pratiques//** |