2010-09-26 7 views
2

Niveau: Débutantbases de la programmation orientée objet (python)

Dans le code suivant ma fonction « Samepoint » retourne Faux où je me attends vrai. Des indices?

import math 

class cPoint: 
    def __init__(self,x,y): 
     self.x = x 
     self.y = y 
     self.radius = math.sqrt(self.x*self.x + self.y*self.y) 
     self.angle = math.atan2(self.y,self.x) 
    def cartesian(self): 
     return (self.x, self.y) 
    def polar(self): 
     return (self.radius, self.angle) 

class pPoint: 
    def __init__(self,r,a): 
     self.radius = r 
     self.angle = a 
     self.x = r * math.cos(a) 
     self.y = r * math.sin(a) 
    def cartesian(self): 
     return (self.x, self.y) 
    def polar(self): 
     return (self.radius, self.angle) 

def samePoint(p, q): 
    return (p.cartesian == q.cartesian) 

>>> p = cPoint(1.0000000000000002, 2.0) 
>>> q = pPoint(2.23606797749979, 1.1071487177940904) 
>>> p.cartesian() 
(1.0000000000000002, 2.0) 
>>> q.cartesian() 
(1.0000000000000002, 2.0) 
>>> samePoint(p, q) 
False 
>>> 

source: MIT OpenCourseWare http://ocw.mit.edu Introduction à l'informatique et à l'automne de programmation 2008

Répondre

7

regardant votre code

def samePoint(p, q): 
    return (p.cartesian == q.cartesian) 

p.cartesian, q.cartesian sont des fonctions et que l'on compare la fonction plutôt que résultat de la fonction. Depuis les comparant deux fonctions distinctes, le résultat est faux

Qu'est-ce que vous auriez dû le codage est

def samePoint(p, q): 
    return (p.cartesian() == q.cartesian()) 
+0

Bonjour pyfunc, merci pour votre aide! il semble que j'ai fait une erreur simple mais cela m'aidera à obtenir les bases correctes. Très appréciée! – raoulbia

4

Vous n'êtes pas appeler les méthodes sur le contrôle égal. Donc vous comparez les méthodes à chacun.

Essayez:

return (p.cartesian() == q.cartesian()) 
+0

grâce CandyMan! – raoulbia

1

Une fois que vous obtenez la fonction d'appel fixe chose, vous aurez des questions à virgule flottante.

essayer,

def is_same_point(p1, p2, e): 
    for c1, c2 in zip(c1, c2): 
     if abs(c1 - c2) > e: 
      return False 
    return True 

Je suis vraiment surpris que cela fonctionne pour vous avec l'échantillon de code affiché. Vous devez l'avoir construit pour le faire. En général, vous ne pouvez pas comparer directement les valeurs à virgule flottante pour l'égalité.

Une plus pythonique façon d'écrire la fonction ci-dessus est

def is_same_point(point1, point2, e): 
    return not any(abs(c1 - c2) > e for c1, c2 in zip(point1, point2)) 

vous avez encore à passer le e (pour epsilon) autour de bien et va se faire vieux rapidement.

def make_point_tester(e): 
    def is_same_point(point1, point2): 
     return not any(abs(c1 - c2) > e for c1, c2 in zip(point1, point2)) 
    return is_same_point 

is_same_point = make_point_tester(.001) 

Vous lancez allready en fonctions étant objets de première classe, de sorte que vous ne devriez pas avoir de problème avec ce code;)

+0

Il a dû travailler pour lui jusqu'à présent car il n'avait pas le cas de la même valeur FP atteinte par des chemins différents (c'est-à-dire comparant 5.1 à 3.0 + 2.1) –

Questions connexes