Head First Python(定製資料物件)

2021-06-27 15:43:14 字數 4995 閱讀 6445

新的檔案格式

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

如果使用split()bif把資料抽取到乙個列表,第乙個資料項是名字,然後是出生日期,然後是計時資料。

sarah=get_coach_data('sarah2.txt')

(sarah_name,sarah_dob)=sarah.pop(0),sarah.pop(0)

print(sarah_name + "'s fastest times are: " +

str(sorted(set([sanitize(t) for t in sarah]))[0:3]))

"pop(0)"呼叫將刪除並返回列表的最前面的資料項。兩個呼叫會刪除前面兩個資料值,並把它們賦給指定的變數。

在上面的**中,表示sarah的3部分相關資料分別儲存在3個不同的變數中。如果選手增加,需要的變數成倍增加。

使用字典關聯資料

字典是乙個內建的資料結構,允許將資料(也成為「值」)與鍵而不是數字關聯。

name ----> "sarah sweeney"

dob ---->"2002-6-17"

times---->[2:58,2.58,2:39,2-25,2-55,2:54,2.18,2:55,2:55,2:22,2-21,2.22]

建立空字典,一種使用大括號,一種使用工廠函式建立:

>>>cleese={}

>>>palin=dict() #可以一次性同時建立字典

修改**如下:

sarah=get_coach_data('sarah2.txt')

sarah_data={}

sarah_data['name']=sarah.pop(0)

sarah_data['dob']=sarah.pop(0)

sarah_data['times']=sarah

print(sarah_data['name']+" 's fastest times are: "+

str(sorted(set([sanitize(t) for t in sarah_data['times']]))[0:3]))

**還可以改進的建議:

一次性完成字典的建立

把字典建立**移到get_coach_data()函式中,返回乙個字典而不是列表

把確定各個選手的3個最快時間的**移到get_coach_data()函式中。

調整主**中的函式呼叫,呼叫這個新版本的get_coach_data()函式來支援新的操作模式

def get_coach_data(filename):

try:

with open(filename) as f:

data=f.readline()

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

return() #確定前3個最快時間

except ioerror as ioerr:

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

return(none)

james=get_coach_data('james2.txt') #乙個選手呼叫函式,並根據需要呼叫"print()"語句。

print(james['name']+" 's fastest times are: "+james['times'])

將**及其資料打包在類中

這麼做的好處是:

使用類有助於降低複雜性

降低複雜性意味著bug更少

bug更少意味著**更可維護

定義乙個類

在物件導向的世界裡,你的**通常稱為類的方法(method),資料通常稱為類的屬性(attribute),例項化的資料物件稱為例項(instance)。

class athlete: #類定義從class關鍵字開始,選取乙個合適的描述性的名字

def __init__(self): #前後都有兩個下劃線,最後是冒號

#the code to initialize a "athlete" object. 初始化各個物件的**

每個方法的第乙個引數都是self

python要求每個方法的第乙個引數為呼叫物件例項。

class athlete:

def __init__(self,value=0):

self.thing=value

def how_big(self):

return(len(self.thing))

使用idle定義新類,建立一些物件例項

>>>class athlete:

def __init__(self,a_name.a_dob=none,a_times=): #注意後兩個引數的預設值

self.name=a_name

self.dob=a_dob

self.times=a_times

>>>sarah=athlete('sarah sweeney','2002-6-17',['2:58','2.58','1.56])

>>>james=athlete('james jones')

修改後的**

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()

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

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

except ioerror as ioerr:

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

return(none)

james=get_coach_data('james2.txt')

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

向類中增加兩個方法,add_time(),將乙個額外的計時值追加到選手的計時資料,add_times()用乙個或多個計時值擴充套件選手的計時資料。

def add_times(self,time_list):

self.times.extend(time_list)

繼承python內建的list

class允許通過繼承現有的其他類來建立乙個類,包括用list、set和dict提供的python內建資料結構類。

在idle中首先派生內建list類建立乙個定製列表,其有乙個名為name的屬性:

>>> class namelist(list):

def __init__(self,a_name):

list.__init__() #初始化派生類,然後把引數賦至屬性

self.name=a_name

>>> johnny=namelist("john paul jones")

>>> type(johnny) #"johnny"是乙個"namelist"

>>> dir(johnny) #"johnny"可以做的事情

>>> johnny.extend(['composer','arranger','musician'])

>>> johnny

['bass player', 'composer', 'arranger', 'musician']

>>> johnny.name

'john paul jones'

>>> for attr in johnny: #按列表處理"johnny"

print(johnny.name+" is a "+attr+".")

john paul jones is a bass player.

john paul jones is a composer.

john paul jones is a arranger.

john paul jones is a musician.

含有athletelist類的新** 

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])

演練新類
vera=athletelist('vear vi')  #使用新的類名

print(vera.top3())

vera.extend(['1.45','2.45','2,31'])

print(vera.top3())

Head First Python 讀書筆記

idle整合開發環境 in 操作符 檢查乙個物件是否在另乙個物件中 不用大括號分開,靠縮排 區分 作為乙個 塊,有 的地方,必須縮排 迭代處理乙個物件序列的三種典型方法 序列是乙個有序的物件集合 for迴圈 知道迴圈次數 迴圈數字列表,迭代變數 x 指的是被迭代物件中的item for x in 1...

HeadFirstPython 資料持久化

usr bin env python coding utf 8 這一章主要是講如何將資料進行持久化。使用pickle對資料進行醃製。在對資料進行醃製之前,我們需要對資料進行格式化 針對資料 取出我們想要的資料。在中間的知識點是 檔案開啟與關閉,以及其異常處理。我用的是python2.7 在某些語法上...

Head First Python 讀書筆記(六)

class dog 建立了狗類 def init self,name str,age int none 初始化屬性name和age self.name name self.age age defsit self none 模擬小狗蹲下 print self.name.title is now sit...