摘要:代碼改為根據數據結構,第一個數據是名字,第二個是生日,第二個之后是成績,所以分別將相關數據賦值到字典里面。是否知道何時使用列表而何時使用字典,這正式從好的程序員中區分出優秀程序員的一個標準。特定函數應用特定數據。更加正規的做法是建立類。
樣例數據
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需要將數據整理,實現人名+出生日期+成績的輸出 以往的做法是:
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) def get_coach_data(filename): try: with open(filename) as f: data = f.readline() return(data.strip().split(",")) except IOError as ioerr: print("File error: " + str(ioerr)) return(None) 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]))這次加入了字典的做法
字典將數據值與鍵關聯:
key --> value 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()
關聯key和value的話是
cleese["Name"] = "John Cleese" # 一個key 對應一個字符串
或者
cleese["Name"] = ["John Cleese","John Cleese1","John Cleese2","John Cleese3","John Cleese4"] #一個key對應一個list
或者
cleese = {"Name":"abc","Address":"asdasdasda"} #注意是用冒號
另外數據值與key關聯后,需要訪問數據值里面的某個數據項的話,可以是
cleese["Name"][-1]
類似多維數組使用。
代碼改為
#!/usr/bin/python # -*- coding: utf-8 -*- 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) def get_coach_data(filename): try: with open(filename) as f: data = f.readline() return(data.strip().split(",")) except IOError as ioerr: print("File error:" + str(ioerr)) return(None) 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]))
為了更加方便的處理多個人的成績的數據,所以將字典數據轉移到函數里面去,直接通過函數生成出字典,并返回需要的數據字典的方法優勢在于合理使用數據結構。是否知道何時使用列表而何時使用字典,這正式從好的程序員中區分出優秀程序員的一個標準。
字典其實也叫“映射”,“散列”,“關聯數組”
#!/usr/bin/python # -*- coding: utf-8 -*- 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) def get_coach_data(filename): try: with open(filename) as f: data = f.readline() templ = data.strip().split(",") return({"Name":templ.pop(0), #這里就是字典 "DOB":templ.pop(0), "Times":str(sorted(set([sanitize(t) for t in templ]))[0:3])}) except IOError as ioerr: print("File error:" + str(ioerr)) return(None) sarah = get_coach_data("sarah2.txt") james = get_coach_data("james2.txt") print(sarah["Name"] + ""s fastest times are: " + sarah["Times"])
這就是將代碼和數據打包在一起。特定函數應用特定數據。
更加正規的做法是建立類。類是面向對象oop編程模型的東西,類的概念在這里不詳細描述。
類可以
1.降低復雜性 2.方便維護和擴展
python的類需要有一個self參數,這個參數是用來標識是屬于哪個對象實例的
例如:
class Athlete: def __init__(self,value=0): self.thing = value #定義這個類的屬性thing def how_big(self) #定義一個方法how_big return(len(self.thing))
btw:init 是類的python固定實現方法,所以是必須的。
你寫的代碼 --> python執行的代碼 d = Athlete("Holy Grail") Athlete.__init__(d,"Holy Grail") | | | 類 方法 目標標識符 | | | d.how_big() Athlete.how_big(d)
代碼改為:
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) class Athlete: def __init__(self, a_name, a_dob=None, a_times=[]): self.name = a_name #通過類的屬性來定義name,dob和times 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") 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.通過在各個對象的屬性中保留原始數據,可以支持類擴展來滿足將來的其他需求。如果處理數據并作為對象初始化代碼的一部分,說明你已對程序員將如何使用這個類做出了假設,而日后這些假設肯定會對你造成障礙。
可以是增加單個成績,或是增加多個成績
單個成績用add_time,傳入的是字符串
多個成績是add_times,傳入的是list
以下是單個成績的樣例:
#!/usr/bin/python # -*- coding: utf-8 -*- 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 add_time(self,time_value): #這里就是了。 self.times.append(time_value) def top3(self): return (sorted(set([sanitize(t) for t in self.times]))[0:15]) def add_times(self,list_of_times): self.times.extend(list_of_times) 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) 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) sarah = get_coach_data("sarah2.txt") sarah.add_time("2.88") #這里調用 print(sarah.name + ""s fastest times are: " + str(sarah.top3())) #輸出結果會改變觀察到這個類有點像list,所以有重復制造車輪的嫌疑,并且功能單一,所以決定集成list類
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) class AthleteList(list): #繼續list類,所以這里要寫list的名字 def __init__(self, a_name, a_dob=None, a_times=[]): list.__init__([]) #這里需要初始化list類 self.name = a_name self.dob = a_dob self.extend(a_times) #因為集成list類了,所以這里可以直接使用list的extend方法 def top3(self): return(sorted(set([sanitize(t) for t in self]))[0:3]) def get_coach_data(filename): try: with open(filename) as f: data = f.readline() templ = data.strip().split(",") return(AthleteList(templ.pop(0), templ.pop(0), templ)) except IOError as ioerr: print("File error: " + str(ioerr)) 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()))
原文引用:http://www.godblessyuan.com/2015/05/03/head_first_python_chapter_6_lea...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/37545.html
摘要:第六章抽象本章會介紹如何將語句組織成函數。關鍵字參數和默認值目前為止,我們使用的參數都是位置參數,因為它們的位置很重要,事實上比它們的名字更重要。參數前的星號將所有值放置在同一個元祖中。函數內的變量被稱為局部變量。 第六章:抽象 本章會介紹如何將語句組織成函數。還會詳細介紹參數(parameter)和作用域(scope)的概念,以及遞歸的概念及其在程序中的用途。 懶惰即美德 斐波那契數...
摘要:在復雜的情況下,需要具體策略維護內部狀態時,可能需要把策略和享元模式結合起來。函數比用戶定義的類的實例輕量,而且無需使用享元模式,因為各個策略函數在編譯模塊時只會創建一次。 一等函數實現設計模式 經典的策略模式定義 定義一系列算法,把它們一一封裝起來,并且使它們可以相互替換。本模式使得算法可以獨立于使用它的客戶而變化。 案例 假如一個網店制定了下述折扣規則。 有 1000 或以上積分...
摘要:在指定位置刪除并返回這個數據項,注意這里是有返回項的。移除某一個特定數據項。第二章發布并上傳代碼到在查閱大量資料發布和上傳還有很多附屬文件需要編寫和上傳以確保模塊能夠正常發布和更新。包含函數串鏈,特點是中包含函數。 寫在前面:吾嘗終日而思矣,不如須臾之所學也;吾嘗跂而望矣,不如登高之博見也。登高而招,臂非加長也,而見者遠;順風而呼,聲非加疾也,而聞者彰。假輿馬者,非利足也,而致千里;假...
摘要:弄了好久終于,踩了很多坑,感覺自己好菜,提供我的參考在外面設置,如,注意沒有引號和空格郵箱設置賬號獲取授權碼,在外部傳遞安全如,注意沒有引號和空格發送者郵箱接收者郵箱,,注意沒有引號參考的一個作者的文章插件系列,還有廖雪峰的教程 弄了好久終于OK,踩了很多坑,感覺自己好菜,提供我的參考 # -*- coding: utf-8 -*- import os from flask impor...
摘要:創建一個新對象將構造函數的作用域賦給新對象因此就指向了這個新對象執行構造函數中的代碼為這個新對象添加屬性返回新對象。 本章內容 理解對象屬性 理解并創建對象 理解繼承 ECMA-262把對象定義為:無序屬性的集合,其屬性可以包含基本值、對象或者函數 理解對象 創建對象 創建自定義對象的最簡單方式就是創建一個Object的實例,再為它添加屬性和方法。 var person = new...
閱讀 2977·2023-04-26 02:04
閱讀 1285·2021-11-04 16:07
閱讀 3711·2021-09-22 15:09
閱讀 684·2019-08-30 15:54
閱讀 1905·2019-08-29 14:11
閱讀 2532·2019-08-26 12:19
閱讀 2260·2019-08-26 12:00
閱讀 763·2019-08-26 10:27