2010-09-26 46 views
2

级别:初学者面向对象编程基础知识(python)

在下面的代码中,我的'samePoint'函数返回False,我期待True。任何提示?

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 
>>> 

来源:麻省理工学院开放式http://ocw.mit.edu计算机科学导论和程序2008年秋季

回答

7

看你的代码

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

p.cartesian,q.cartesian的功能,你是比较函数,而不是函数结果。由于比较两个不同的功能,结果是假

你应该已经被编码为

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

嗨pyfunc,谢谢你的帮助!它似乎我犯了一个简单的错误,但它会帮助我获得正确的基础知识。非常感激! – raoulbia 2010-09-26 13:48:20

4

你是不是呼吁平等的检查方法。所以你在比较每个方法的方法。

尝试:

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

感谢CandyMan! – raoulbia 2010-09-26 13:49:45

1

后你得到的函数调用的东西固定的,你就会有浮点的问题。

尝试,

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

我真的很惊讶,它的工作为你和你发布的代码示例。你一定是这样做的。一般来说,您不能直接比较浮点值是否相等。

更Python的方式来写上面的函数是

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

你还是得虽然通过e(对于小量)左右,并且是会得到老的快。

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) 

你媒体链接碰上功能是第一类对象,所以你不应该有这个代码的麻烦;)

+0

到目前为止,它一直为他工作,因为他没有通过不同路径达到相同FP值的情况(即比较5.1到3.0 + 2.1) – 2010-09-26 09:50:06