级别:初学者
在下面的代码中,我的'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
>>> 来源:麻省理工学院OpenCourseWare http://ocw.mit.edu计算机科学与编程入门2008秋季
发布于 2010-09-26 17:36:40
查看您的代码
def samePoint(p, q):
return (p.cartesian == q.cartesian)p.cartesian、q.cartesian是函数,您比较的是函数而不是函数结果。由于比较了两个不同的函数,因此结果为假
您应该编写的代码是
def samePoint(p, q):
return (p.cartesian() == q.cartesian())发布于 2010-09-26 17:35:53
您没有调用相等检查的方法。所以你是在比较每种方法的优劣。
尝试:
return (p.cartesian() == q.cartesian())发布于 2010-09-26 17:39:18
在你修复了函数调用之后,你就会遇到浮点问题。
试一下,
def is_same_point(p1, p2, e):
for c1, c2 in zip(c1, c2):
if abs(c1 - c2) > e:
return False
return True我真的很惊讶,用你发布的代码样本,它能为你工作。您必须构造它才能这样做。一般来说,你不能直接比较浮点值是否相等。
编写上述函数的一种更具pythonic风格的方法是
def is_same_point(point1, point2, e):
return not any(abs(c1 - c2) > e for c1, c2 in zip(point1, point2))不过,您仍然需要传递e (用于epsilon),这很快就会过时。
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)您已经遇到了作为第一类对象的函数,因此使用此代码应该不会有任何问题。)
https://stackoverflow.com/questions/3797219
复制相似问题