练习:
1、编写一个学生类,提供 name、age、gender、phone、address、email等属性,为学生类提供带所有成员变量的构造器,为学生类提供方法,用于描绘吃、喝、玩、睡等行为。
1 class Student: 2 """描述学生的类"""
3 def __init__(self, name, age, gender, phone, address, email): 4 """构造器函数"""
5 self.name = name 6 self.age = age 7 self.gender = gender 8 self.phone = phone 9 self.address = address 10 self.email = email 11
12 def eat(self, food): 13 """吃"""
14 print("%s正在吃%s" % (self.name, food)) 15
16 def drink(self, drink): 17 """喝"""
18 print("%s正在喝%s" % (self.name, drink)) 19
20 def play(self, sport, other): 21 """玩"""
22 print("我今年%s岁,正在和%s玩%s" % (self.age, other, sport)) 23
24 def sleep(self): 25 """睡"""
26 print("%s正在%s睡觉" % (self.name, self.address)) 27
28 def __repr__(self): 29 return 'Student(name=%s, age=%s, phone=%s, address=%s, email=%s)' % \ 30 (self.name, self.age, self.phone, self.address, self.email) 31
32 if __name__ == '__main__': 33 stu = Student('Michael', 25, 201901, 10086, '成都', 'michael@163.com') 34 stu.eat('苹果') 35 stu.drink('饮料') 36 stu.play('蓝球', 'Stark') 37 stu.sleep() 38 print(stu) 39
40 程序运行结果如下: 41 Michael正在吃苹果 42 Michael正在喝饮料 43 我今年25岁,正在和Stark玩蓝球 44 Michael正在成都睡觉 45 Student(name=Michael, age=25, phone=10086, address=成都, email=michael@163.com)
2、 利用前面定义的 Student 类,定义一个列表保存多个 Student 对象作为通讯录数据。程序可通过 name、email、address 查询,如果找不到数据,则进行友好提示。
1 # 首先导入 Student 类,student 是文件名
2 from student import Student 3
4 # 定义一个列表保存多个 Student 对象
5 concacts = [Student('michael', 25, 201901, 10086, '成都', 'michael@163.com'), 6 Student('stark', 28, 201902, 10001, '重庆', 'stark@126.com'), 7 Student('tom', 31, 201903, 10087, '上海', 'tom@sina.com.cn'), 8 Student('jack', 27, 201904, 10081, '上海', 'jack@qq.com')] 9
10 # 查询 name
11 def find_by_name(name): 12 return [x for x in concacts if name in x.name] 13
14 def find_by_email(email): 15 return [x for x in concacts if email in x.email] 16
17 def find_by_address(address): 18 return [x for x in concacts if address in x.address] 19
20 if __name__ == '__main__': 21 t = input('请输入查找的方式,名字(n),Email(e),地址(a): ') 22 k = input('请输入查找的关键字:') 23 if t == 'n': 24 print(find_by_name(k)) 25 elif t == 'e': 26 print(find_by_email(k)) 27 elif t == 'a': 28 print(find_by_address(k)) 29 else: 30 print('输入有误!') 31
32 运行示例如下所示: 33 请输入查找的方式,名字(n),Email(e),地址(a): a 34 请输入查找的关键字:上海 35 [Student(name=tom, age=31, phone=10087, address=上海, email=tom@sina.com.cn), 36 Student(name=jack, age=27, phone=10081, address=上海, email=jack@qq.com)]
3、 定义代表二维坐标系上某个点的 Point 类(包括x、y两个属性),为该类提供一个方法用于计算两个Point 之间的距离,再提供一个方法用于判断三个Point 组成的三角形是钝角、锐角还是直角三角形。
class Point: def __init__(self, x, y): self.x = x self.y = y def distance(self, other): """计算两点之间的距离"""
return ((self.x - other.x) ** 2 + (self.y - other.y) ** 2) ** 0.5
def judge_triangle(self, p1, p2): '''判断3个点组成的三角形'''
# 首先计算3条边的距离
self_p1 = self.distance(p1) self_p2 = self.distance(p2) p1_p2 = p1.distance(p2) # 如果 self_p1 的距离最大
if self_p1 > self_p2 and self_p1 > p1_p2: if self_p1 > (self_p2 + p1_p2): print('不是三角形') else: print('钝角三角形') if self_p1 ** 2 > (self_p2 ** 2 + p1_p2 ** 2) \ else print('锐角三角形') if self_p1 ** 2 < (self_p2 ** 2 + p1_p2 ** 2) \ else print('直角三角形') # 如果 self_p2 的距离最大
if self_p2 > self_p1 and self_p2 > p1_p2: if self_p2 > (self_p1 + p1_p2): print('不是三角形') else: print('钝角三角形') if self_p2 ** 2 > (self_p1 ** 2 + p1_p2 ** 2) \ else print('锐角三形') if self_p2 ** 2 < (self_p1 ** 2 + p1_p2 ** 2) \ else print('直角三角形') # 如果 p1_p2 的距离最大
if p1_p2 > self_p1 and p1_p2 > self_p2: if p1_p2 > (self_p1 + self_p2): print('不是三角形') else: print('钝角三角形') if p1_p2 ** 2 > (self_p1 ** 2 + self_p2 ** 2) \ else print('锐角三角形') if p1_p2 ** 2 < (self_p1 ** 2 + self_p2 ** 2) \ else print('直角三角形') def __repr__(self): return 'Point(x=%s, y=%s)' % (self.x, self.y) if __name__ == '__main__': p1 = Point(1, 1) print(p1.distance(Point(2, 3))) p1.judge_triangle(Point(4, 5), Point(-8, 7)) 程序运行结果如下所示: 2.23606797749979 钝角三角形
4、 定义代表三维笛卡尔坐标系上某个点的 Points 类(包含x、y、z三个属性),为该类定义一个方法,可接收b、c、d 三个参数,用于计算当前点和b、c 组成的面与 b、c、d 组成的面之间的夹角。提示:cos(夹角)=(X·Y)/|X||Y|,其中 X=AB*BC,Y=BC*CD,X·Y 代表X与Y的点积,AB*BC 代表 AB 与 BC 的叉乘。
1 import math 2
3 class Points: 4 '''描述点的类'''
5 def __init__(self, x, y, z): 6 '''构造器'''
7 self.x = x 8 self.y = y 9 self.z = z 10
11 def __sub__(self, other): 12 '''为减法提供支持的方法'''
13 return Points((self.x - other.x), (self.y - other.y), (self.z - other.z)) 14
15 def dot(self, other): 16 """点积,相乘后积相加"""
17 return (self.x * other.x) + (self.y * other.y) + (self.z * other.z) 18
19 def cross(self, other): 20 """叉积"""
21 return Points((self.y*other.z-self.z*other.y), (self.z*other.x-self.x*other.z), (self.x*other.y-self.y*other.x)) 22
23 def absolute(self): 24 return pow((self.x ** 2 + self.y ** 2 + self.z ** 2), 0.5) 25
26 if __name__ == '__main__': 27 points = list() 28 print('依次输入4个点的 x y z(中间以空格分隔)') 29 for _ in range(4): 30 a = list(map(float, input().split())) 31 points.append(a) 32 a, b, c, d = Points(*points[0]), Points(*points[1]), Points(*points[2]), Points(*points[3]) 33 X = (b - a).cross(c - b) 34 Y = (c - b).cross(d - c) 35 angle = math.acos(X.dot(Y) / (X.absolute() * Y.absolute())) 36 print("%.2f" % math.degrees(angle)) 37
38 运行一次实例如下: 39 依次输入4个点的 x y z(中间以空格分隔) 40 2.8 9.5 -12.4
41 4.9 23.5 14.2
42 -60.8 -100 200
43 200 -300 -1000
44 12.92
5、 定义交通工具、汽车、火车、飞机类,注意这些类的继承关系,为这些类提供构造器。
1 class TrafficTools: 2 def __init__(self, name): 3 self.name = name 4
5 def move(self, distance): 6 print("我移动了%s千米" % distance) 7
8 class Car(TrafficTools): 9 def __init__(self, name, color): 10 super(Car, self).__init__(name) 11 self.color = color 12
13 def move(self, distance): 14 print("我是%s的%s车,在道路上移动了%s千米" % (self.color, self.name, distance)) 15
16 class Train(TrafficTools): 17 def __init__(self, name, color): 18 super(Train, self).__init__(name) 19 self.color = color 20
21 def move(self, distance): 22 print("我是%s的%s,在铁轨上移动了%s千米" % (self.color, self.name, distance)) 23
24 class Plain(TrafficTools): 25 def __init__(self, name, company): 26 super(Plain, self).__init__(name) 27 self.company = company 28
29 def move(self, distance): 30 print("我是%s的%s飞机,在天空中飞了%s千米" % (self.company, self.name, distance)) 31
32 if __name__ == '__main__': 33 c = Car('宝马', '红色') 34 c.move(100.33) 35
36 t = Train('火车', '绿皮') 37 t.move(50) 38
39 p = Plain('空客', '川航') 40 p.move(400) 41
42 运行结果如下所示: 43 我是红色的宝马车,在道路上移动了100.33千米 44 我是绿皮的火车,在铁轨上移动了50千米 45 我是川航的空客飞机,在天空中飞了400千米