Avez-vous trouvé la ligne de code redondante dans la leçon précédente ? Juste au cas où, c'était la ligne 22. Nous demandions à Python de simplifier deux entiers avant de retourner un nouvel objet Fraction. Cependant, en appelant Fraction(), nous demandions automatiquement à Python de simplifier les paramètres [ligne 10]. Nous voulons garder la ligne 10, puisqu'elle donne le résultat requis pour notre test en ligne 43 ; donc nous pouvons éliminer l'appel à simplifier() en line 22.
Maintenant, nous sommes prêts à ajouter une méthode de division. Pour diviser deux fractions, nous multiplions la première fraction par l'inverse multiplicatif de la seconde. Quelque chose comme ceci :
1 3 1 4 4 2
- / - = - * - = - = -
2 4 2 3 6 3
L'inverse multiplicatif d'une fraction est obtenu en interchangeant le numérateur avec le dénominateur ("basculant" la fraction sens dessus dessous). Voyons comment faire cela avec Python.
Pour que Python comprenne qu'utiliser le symbole "/" entre deux fractions signifie que nous voulons diviser ces deux fractions, nous faisons la définition appropriée de la fonction __div__(). Voici les parties correspondantes de notre nouveau code :
8 class Fraction(object):
9 def __init__(self, numerateur, denominateur=1):
10 num, denom = self.simplifier(numerateur, denominateur)
11 self.num = num
12 self.denom = denom
24 def __div__(self, autre):
25 num = self.num * autre.denom
26 denom = self.denom * autre.num
27 return Fraction(num, denom)
38 if __name__ == "__main__":
39 a = Fraction(1, 2)
40 b = Fraction(3, 1)
41 assert str(a) == "(1/2)"
42 assert str(b) == "(3)"
43 assert str(a*b) == "(3/2)"
44 c = Fraction(1, 3)
45 assert str(b*c) == "(1)"
46 d = Fraction(5, 10)
47 assert str(d) == "(1/2)"
48 print a/b
49 print a/a
Le résultat est
(1/6)
(1)
comme désiré. Tout ce qu'il nous reste à faire est de convertir les instructions print [lignes 48 et 49] en instructions assert et nous serons prêts à continuer.
Ce que nous voulons faire ensuite est d'additionner et soustraire des fractions. Nous commencerons avec l'addition. Cependant, cette fois nous procéderons différemment : nous commencerons d'abord par utiliser assert pour exprimer les résultats auxquels nous nous attendrions si Python savait comment additionner deux fractions. Bien sûr, cela échouera en levant une exception. Nous reviendrons alors en arrière, écrirons le code nécessaire pour que les tests fonctionnent.
Cette approche est connue sous le nom de Développement guidé par les tests (Test driven development). C'est une manière moderne utilisée en programmation qui est de plus en plus populaire car elle aide vraiment à empêcher l'apparition de bugs.
38 if __name__ == "__main__":
39 a = Fraction(1, 2)
40 b = Fraction(3, 1)
41 assert str(a) == "(1/2)"
42 assert str(b) == "(3)"
43 assert str(a*b) == "(3/2)"
44 c = Fraction(1, 3)
45 assert str(b*c) == "(1)"
46 d = Fraction(5, 10)
47 assert str(d) == "(1/2)"
48 assert str(a/b) == "(1/6)"
49 assert str(a/a) == "(1)"
50 assert str(a+a) == "(1)"
51 assert str(b+b) == "(6)"
52 assert str(a+b) == "(7/2)"
53 assert str(c+c) == "(2/3)"
Et voici l'ajout nécessaire à la classe Fraction :
29 def __add__(self, other):
30 denom = self.denom * other.denom
31 num = self.num*other.denom + self.denom*other.num
32 return Fraction(num, denom)
Essayez !
Vous devriez maintenant être capable de faire faire à Python la soustraction de deux fractions. Utilisez __sub__(), et vérifiez vos résultats!
Avant de passer à la leçon suivante, essayez ce qui suit :
un = Fraction(1)
print un + 1