• 6 heures
  • Facile

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 08/11/2019

Ajoutez un habitant !

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Nous avons la grille, les zones, les positions et les agents ! Youhouhou !! Mais pour l'instant les habitants sont hors des zones, un peu comme s'ils lévitaient... Faisons-les redescendre sur terre en les plaçant sur la grille !

Trouver la zone d'habitation

Nous allons commencer par créer une méthode qui trouve dans quelle zone "habite" l'agent. Puis nous mettrons à jour la zone pour calculer la population !

C'est parti !

Premièrement, trouvons les zones dans lesquelles habitent chacun de nos agents. Étant donné que nous allons parcourir les zones, nous créons une méthode de classe :

class Zone:
    ...
    
    @classmethod
    def find_zone_that_contains(cls):

La première solution serait de parcourir toutes les zones et de comparer la position des coins à la position de la zone.

La seconde solution est de trouver l'index de la zone à partir de l'index de la position. 

class Zone: 
    ...
    
    def contains(self, position):
        return position.longitude >= min(self.corner1.longitude, self.corner2.longitude) and \
            position.longitude < max(self.corner1.longitude, self.corner2.longitude) and \
            position.latitude >= min(self.corner1.latitude, self.corner2.latitude) and \
            position.latitude < max(self.corner1.latitude, self.corner2.latitude)
            
    @classmethod
    def find_zone_that_contains(cls, position):
        # Compute the index in the ZONES array that contains the given position
        longitude_index = int((position.longitude_degrees - cls.MIN_LONGITUDE_DEGREES)/ cls.WIDTH_DEGREES)
        latitude_index = int((position.latitude_degrees - cls.MIN_LATITUDE_DEGREES)/ cls.HEIGHT_DEGREES)
        longitude_bins = int((cls.MAX_LONGITUDE_DEGREES - cls.MIN_LONGITUDE_DEGREES) / cls.WIDTH_DEGREES) # 180-(-180) / 1
        zone_index = latitude_index * longitude_bins + longitude_index

        # Just checking that the index is correct
        zone = cls.ZONES[zone_index]
        assert zone.contains(position)

        return zone

Puis nous allons modifier la fonction  main()  pour lancer cette méthode.

def main():
    Zone.initialize_zones()
    for agent_attributes in json.load(open("agents-100k.json")):
        ...
        zone = Zone.find_zone_that_contains(position)

Ajoutez un habitant !

Commençons par ajouter une méthode d'instance  add_inhabitant(agent)  :

def main():
    for agent_attributes in json.load(open("agents-100k.json")):
        ...
        zone.add_inhabitant(agent)

Puis créons la méthode associée dans la classe. Cette méthode va ajouter l'agent à une liste. Il nous faut donc également mettre à jour la méthode __init__() pour que les habitants par défaut ne soient pas 0 mais une liste vide :

class Zone:
    ...
    def __init__(self, corner1, corner2):
        self.corner1 = corner1
        self.corner2 = corner2
        self.inhabitants = []
    
    def add_inhabitant(self):
        pass

Comment ajouter un élément à une liste ? En utilisant la méthode append() !

class Zone
    ...
    def add_inhabitant(self, inhabitant):
        self.inhabitants.append(inhabitant)

Dernière ligne droite à présent ! Nous souhaitons connaître la population d'une zone, c'est-à-dire le nombre total d'habitants, que nous diviserons par le nombre de kilomètres carrés afin d'obtenir la densité de population. Nous allons donc créer une nouvelle méthode qui renvoie le nombre total d'éléments dans la liste de population.

class Zone
    ...
    def population(self):
        return len(self.inhabitants)

Étant donné que cette méthode existe uniquement pour me donner une information, et non vraiment pour effectuer une action, je vais la transformer en propriété :

class Zone
    ...
    @property
    def population(self):
        return len(self.inhabitants)

Testons ! J'ajoute  print(zone.population)  dans la fonction  main() ‌ pour vérifier que les habitants sont bien ajoutés.

def main():
    Zone.initialize_zones()
    for agent_attributes in json.load(open("agents-100k.json")):
        latitude = agent_attributes.pop("latitude")
        longitude = agent_attributes.pop("longitude")
        position = Position(longitude, latitude)
        agent = Agent(position, **agent_attributes)
        zone = Zone.find_zone_that_contains(position)
        zone.add_inhabitant(agent)
        print("Zone population: ", zone.population)

Et ça maaaaaaaarche ! \o/

 

Code du chapitre‌

Le code complet du chapitre est disponible ici : https://github.com/OpenClassrooms-Student-Center/la_poo_avec_python/blob/05_add_inhabitants/model.py

 

Exemple de certificat de réussite
Exemple de certificat de réussite