1. 程式人生 > 其它 >AiStudio領航團Python速成營第六日物件大作業

AiStudio領航團Python速成營第六日物件大作業

技術標籤:python面向物件程式設計

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

  # 讀取第56份檔案
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)