0047 python中類的定義與用法

2021-07-11 19:50:06 字數 3617 閱讀 4937

背景介紹:

對混合型記錄資料如:[james lee,2002-3-14,2-34,3:21,2.34,2.45,3.01,2:01,2:01,3:10,2-22,2-01,2.01,2:16]進行資料分解,第一部分字母為姓名,第二部分為出生時間,第三部分為800m長跑的時間記錄,但是對於計時部分,資料不一致,用了「-」和「.」和「:」三種符號來分割分鐘和秒,因此需要做以下工作:

1,資料分解,將同型別資料歸類

2,統一時間資料的格式為 分.秒 記錄方式

3,去除重複的時間記錄,並返回最快的前三個時間

資料:james2.txt=[james lee,2002-3-14,2-34,3:21,2.34,2.45,3.01,2:01,2:01,3:10,2-22,2-01,2.01,2:16]

julie2.txt=[julie jones,2002-8-17,2.59,2.11,2:11,2:23,3-10,2-23,3:10,3.21,3-21,3.01,3.02,2:59]

mikey2.txt=[mikey mcmanus,2002-2-24,2:22,3.01,3:01,3.02,3:02,3.02,3:22,2.49,2:38,2:40,2.22,2-31]

sarah2.txt=[sarah sweeney,2002-6-17,2:58,2.58,2:39,2-25,2-55,2:54,2.18,2:55,2:55,2:22,2-21,2.22]

**:

'''定義乙個函式sanitize(),將原始資料的分號和冒號都換成點號,實現資料的一致性'''

def sanitize(time_string):

if '-' in time_string:

splitter = '-'

elif ':' in time_string:

splitter = ':'

else:

return(time_string)

(mins,secs) = time_string.split(splitter)

return(mins+'.'+secs)

'''定義乙個類athlete,實現資料初始化和排序取前三'''

class athlete:

def __init__(self,a_name,a_dob=none,a_times=):

self.name = a_name

self.dob = a_dob

self.times = a_times

def top3(self):

return(sorted(set([sanitize(t) for t in self.times]))[0:3])

def get_coach_data(filename):

try:

with open(filename) as f:

data = f.readline()

tmp = data.strip().split(',')

return(athlete(tmp.pop(0),tmp.pop(0),tmp))

except ioerror as err:

print('file error:'+str(err))

return(none)

james=get_coach_data('james2.txt')

julie = get_coach_data('julie2.txt')

mikey = get_coach_data('mikey2.txt')

sarah = get_coach_data('sarah2.txt')

'''列印名字和最快的三個時間'''

print(james.name + "'s fastest times are: "+ str(james.top3()))

print(julie.name + "'s fastest times are: "+ str(julie.top3()))

print(mikey.name + "'s fastest times are: "+ str(mikey.top3()))

print(sarah.name + "'s fastest times are: "+ str(sarah.top3()))

執行結果:

注意事項:

1,在定義類時,注意def行中的冒號,另外在初始化函式(在python中時沒有建構函式一說的)__init__()時,init的前後是兩條下劃線!

2,類中定義無傳入引數函式時也要帶上self引數,self引數非常重要。

3,tmp = data.strip().split(',')

屬於方法串鏈,從左向右進行;

sorted(set([sanitize(t) for t in self.times]))

屬於函式串鏈,從右向左進行。

4,print(james.name + "'s fastest times are: "+ str(james.top3())),中的str()將引數內容強制轉化成統一的字串以便輸出,不然會出現不能將列表轉化為字串的錯誤,因為前兩個都是字母組成的字串,而最後乙個時數字組成的資料,要統一成字串,因此加str()強制轉化。

5, return(athlete(tmp.pop(0),tmp.pop(0),tmp)) 中用pop(0)函式,第一次彈出最前面一項資料,彈出後就將其刪除,下一項資料自然成為第一項。

6,**中用到的函式解釋:

split():按某個符號將字串分解成幾部分,如按逗號將[gend,lee,is,666]分解成四部分:split(',',3);

strip():去掉每一行的空白符,一般不帶引數;

set():建立乙個集合,自動忽略重複的內容,但建立的元素無序排列(也就是集合的特性:唯一性,無序性);

sorted():對乙個字串進行排序(預設公升序,要降序則在sorted()引數中新增reverse=true),排序後的字串賦給另個副本,不覆蓋原始字串;

擴充套件:sort()進行原地排序,覆蓋原來字串內容;

取表中的前三項用:table[0:3],也就是table[0],table[1],table[2],不會包含3,python中的範圍取左閉右開區間,如range(4)=0,1,2,3不含4。

補充:類的繼承

如果利用繼承類list,則相應部分**為:

class athletelist(list):

def __init__(self,a_name,a_dob=none,a_times=):

list.__init__()

self.name = a_name

self.dob = a_dob

self.extend(a_times)

def top3(self):

return(sorted(set([sanitize(t) for t in self]))[0:3])

相應的get_coach_data()函式中的返回修改為:

return(athletelist(tmp.pop(0),tmp.pop(0),tmp))

Python中定義類方法

方法也分例項方法和類方法,與屬性類似 在class中定義的全部是例項方法,例項方法第乙個引數 self 是例項本身。在class中定義類方法,需要這麼寫 class person object count 0 classmethod def how many cls return cls.count...

Python中如何定義類?

類 class 和物件 object,也被稱為示例,instance 類是某一批物件的抽象,可以把類理解成某種概念 物件才是乙個具體的東西 定義類的語法 class類名 執行語句 零個到多個類變數 零個到多個方法 例項方法 類體中的執行語句,會在定義類時自動執行 如果類體中沒有任何 就是定義乙個空類...

Python中對類的定定義

python中對類進行定義的時候,具有兩種定義的方法 新式類定義法和經典類定義法 區別在於類裡邊是否加object父類 新式類 定義類 classcar 方法 def getcarinfo self print 車輪子個數 d,顏色 s self.wheelnum,self.color def mo...