(prog_formel.fonctions)=
# 3. Les fonctions
Mémento Python
Raccourcis clavier
## C'est quoi une fonction ? đ€š
Python, comme tout autre langage de programmation, contient tout une sĂ©ries de fonctions, câest-Ă -dire **des instructions dĂ©jĂ dĂ©finies qui font faire quelque chose de prĂ©cis au programme**.
Nous en avons dĂ©jĂ utilisĂ©s deux au chapitre prĂ©cĂ©dent, la fonction `print` qui affiche quelque chose Ă lâĂ©cran et la fonction `type` qui retourne le type dâun objet.
Elles permettent aux programmeurs de **gagner du temps en rĂ©utilisant du code dĂ©jĂ Ă©crit (par quelqu'un d'autre)** đ
**Lâappel dâune fonction sâeffectue en indiquant la nom de la fonction, suivi dâune paires de parenthĂšses**.
Ces parenthĂšse contiennent les Ă©ventuels arguments de la fonction, câest-Ă -dire les objets nĂ©cessaires pour que la fonction puisse ĂȘtre exĂ©cutĂ©e.
Sâil y en a plusieurs, ces arguments sont sĂ©parĂ©s par des virgules.
```{codeplay}
print("Hello!")
type(56.8) # calcule le type de 56.8 (float) mais n'affiche rien
a = "rouge"
print(a)
type(a) # calcule le type de a (str) mais n'affiche rien
```
Dans lâexemple ci-dessus, chaque appel de fonction se fait en fournissant un argument.
Cet argument peut soit ĂȘtre une valeur donnĂ©e directement (comme dans les deux premiĂšres lignes), soit une variable (ligne 4-5).
**Certaines fonctions prennent plus quâun argument** comme la fonction `pow` qui calcule la puissance de deux nombres, et qui a donc besoin de deux arguments.
```{codeplay}
a = pow(2, 3) # calcule 2 puissance 3
print(a)
```
â ïž Si vous ne donnez quâun seul argument Ă la fonction `pow`, Python vous indiquera une erreur. â ïž
**Souvent, les fonctions retournent une valeur qui contient le résultat de la fonction**.
Dans lâexemple ci-dessus, ce rĂ©sultat (ici 8) est stockĂ© dans la variable `a` puis affichĂ©.
La fonction `print` a ceci de spĂ©cial quâelle peut accueillir zĂ©ro, un, ou plusieurs arguments.
Chaque argument sera alors affiché et séparé par un espace.
```{codeplay}
a = 3
b = 5
print("a vaut", a, "et b vaut", b) # print a ici 4 arguments
print(f"a vaut {a} et b vaut {b}") # print a ici 1 seul argument (un string formaté)
```
Il est aussi possible dâutiliser ce quâon appelle un **f-string** (pour string formatĂ©) afin dâintĂ©grer directement des variables Ă une chaĂźne de caractĂšres.
Un string formatĂ© a toujours la forme suivante : `f"...{var1}...{var2}..."` oĂč `var1`, `var2`, etc sont des variables dont lâon veut afficher la valeur.
Ainsi les 2 `print` de l'exemple prĂ©cĂ©dent affichent la mĂȘme chose.
````{admonition} Exercice 7
:class: note
Ecrivez un programme qui calcule 3.5 Ă la puissance 5 et qui affiche le rĂ©sultat Ă lâaide dâune phrase commençant par "3.5 Ă la puissance 5 vaut ...".
```{codeplay}
:file: ex_7.py
resultat = ...
print(...)
```
````
`````{admonition} Solution
````{dropdown} Cliquer ici pour voir la réponse
:animate: fade-in-slide-down
```{codeplay}
:file: ex_7.py
resultat = pow(3.5, 5)
# On pourrait aussi écrire: resultat = 3.5 ** 5
print(f"3.5 Ă la puissance 5 vaut {resultat}")
```
````
`````
Python contient un grand nombre de fonctions, et la plupart dâentre elles sont organisĂ©es au sein de **modules**, qui ne sont rien dâautre que des **collections de fonctions**.
Par exemple, le module `math` contient beaucoup de fonctions mathĂ©matiques đ€, comme la fonction `sqrt` qui calcule la racine carrĂ©e (square root en anglais) dâun nombre.
Pour utiliser ces fonctions, il faut dâabord **importer le module** grĂące Ă l'instruction `import`.
```{codeplay}
import math
a = math.sqrt(9) # calcule la racine carree
```
La premiĂšre ligne de lâexemple ci-dessus indique que lâon va utiliser les fonctions du module `math`.
La seconde ligne utilise la fonction `sqrt` pour calculer la racine carrée de 9.
La description des fonctions du module `math` est disponible ici.
````{admonition} Exercice 8
:class: note
Trouvez dans le lien ci-dessus la fonction permettant de calculer le sinus dâun nombre.
Ecrivez un programme calculant le sinus de 1 radian et affichant le rĂ©sultat Ă lâĂ©cran.
```{codeplay}
:file: ex_8.py
import math
...
```
````
`````{admonition} Solution
````{dropdown} Cliquer ici pour voir la réponse
:animate: fade-in-slide-down
```{codeplay}
:file: ex_8.py
import math
a = math.sin(1) # la fonction sin attend des angles en radians
print(a)
```
Le [radian](https://fr.wikipedia.org/wiki/Radian) est l'unité d'angle du SystÚme International.
PI radians équivaut à 180 degrés.
````
`````
## Les fonctions d'entrée (input)
Une des fonctions les plus utiles est la fonction `input(phrase)` qui affiche `phrase` dans le terminal et **retourne la chaĂźne de caractĂšres que lâutilisateur ou lâutilisatrice Ă©crit dans le terminal**.
Cela lui permet de donner des informations au programme, et le rĂ©sultat du programme pourra ainsi dĂ©pendre des indications de la personne qui lâutilise đ
```{codeplay}
nom = input("Entrez votre nom: ")
print(f"Bonjour {nom}")
```
Dans cet exemple, le programme va **demander** Ă la personne utilisatrice dâĂ©crire son nom dans le terminal, puis assignera la chaĂźne de caractĂšre entrĂ©e Ă la variable `nom`.
Il affiche ensuite "Bonjour" suivi du nom donné par la personne utilisatrice.
````{admonition} Exercice 9
:class: note
Ecrivez un programme demandant dâabord le nom, puis le prĂ©nom de lâutilisateur ou lâutilisatrice et qui la salue ensuite avec son prĂ©nom et son nom.
```{codeplay}
:file: ex_9.py
nom = ...
prenom = ...
print(...)
```
````
`````{admonition} Solution
````{dropdown} Cliquer ici pour voir la réponse
:animate: fade-in-slide-down
```{codeplay}
:file: ex_9.py
nom = input("Entrez votre nom: ")
prenom = input("Entrez votre prénom: ")
print(f"Bonjour {prenom} {nom} !")
```
````
`````
Si lâon souhaite que lâutilisateur rentre un nombre, il faudra **convertir** la chaĂźne de caractĂšre rentrĂ©e soit en un nombre entier avec la fonction `int`, soit en nombre Ă virgule avec la fonction `float`.
```{codeplay}
annee = int(input("Entrez votre annee de naissance: "))
age = 2022 - annee
print(f"Vous avez {age} ans cette annee !")
```
Si lâon nâappelle pas la fonction `int` dans la premiĂšre ligne, `annee` sera une chaĂźne de caractĂšre et la seconde ligne retournera une erreur car **Python ne sait pas comment soustraire une chaĂźne de caractĂšre Ă un nombre** đ” (faites le test !).
````{admonition} Exercice 10
:class: note
Ecrivez un programme qui demande dâentrer un nombre et affiche le carrĂ© de ce nombre dans le terminal.
```{codeplay}
:file: ex_10.py
nombre = ...
...
print(...)
```
````
`````{admonition} Solution
````{dropdown} Cliquer ici pour voir la réponse
:animate: fade-in-slide-down
```{codeplay}
:file: ex_10.py
n = float(input("Entrez un nombre: "))
resultat = n ** 2
print(f"Le carré de {n} est {resultat}")
```
Faire la conversion du texte en nombre avec la fonction `float` permet de gĂ©rer le cas oĂč l'utilisateur entrerait un nombre Ă virgule.
````
`````
````{admonition} Exercice 11
:class: note
Complétez et exécutez le programme suivant:
```{codeplay}
:file: ex_11.py
r = float(input('Entrez le rayon du cercle: '))
pi = 3.14
diametre = ...
circonference = ...
surface = ...
print() # Affiche une ligne vide
print(f'rayon = {r}')
print(f'diametre = {diametre}')
print(f'circonference = {circonference}')
print(f'surface = {surface}')
```
(Rappel : La circonfĂ©rence dâun cercle est Ă©gale Ă pi fois son diamĂštre.
La surface dâun cercle est Ă©gale Ă pi fois son rayon au carrĂ©.)
````
`````{admonition} Solution
````{dropdown} Cliquer ici pour voir la réponse
:animate: fade-in-slide-down
```{codeplay}
:file: ex_11.py
diametre = 2 * r
circonference = pi * diametre
surface = pi * r**2
```
````
`````
## Exercices Turtle đą (facultatif)
````{admonition} Exercice - Une maison sur demande
:class: note
Reprenez lâexercice Turtle du chapitre prĂ©cĂ©dent mais permettez Ă lâutilisateur ou utilisatrice de choisir la taille de la maison grĂące Ă la fonction prĂ©dĂ©finie `input`.
```{codeplay}
:file: maison_input.py
import turtle # Importe le module
# On demande Ă l'utilisateur la taille de la maison
d = ...
# Copiez ici le code permettant de dessiner une maison
...
turtle.done() # Termine le dessin
```
````
`````{admonition} Solution
````{dropdown} Cliquer ici pour voir la réponse
:animate: fade-in-slide-down
```{codeplay}
:file: maison_input.py
import turtle # Importe le module
d = int(input("Entrez la taille de la maison: ")) # On demande Ă l'utilisateur la taille de la maison
# On dessine le carré
turtle.forward(d) # Avance de 100 pixels
turtle.left(90) # Tourne a gauche de 90 degres
turtle.forward(d)
turtle.left(90)
turtle.forward(d)
turtle.left(90)
turtle.forward(d)
turtle.left(90)
# On se déplace au sommet du carré
turtle.left(90)
turtle.forward(d)
turtle.right(90)
# On dessine le triangle
turtle.forward(d) # Avance de 100 pixels
turtle.left(120) # Tourne a gauche de 120 degres (180-60)
turtle.forward(d)
turtle.left(120)
turtle.forward(d)
turtle.left(120)
turtle.done() # Termine le dessin
```
````
`````