AiStudio領航團Python速成營第六日物件大作業
阿新 • • 發佈:2021-02-10
AiStudio領航團Python速成營第六日物件大作業
第一題(30分)
資料如下:
stu1.txt 孫同學,2020-5-21,20,'男',77,56,77,76,92,58,-91,84,69,-91 stu2.txt 趙同學,2020-11-3,24,'女',65,68,72,95,-81,71,86,91,57,91 stu3.txt 王同學,2021-8-7,25,'男',87,78,90,-76,88,47,100,65,69,100 stu4.txt 李同學,2021-8-10,29,'男',92,54,85,71,-91,68,77,68,95,95
以上四個txt文件在work路徑下可以找到。
定義Student類,包括name、dob、age、gender和score屬性,包括top3方法用來返回學生的最大的3個成績(可重複)、sanitize方法用來將負的分數變為正的分數,負的分數可能是輸入錯誤。宣告stu_list物件組數用於儲存所有的學生物件。最後輸出所有的學生資訊包括姓名、生日、年齡、性別、最高的3個分數。
第一題的輸出結果如下,供參考:
本題要點有多個:
定義類屬性;
成績排序;
資料預處理;
傳參;
以上難度都比較小,其中題目要求的“宣告stu_list物件組數用於儲存所有的學生物件”可以這樣做:
stu_list = [ Student(i[0],i[1],i[2],i[3],i[4:]) for i in list1] # 建立4個學生例項
並不是說只有stu1 = Student()才算建立例項
只要有了Student()就算有一個例項了,stu1只是指向它罷了
程式碼如下(示例):
# 請在此處完成程式碼
class Student():
def __init__(self,name,dob,age,gender,score):
self.name = name
self.dob = dob
self.age = age
self. gender = gender
self.score = score
def top3(self):
c = self.sanitize(self.score) # 去除'-'減號
c.sort(reverse = True) # 倒序排序
c = [int(i) for i in c] # 轉化為整式
if c.count(100): # 100分為特殊情況單獨考慮,有的話要多寫一步
return (c[-c.count(100):]+c[:-c.count(100)])[:3] # 將一百分的成績移到最前面
else:
return c[:3]
def sanitize(self,score):
return [i.replace('-','') for i in score] # 去除減號
# 讀取檔案資訊
list1 = []
for i in range(1,5): # 讀取第一到第四份檔案
with open('work/stu%s.txt'%i) as f:
list1.extend(f.readlines())
list1 = [i.split(',') for i in list1] # 將字串轉化為列表
# 建立例項
stu_list = [Student(i[0],i[1],i[2],i[3],i[4:]) for i in list1] # 建立4個學生例項
for i in stu_list:
print('姓名:',i.name,'生日:',i.dob,'年齡:',i.age,'性別:',i.gender,'分數',i.top3()) # 輸出資訊
第二題(30分)
資料格式如下:
stu5.txt 特長同學,2020-10-5,20,'男',180,87,98,77,76,92,58,-76,84,69,-47
stu6.txt 特長同學,2020-10-6,20,'女',230,76,48,82,88,92,58,-91,84,69,-68
以上兩個txt文件在work路徑下可以找到。
定義Spostudent、Artstudent為Student的子類,在子類的屬性裡面新增了spe為特長分數。Spostudent包括的top3方法返回的是最低的3個得分(可重複),Artstudent包括top3方法返回的是最高的3個得分(可重複),最後使用多型的方式輸出2個特長同學的姓名、生日、年齡、性別、分數、特長分。
第二題的輸出結果如下,供參考:
本題也比較簡單,多了一個需要定義的spe屬性,以及一個需要修改的top3方法,就這兩步就行
程式碼如下(示例):
# 請在此處完成程式碼
class Spostudent(Student):
def __init__(self,name,dob,age,gender,score,spe):
Student.__init__(self,name,dob,age,gender,score)
self.spe = spe
def top3(self):
c = self.sanitize(self.score) # 去除'-'減號
c.sort() # 正序排序
c = [int(i) for i in c]
if c.count(100): # 100分為特殊情況單獨考慮,有的話要多寫一步
return (c[c.count(100):]+c[:c.count(100)])[:3] # 將一百分的成績移到最後面
else:
return c[:3]
# 和父類只多了一個“藝術分”,就多一行程式碼就行
class Artstudent(Student):
def __init__(self,name,dob,age,gender,score,spe):
Student.__init__(self,name,dob,age,gender,score)
self.spe = spe
# 讀取第5第6份檔案
list1 = []
for i in range(5,7):
with open('work/stu%s.txt'%i) as f:
list1.extend(f.readlines())
list1 = [i.split(',') for i in list1]
# 建立例項
stu_list = []
for n,i in enumerate(list1):
if n==0:
stu_list.extend([Spostudent(i[0],i[1],i[2],i[3],i[5:],i[4])])
else:
stu_list.extend([Artstudent(i[0],i[1],i[2],i[3],i[5:],i[4])])
for i in stu_list:
print('姓名:',i.name,'生日:',i.dob,'年齡:',i.age,'性別:',i.gender,'分數',i.top3(),'特長分',i.spe)