Activités - Les fonctions - partie n°2
2ème année maturité
Objectifs de ce deuxième cours
- Décomposer un problème en plusieurs petites fonctions qui coopèrent.
- Comprendre la portée des variables (locale / globale) et le bon réflexe : entrées par les paramètres, sortie par le
return. - Éviter le piège
None: distinguerprint(afficher) etreturn(retourner). - Appliquer les bonnes pratiques (fichier structuré, noms clairs) et retourner plusieurs valeurs.
Décomposer
Un gros problème → plusieurs petites fonctions qui font chacune une seule tâche et portent un nom clair (un verbe). Le programme principal ne fait qu'appeler ces fonctions, dans l'ordre.
Portée des variables
Une variable créée dans une fonction n'existe que là (elle est locale). Le bon réflexe : les données entrent par les paramètres et sortent par le return. On évite les variables globales.
Le piège None
print affiche à l'écran ; return retourne une valeur. Si une fonction ne fait qu'un print, alors x = ma_fonction() met None dans x. Pour réutiliser un résultat, il faut return.
Retourner plusieurs valeurs
Une fonction peut retourner plusieurs valeurs séparées par des virgules : return a, b. On les récupère d'un coup : x, y = ma_fonction().
Structure recommandée d'un fichier (bonne pratique) :
### Imports
from random import *
### Fonctions
# Retourne la moyenne d'une liste de notes
def moyenne(notes):
return sum(notes) / len(notes)
### Programme principal
notes = [4, 5, 6]
print("Moyenne :", moyenne(notes))
Coche une réponse par question, puis clique sur Vérifier mes réponses.
1. Décomposer un programme en petites fonctions, ça sert surtout à…
2. Une variable créée à l'intérieur d'une fonction (variable locale)…
3. Que vaut x après x = afficher_moyenne(notes) si afficher_moyenne fait seulement des print ?
4. Pour qu'une fonction transmette un résultat réutilisable au reste du programme, on utilise…
5. Dans un fichier bien structuré, le programme principal (les appels) se place…
6. Que fait return moy, mention ?
7. Quelle est la meilleure façon de nommer une fonction ?
8. Dans un programme bien décomposé, le rôle du programme principal est de…
Ouvre Thonny. Écris le programme, teste-le, puis compare avec le corrigé.
Pense à la structure : ### Fonctions d'abord, ### Programme principal ensuite.
Il y a plus d'exercices que nécessaire : va à ton rythme.
Définis la focntion perimetre(cote) qui retourne le périmètre d'un carré (4 * cote).
Puis définis la fonction prix_cloture(perim, prix_metre) qui retourne le prix d'une clôture. Dans le programme principal,
calcule le périmètre d'un terrain carré de 5 m, puis son prix de clôture à 12.50 fr/m.
### Fonctions
def perimetre(cote):
return 4 * cote
def prix_cloture(perim, prix_metre):
return perim * prix_metre
### Programme principal
p = perimetre(5)
print("Périmètre :", p, "m")
print("Prix :", prix_cloture(p, 12.50), "fr")
prix_cloture réutilise le résultat de perimetre : deux petites fonctions valent mieux qu'une grosse.Depuis l'exercice précédent, modifie ton programme pour n'avoir qu'une seule fonction qui retourne les deux résultats.
### Fonctions
def perimetre(cote, prix_metre):
perimetre = 4 * cote
return perimetre, perimetre * prix_metre
### Programme principal
p, pr = perimetre(5, 12.50)
print("Périmètre :", p, "m")
print("Prix :", pr, "fr")
nombre.C'est l'exercice central du cours : décompose la fabrication d'un mot de passe en petites fonctions qui s'appellent entre elles. Écris :
lettre_aleatoire()— retourne une lettre minuscule au hasard.chiffre_aleatoire()— retourne un chiffre (0 à 9) au hasard, sous forme de texte (attention au piège).caractere_aleatoire()— retourne au hasard soit une lettre, soit un chiffre : elle appelle les deux fonctions précédentes.mot_de_passe(longueur)— construit et retourne un mot de passe de la longueur demandée, en assemblant des caractères aléatoires dans une boucle.
Puis, dans le programme principal, affiche trois mots de passe de 10 caractères. Chaque fonction fait une seule chose !
Rappel : from random import *, puis choice(...) (choisit au hasard) et randint(a, b). Pour transformer un nombre en texte : str(nombre).
### Imports
from random import *
### Fonctions
def lettre_aleatoire():
lettres = "abcdefghijklmnopqrstuvwxyz"
return choice(lettres)
def chiffre_aleatoire():
return str(randint(0, 9))
def caractere_aleatoire():
# au hasard : soit une lettre, soit un chiffre
if randint(1, 2) == 1:
return lettre_aleatoire()
else:
return chiffre_aleatoire()
def mot_de_passe(longueur):
mdp = ""
for i in range(longueur):
mdp = mdp + caractere_aleatoire()
return mdp
### Programme principal
print("Trois mots de passe de 10 caractères :")
print(mot_de_passe(10))
print(mot_de_passe(10))
print(mot_de_passe(10))
mot_de_passe appelle caractere_aleatoire, qui appelle lettre_aleatoire ou chiffre_aleatoire. Chaque fonction est minuscule et fait une seule chose — assemblées, elles résolvent un problème complet.symbole_aleatoire() (par ex. choice("!@#$%*?")) et fais en sorte que caractere_aleatoire puisse aussi retourner un symbole.