# Bases de Python - Partie 3 - Fonctions

## Fonctions

Vous connaissez déjà certaines fonctions, celles que vous avez utilisées lors du précédent TP : `print`, `input`, `range` ... Ce sont des fonctions que vous avez **appelées** mais qui existent déjà par défaut dans le langage Python.

### Appeler une fonction

- Les fonction s'utilisent avec la syntaxe suivante : `nom_de_la_fonction(parametre_1, parametre_2, ...., parametre_n)`
    - Vous mettez le nom de la fonction, suivi de parenthèses
    - Entre les parenthèses vous mettez les paramètres séparés par des virgules
    - Si une fonction n'a pas besoin de paramètres, les parenthèses sont quand même indispensables.

- Certaines fonctions peuvent prendre des paramètres nommés, avec la syntaxe suivante : `nom_de_la_fonction(nom_parametre=valeur_parametre)`. Les paramètres nommés sont toujours à la fin et leur ordre n'a pas d'importance.

- Une fonction peut renvoyer un résultat, que l'on peut alors affecter à une variable.
- Si une fonction ne renvoie rien, alors elle renverra en réalité la valeur spéciale `None`.

```admonish success title='À retenir'
- Les fonctions servent à rendre votre code plus clair et mieux découpé. Elles permettent de réutiliser du code.
- Pour déclarer une fonction en python :
    ~~~python
    def nom_de_la_fonction(parametre_1, parametre_2, ..., parametre_n):
        # Instructions
    ~~~
    - On utilise le mot-clé `def` suivi du nom de la fonction. 
    - Entre parenthèses on ajoute les paramètres qu'il faudra fournir
    - À la fin de la ligne on met `:` (encore et toujours)
    - On passe à la ligne suivante et on indente pour écrire les instructions.
- Les paramètres fonctionnent comme des variables : on peut les utiliser dans la fonction avec leur nom.
- On peut définir une valeur par défaut à un paramètre : il suffit d'écrire `parametre=valeur_par_defaut` lors de la déclaration. On peut alors omettre le paramètre, qui prendra automatiquement la valeur par défaut.
- Deux fonctions ne peuvent pas avoir le même nom, sinon, la dernière a avoir été déclarée écrase la précédente.
```

```admonish success title="À retenir"
- L'instruction `return` permet de sortir immédiatement d'une fonction. Rien ne s'exécutera après le `return`
- `return` permet de retourner un résultat, avec la syntaxe `return valeur`. Si aucune valeur n'est mentionnée, elle retournera `None`
- Si `return` n'est pas mentionnée, la fonction s'exécute jusqu'au bout et sortira à la fin du bloc d'instructions en retournant `None`
- On peut retourner plusieurs valeurs en les séparant par une virgule. 
    - Ces valeurs peuvent être affectées à une seule variable sous forme d'un **tuple** (nous en parlerons au prochain TP)
    - Chaque valeur peut être affectée à une variable différente avec la syntaxe `variable_1, variable_2 ... = nom_de_la_fonction(...)`.
```

```admonish tip title='Bonnes pratiques'
- Faites des fonctions courtes qui vont à l'essentiel (20 lignes est un bon maximum)
- Choisissez bien les noms de vos fonctions et de vos paramètres pour qu'ils soient clairs et explicites
- Vous pouvez documenter vos fonctions à l'aide d'une **docstring** : après l'en-tête de la fonction, avant le bloc d'instructions vous pouvez écrire une chaîne de caractères qui commence par 3 `"` ou `'`. 
    Exemple:
    ~~~python
    def ma_fonction(arg_1, arg2):
        """Ceci est une docstring qui vient documenter ma fonction.
        Une docstring peut prendre plusieurs lignes.
        """
        # Bloc d'instructions
    ~~~
```


# Annexes

## Un petit peu d'anglais

|Français|Anglais|
|--------|-------|
|Interpréteur|Interpreter|
|Invite de commande|Command prompt|
|Opérateur|Operator|
|Fonction|Function|
|Racine carrée|Square root|
|Affecter une variable|Assign a variable|
|Sensible à la casse|Case sensitive|
|Mot-clé|Keyword|
|Mot clé réservé|Reserved keyword|
|Typage dynamique|Dynamic typing|
|Chaîne de caractères|String|
|Chaîne de caractères formatée|Formatted string|
|Boucle|Loop|
