开发者学堂课程【Python 入门 2020年版:练习1】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/639/detail/10410
练习1
内容介绍:
一、题目框架
二、具体做法
一、题目框架
定义一个点类 Pointer
属性是横向坐标 x 与纵向坐标 y
定义一个圆类 circle
属性有圆心点 cp 与半径 radius
class pointer(object) :
#继承自 object
def _init_(self,x,y):
#初始化有 XY 坐标
self.x =x
self.y = y
class Circle(object):
#Circle 类也继承自 object
def _init_(self,cp, radius) :
#Circle 类中的 cp 属性 = p , radius(半径) = 3,cp是一个对象,cp 中有 x,y属性
self.cp = cp
self.radius = radius
p = Pointer(0, 0)
#定义一个圆心点坐标,创建了一个 Pointer 对象
c = circle(p,3)
#创建好的 Pointer 对象传递给了 Circle 对象 c
print(hex(id(p)),hex(id(c)))
#打印 IP 地址
在内存空间里面,创建了 Pointer 对象和 circle 对象,分别获取 p 和 c 的地址,p的属性为 x=0,y=0,circle 中调用创建方法就会把 p 传给 cp,c 中的 cp 指向 p内存空间,radius=3。
二、具体做法
方法有:
1.求圆的面积
2.求圆的周长
3.求指定点与圆的关系
提示∶关系有三种【圆内圆外圆上】
设计到的数学公式:指定点与圆心点之间的距离与圆的半径进行比较
import math
class Pointer(object):
#pointer继承自object
def _init__(self, x, y):
self.x =x
self.y = y
class Circle(object) :
#circle 也继承自 object
def _init__(self, cp, radius): #
#其中 cp = p , radius(半径) = 3
self.cp = cp
self.radius = radius
def get_area(self):
#定义圆的面积
return self.radius **2 *math. Pi
#圆的面积求法 radius(半径)的平方乘以 pi
d
ef get_length(self):
#定义圆的周长
return self.radius * 2* math.pi
#圆的周长求法 radius(半径)的乘以2再乘以 pi
p = Pointer(0,0)
c=circle(p, 3)
print(c.get_area())
print(c.get_length())
运行结果:
28.274333882308138
18.84955592153876
#面积和周长都可以被拿到。
def relationship(self, point):
#求一个点和圆的关系。有三种关系:在圆内,在圆外,在圆上。Point 是需要判断的点。
点和圆心的关系,看点离圆心的距离,点和圆心的距离大于半径,点在圆外边。
距离小于半径,在圆里边,点正好等于半径,在圆上。所以判断点和圆的关系就需要计算点到圆心的距离。根据点到圆心的距离来判断,大于半径等于半径或小于半径。
distance =
math
.sqrt((point.x - self.cp.x)** 2+ (point.y - self.cp.y)** 2 )
#点到圆心的距离求法为该点的X值减去圆心的X值的平方,加上该点的Y值减去圆心的Y值的平方开根号。计算圆心到point的距离,会存在精度丢失的问题。
if distance > self.radius** 2:
#点到圆心的距离大于半径。
print( "在圆外)
elif distance < self.radius** 2:
#点到圆心的距离小于半径。
print( '在圆内')
else:
#除了上面2种情况之外,就是等于的情况
print("在圆上')
p1 = Pointer ( 10,10)
c.relationship(p1)
#判断 P1点与圆心的关系。
p2 = Pointer(2,2)
c.relationship(p2)
#判断 P2点与圆心的关系。
p3 = Pointer(e,e)
c.relationship(p3)
#判断 P3点与圆心的关系。
运行结果:
在圆外
在圆内
在园外
但是这个代码也存在 bug, Distance 所求得的数字不是精确数字,它是无理数是无限不循环小数,代码中所算的值只能是无限接近于正确值。
为了更趋近于正确值,可以四舍五入求距离的小数点后6位。:distance = round(math.sqrt((point.x - self.cp.x)** 2+(point.y - self.cp.y)** 2), 6),这里为了更方便,所求得的值不开根号直接与距离的平方相比较。
不过不管怎么处理,都存在精度丢失的问题,是不可避免的,必要的时候可以4舍5入小数点后尽量多取几位小数相比较。