面向对象编程基础(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年秋季
3 个回答
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)
你已经遇到过函数是第一类对象的情况,所以你应该不会对这段代码感到困惑;)
3
你没有在进行相等检查时调用这些方法。所以你实际上是在比较这些方法本身,而不是它们的结果。
试试这个:
return (p.cartesian() == q.cartesian())
6
看看你的代码
def samePoint(p, q):
return (p.cartesian == q.cartesian)
p.cartesian 和 q.cartesian 是函数,你在比较的是函数本身,而不是函数的结果。因为你比较的是两个不同的函数,所以结果是 False(假)。
你应该写的是
def samePoint(p, q):
return (p.cartesian() == q.cartesian())