Accueil

Corrigé Sujet N°4

- Croissance des Plantes -









Vous pouvez téléchargez les éléments suivants en cliquant sur les boutons associés :
Dossier (ZIP) Sujet (PDF) Fichier Python Initial
Plantes (Python) Mesures (Python)
Corrigé V1 (PDF) Corrigé V2 (PDF) Fichier Python Corrigé V1

Question 1

Écrire une fonction croissance_moyenne(plantes) qui prend en paramètre une liste d’instances de la classe Plante et renvoie la moyenne des durées de croissance de l’ensemble de ces plantes (en jours). Si la liste fournie est vide, la fonction doit renvoyer None.
Écrire au moins deux tests pour valider le bon fonctionnement de cette fonction, dont une traitant le cas d’une liste vide.

def croissance_moyenne(plantes):
    if plantes == []:
        return None
    s = 0
    n = 0
    for plante in plantes:
        s += plante.croissance
        n += 1
    return s/n
                

Pour les tests possibles :


def test_croissance_moyenne():
    assert croissance_moyenne(plantes) == 79.0, "Echec Test 1, données plantes"
    assert croissance_moyenne([]) == None, "Echec Test 2, liste vide"
                

Question 2

Écrire une fonction dictionnaire_mesure(plantes, mesures) qui prend en paramètre la liste des plantes et la liste des mesures. Elle doit renvoyer un dictionnaire où chaque clé est le nom d’une plante (présente dans la liste plantes), et chaque valeur associée est la liste des mesures concernant cette plante spécifique.
Si une plante de la liste ne possède aucune mesure associée, la liste correspondante dans le dictionnaire devra être vide. Concevoir une série de tests pertinente pour vérifier le bon comportement de cette fonction.
Exemple de retour :
{
    "plante1": [
        {
            "plante": "plante1",
            "jour": 1,
            "hauteur": 100,
            "temperature": 20,
            "humidite": 100,
        },
        {
            "plante": "plante1",
            "jour": 2,
            "hauteur": 101,
            "temperature": 20,
            "humidite": 100,
        },
    ],
    "plante2": [
        {
            "plante": "plante2",
            "jour": 1,
            "hauteur": 10,
            "temperature": 20,
            "humidite": 20,
        }
    ],
}
            

def dictionnaire_mesure(plantes, mesures):
    dico = {}
    for plante in plantes:
        dico[plante.nom] = []
        
    for mesure in mesures:
        if mesure['plante'] in dico:
            dico[mesure['plante']].append(mesure)
        else:
            dico[mesure['plante']] = []
    return dico
                

Afin de réaliser un test pertinent pour cette fonction, on utilisera un jeu de donné modifié et biaisé (d'autres tests sont tout de même valables), à savoir :

def test_dictionnaire_mesure():
    from plantes import Plante
    plantes_liste = [
        Plante("Basilic", "Ocimum basilicum", 60, 40, "plein soleil"),
        Plante("Tomate", "Solanum lycopersicum", 80, 100, "plein soleil"),
        Plante("Iris", "Iris", 80, 50, "plein soleil")
    ]
    mesures = [
        {'jour': 1, 'plante': 'Basilic', 'hauteur': 0.85, 'temperature': 29.3, 'humidite': 50.89},
        {'jour': 1, 'plante': 'Tomate', 'hauteur': 1.27, 'temperature': 21.51, 'humidite': 47.19}
    ]
    assert dictionnaire_mesure(plantes_liste, mesures) == {"Basilic": [{"plante": "Basilic","jour": 1,"hauteur": 0.85,"temperature": 29.3,"humidite": 50.89,}],"Tomate": [{"plante": "Tomate","jour": 1,"hauteur": 1.27,"temperature": 21.51,"humidite": 47.19,}],"Iris": []}
                

Question 3

Exécuter le test de la fonction test_purger et analyser son code pour identifier la source de cette erreur logique.
On exécute dans la console :


test_purger()
>>  Résultat après la purge :
    Jour 2 : 19.0°C
    Jour 3 : 22.0°C
    Jour 5 : 29.0°C
                

On remarque que l'erreur provient du .remove() qui est utilisé afin de supprimer une mesure. Le seul problème est que celui-ci modifie la liste et donc, son indexation, ce qui fait que les indices suivants ne correspondent plus à la même mesure. Le résultat est donc faussé.

Question 4

Proposer une version corrigée de la fonction répondant parfaitement à l’objectif.

# Fonction corrigée :
def purger_mesures_extremes(liste_mesures):
    """
    Supprime de la liste toutes les mesures dont la température 
    n'est pas comprise entre 20 et 25°C inclus.
    """
    copie = liste_mesures.copy()
    for mesure in copie:
        if mesure['temperature'] < 20 or mesure['temperature'] > 25:
            liste_mesures.remove(mesure)
    return liste_mesures