Les exercices de cette page peuvent (doivent) être réservés à une
seconde lecture.
Les choix de structures ou de types pour représenter un concept peuvent
être importants en programmation. Y compris dans le cadre de programmes
très simples.
Dans cette page, nous illustrons un simple exercice d'écriture d'une
fonction calculant la distance entre deux points avec plusieurs
choix de représentation du point en Python.
- Le premier choix est le plus simple : on utilise quatre variables
indépendantes pour les deux abscisses et les deux ordonnées.
Ce choix a l'avantage de n'avoir pas à en apprendre plus sur le langage.
- Le second choix utilise le type
tuple
. Ce choix a
l'avantage d'une écriture proche de l'écriture mathématique.
- Le troisième choix est très proche du second. Il utilise le type
list
plutôt que le type tuple
.
Ce choix pourrait être privilégié par le fait qu'enseigner le type
list
est recommandé dès la classe de 1ère (dans le cadre
des programmes sur les statistiques ou sur les fonctions notamment).
- Le quatrième choix utilise le type dict (dictionnaire).
Ce choix est très proche des deux précédents, l'avantage
est ici de pouvoir nommer les attributs (ici
abscisse
et ordonnee
), ce qui permet d'écrire des formules
plus explicites, plus faciles à décrypter.
- Le choix suivant utilise les
namedtuple
.
Ce choix présente l'intérêt de pouvoir nommer les attributs
(abscisse, ordonnee)
mais également de pouvoir donner
un nom explicite au nouveau type utilisé (ici Point
).
- Le dernier choix s'appuie sur la méthode générique de création d'un
nouveau type. Ce dernier choix présente de nombreux avantages (mais
est plus long à maîtriser, c'est un outil pour l'enseignant et non pour
l'élève). On peut ici nommer les attributs, nommer le nouveau type
mais aussi définir des méthodes sur l'objet.
Distance entre deux points
Écrire une fonction Python nommée distance()
qui
respecte les spécifications suivantes :
Paramètres |
xA, yA, xB, yB quatre nombres |
Valeur renvoyée |
La distance entre le point A(xA, yA) et B(xB, yB) (coordonnées
cartésiennes dans un repère orthonormé). |
Distance entre deux points, bis
On veut à nouveau écrire le code d'une fonction distance()
entre deux points.
Mais on décide à présent de représenter un point par un couple de deux
nombres.
En Python, les couples sont naturellement représentés par le type
tuple
.
Par exemple (un repère orthonormé du plan étant fixé), le code
A = (2, 3)
représentera le point $A$ de coordonnées $(2 ; 3)$.
On accède à l'abscisse de $A$ par le code A[0]
et à son ordonnée par le code A[1]
.
Écrire une fonction Python nommée distance()
qui
respecte les spécifications suivantes :
Paramètres |
A, B deux points représentés comme indiqué ci-dessus. |
Valeur renvoyée |
La distance entre le point A(xA, yA) et B(xB, yB) (coordonnées
cartésiennes dans un repère orthonormé). |
Distance entre deux points, ter
On veut à nouveau écrire le code d'une fonction distance()
entre deux points.
Mais on décide à présent de représenter un point par une liste
de deux nombres.
Par exemple (un repère orthonormé du plan étant fixé), le code
A = [2, 3]
représentera le point $A$ de coordonnées $(2 ; 3)$.
On accède à l'abscisse de $A$ par le code A[0]
et à son ordonnée par le code A[1]
.
Écrire une fonction Python nommée distance()
qui
respecte les spécifications suivantes :
Paramètres |
A, B deux points représentés comme indiqué ci-dessus. |
Valeur renvoyée |
La distance entre le point A(xA, yA) et B(xB, yB) (coordonnées
cartésiennes dans un repère orthonormé). |
Distance entre deux points, quater
On veut à nouveau écrire le code d'une fonction distance()
entre deux points.
Mais on décide à présent de représenter un point par un dictionnaire.
Par exemple (un repère orthonormé du plan étant fixé), le code
A = {'abscisse' : 2, 'ordonnée' : 3}
représentera le point
$A$ de coordonnées $(2 ; 3)$.
On accède à l'abscisse de $A$ par le code A['abscisse']
et à son ordonnée par le code A['ordonnée']
.
Écrire une fonction Python nommée distance()
qui
respecte les spécifications suivantes :
Paramètres |
A, B deux points représentés comme indiqué ci-dessus. |
Valeur renvoyée |
La distance entre le point A(xA, yA) et B(xB, yB) (coordonnées
cartésiennes dans un repère orthonormé). |
Distance entre deux points, quinquies
Un autre choix :
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
A = Point(2, 3)
print(A)
print(A.x)
print(A.y)
On obtient :
Point(x=2, y=3)
2
3
Écrire une fonction Python nommée distance()
qui
respecte les spécifications suivantes :
Paramètres |
A, B deux points représentés comme indiqué ci-dessus. |
Valeur renvoyée |
La distance entre le point A(xA, yA) et B(xB, yB) (coordonnées
cartésiennes dans un repère orthonormé). |
from collections import namedtuple
##----- Définition de la nouvelle structure -----##
Point = namedtuple('Point', ['x', 'y'])
##----- Définition des fonctions -----##
def distance(A, B) :
return ( (B.x - A.x)**2 + (B.y - A.y)**2 )**0.5
##----- Tests et interaction -----##
M = Point(2, 3)
N = Point(3, 4)
print("Distance de M à N : ", distance(M, N) )
Distance entre deux points, sexies
De façon générique, on peut définir un nouveau type en déclarant
une classe.
Nous ne donnons ici pas plus de détails que l'exemple ci-dessous.
Bien étudier ce code avant de passer à la page suivante.
from math import sqrt
##----- Définition de la classe -----##
class Point :
def __init__(self, abscisse = 0, ordonnée = 0) :
self.x = abscisse
self.y = ordonnée
##----- Définition des fonctions -----##
def distance(A, B) :
return sqrt( (B.x- A.x)**2 + (B.y - A.y)**2 )
##----- Tests et interaction -----##
M = Point(2, 3)
N = Point(3, 4)
print("Distance de M à N : ", distance(M, N) )