摘要:遞歸函數遞歸函數的用法遞歸函數在一個函數里在調用這個函數本身。如來根本不會管師徒四人按照什么流程去取。面向對象的程序優點是解決了程序的擴展性。
遞歸函數 遞歸函數的用法:
- 遞歸函數:在一個函數里在調用這個函數本身。 - 遞歸的最大深度:998實例
找一個函數的索引位置,遞歸實現
l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88] def two_serarch(list,aim,start=0,end=None): end=len(list) -1 if end is None else end if end >= start: mid_index = (end - start) // 2 + start if aim > list[mid_index]: return two_serarch(list,aim,start=mid_index+1,end=end) elif aim < list[mid_index]: return two_serarch(list,aim,start=start,end=mid_index-1) elif aim == list[mid_index]: return mid_index else: return "沒有此值" else: return "沒有此值"
循環一個列表里的元素,遇到列表在循環
def each_list(list_name): for i in list_name: if isinstance(i,list): each_list(i) else: print (i)面向對象編程 初識面對對象
面向過程的程序設計的核心是過程(流水線式思維),過程即解決問題的步驟,面向過程的設計就好比精心設計好一條流水線,考慮周全什么時候處理什么東西。
- 優點是:極大的降低了寫程序的復雜度,只需要順著要執行的步驟,堆疊代碼即可。 - 缺點是:一套流水線或者流程就是用來解決一個問題,代碼牽一發而動全身。 - 應用場景:一旦完成基本很少改變的場景,著名的例子有Linux內核,git,以及Apache HTTP Server等。
面向對象的程序設計的核心是對象(上帝式思維),要理解對象為何物,必須把自己當成上帝,上帝眼里世間存在的萬物皆為對象,不存在的也可以創造出來。面向對象的程序設計好比如來設計西游記,如來要解決的問題是把經書傳給東土大唐,如來想了想解決這個問題需要四個人:唐僧,沙和尚,豬八戒,孫悟空,每個人都有各自的特征和技能(這就是對象的概念,特征和技能分別對應對象的屬性和方法),然而這并不好玩,于是如來又安排了一群妖魔鬼怪,為了防止師徒四人在取經路上被搞死,又安排了一群神仙保駕護航,這些都是對象。然后取經開始,師徒四人與妖魔鬼怪神仙互相纏斗著直到最后取得真經。如來根本不會管師徒四人按照什么流程去取。面向對象的程序:
- 優點是:解決了程序的擴展性。對某一個對象多帶帶修改,會立刻反映到整個體系中,如對游戲中一個人物參數的特征和技能修改都很容易。 - 缺點:可控性差,無法向面向過程的程序設計流水線式的可以很精準的預測問題的處理流程與結果,面向對象的程序一旦開始就由對象之間的交互解決問題,即便是上帝也無法預測最終結果。于是我們經常看到一個游戲人某一參數的修改極有可能導致陰霸的技能出現,一刀砍死3個人,這個游戲就失去平衡。 - 應用場景:需求經常變化的軟件,一般需求的變化都集中在用戶層,互聯網應用,企業內部軟件,游戲等都是面向對象的程序設計大顯身手的好地方。
名詞:類、對象、實例、實例化
類的相關知識1.聲明
def functionName(args): "函數文檔字符串" 函數體 """ class 類名: "類的文檔字符串" 類體 """ #我們創建一個類 class Data: pass
2.屬性
class Person: #定義一個人類 role = "person" #人的角色屬性都是人 def walk(self): #人都可以走路,也就是有一個走路方法 print("person is walking...") print(Person.role) #查看人的role屬性 print(Person.walk) #引用人的走路方法,注意,這里不是在調用
3.實例化:類名加括號就是實例化,會自動觸發__init__函數的運行,可以用它來為每個實例定制自己的特征
class Person: #定義一個人類 role = "person" #人的角色屬性都是人 def __init__(self,name): self.name = name # 每一個角色都有自己的昵稱; def walk(self): #人都可以走路,也就是有一個走路方法 print("person is walking...") print(Person.role) #查看人的role屬性 print(Person.walk) #引用人的走路方法,注意,這里不是在調用
4.實例化的過程就是類——>對象的過程
- 語法:對象名 = 類名(參數) 1.創建一個對象,開辟一個空間 2.自動執行__init__方法,并且對象本身傳給self 3.將傳進的內容封裝給對象本身
5.類屬性的補充
一:我們定義的類的屬性到底存到哪里了?有兩種方式查看 dir(類名):查出的是一個名字列表 類名.__dict__:查出的是一個字典,key為屬性名,value為屬性值 二:特殊的類屬性 類名.__name__# 類的名字(字符串) 類名.__doc__# 類的文檔字符串 類名.__base__# 類的第一個父類 類名.__bases__# 類所有父類構成的元組 類名.__dict__# 類的字典屬性 類名.__module__# 類定義所在的模塊 類名.__class__# 實例對應的類(僅新式類中)對象的相關知識
class 類名: def __init__(self,參數1,參數2): self.對象的屬性1 = 參數1 self.對象的屬性2 = 參數2 def 方法名(self):pass def 方法名2(self):pass 對象名 = 類名(1,2) #對象就是實例,代表一個具體的東西 #類名() : 類名+括號就是實例化一個類,相當于調用了__init__方法 #括號里傳參數,參數不需要傳self,其他與init中的形參一一對應 #結果返回一個對象 對象名.對象的屬性1 #查看對象的屬性,直接用 對象名.屬性名 即可 對象名.方法名() #調用類中的方法,直接用 對象名.方法名() 即可
練習:
練習一:在終端輸出如下信息 小明,10歲,男,上山去砍柴 小明,10歲,男,開車去東北 小明,10歲,男,最愛大保健 老李,90歲,男,上山去砍柴 老李,90歲,男,開車去東北 老李,90歲,男,最愛大保健 class Output: def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex def chopp_wood(self): print("{name},{age}歲,{sex},上山去砍柴".format(name=self.name,age=self.age,sex=self.sex)) def drive_car(self): print("{name},{age}歲,{sex},開車去東北".format(name=self.name,age=self.age,sex=self.sex)) def health_care(self): print("{name},{age}歲,{sex},最愛大保健".format(name=self.name,age=self.age,sex=self.sex)) xiaoming = Output("小明",10,"男") #實例化兩個對象 laoli = Output("老李",90,"男") xiaoming.chopp_wood() xiaoming.drive_car() xiaoming.health_care() laoli.chopp_wood() laoli.drive_car() laoli.health_care()類名稱空間與對象的名稱空間
1.創建一個類就會創建一個類的名稱空間,用來存儲類中定義的所有名字,這些名字稱為類的屬性
- 類有兩種屬性:靜態屬性和動態屬性 1.靜態屬性就是直接在類中定義的變量 2.動態屬性就是定義在類中的方法 - 其中類的數據屬性是共享給所有對象的 - 而類的動態屬性是綁定到所有對象的
2.創建一個對象/實例就會創建一個對象/實例的名稱空間,存放對象/實例的名字,稱為對象/實例的屬性
在obj.name會先從obj自己的名稱空間里找name,找不到則去類中找,類也找不到就找父類...最后都找不到就拋出異常
1.繼承
- 繼承是一種創建新類的方式,在python中,新建的類可以繼承一個或多個父類,父類又可稱為基類或超類,新建的類稱為派生類或子類。
python中類的繼承分為:單繼承和多繼承
class ParentClass1: #定義父類 pass class ParentClass2: #定義父類 pass class SubClass1(ParentClass1): #單繼承,基類是ParentClass1,派生類是SubClass pass class SubClass2(ParentClass1,ParentClass2): #python支持多繼承,用逗號分隔開多個繼承的類 pass
查看繼承:
print(SubClass1.__bases__)#__base__只查看從左到右繼承的第一個子類,__bases__則是查看所有繼承的父類 print(SubClass2.__bases__)
如果沒有指定基類,python的類會默認繼承object類
print(ParentClass1.__bases__) print(ParentClass2.__bases__) (,) ( ,)
2.繼承的重要性
- 繼承來重用代碼
==========================第一部分 例如 貓可以:爬樹、吃、喝、拉、撒 狗可以:看門、吃、喝、拉、撒 如果我們要分別為貓和狗創建一個類,那么就需要為 貓 和 狗 實現他們所有的功能,偽代碼如下: #貓和狗有大量相同的內容 class 貓: def爬樹(self): print "爬樹" def 吃(self): # do something def 喝(self): # do something def 拉(self): # do something def 撒(self): # do something class 狗: def 看門(self): print "看門" def 吃(self): # do something def 喝(self): # do something def 拉(self): # do something def 撒(self): # do something ==========================第二部分 上述代碼不難看出,吃、喝、拉、撒是貓和狗都具有的功能,而我們卻分別的貓和狗的類中編寫了兩次。如果使用 繼承 的思想,如下實現: 動物:吃、喝、拉、撒 貓:爬樹(貓繼承動物的功能) 狗:看門(狗繼承動物的功能) 偽代碼如下: class 動物: def 吃(self): # do something def 喝(self): # do something def 拉(self): # do something def 撒(self): # do something # 在類后面括號中寫入另外一個類名,表示當前類繼承另外一個類 class 貓(動物): def爬樹(self): print "爬樹" # 在類后面括號中寫入另外一個類名,表示當前類繼承另外一個類 class 狗(動物): def 看門(self): print "看門" ==========================第三部分 #繼承的代碼實現 class Animal: def eat(self): print("%s 吃 " %self.name) def drink(self): print ("%s 喝 " %self.name) def shit(self): print ("%s 拉 " %self.name) def pee(self): print ("%s 撒 " %self.name) class Cat(Animal): def __init__(self, name): self.name = name self.breed = "貓" def爬樹(self): print "爬樹" class Dog(Animal): def __init__(self, name): self.name = name self.breed="狗" def 看門(self): print "看門" # ######### 執行 ######### 代碼如下: class Animal: def eat(self): print("%s 吃 " % self.name) def drink(self): print("%s 喝 " % self.name) def shit(self): print("%s 拉 " % self.name) def pee(self): print("%s 撒 " % self.name) class Cat(Animal): def __init__(self, name): self.name = name def up_tree(self): print("爬樹") class Dog(Animal): def __init__(self, name): self.name = name self.breed = "狗" def look_door(self): print("看門") mao = Cat("二虎") mao.eat() mao.drink() mao.shit() mao.pee() mao.up_tree()
3.Python的類繼承了多個類,那么其尋找方法的方式有兩種,分別是:深度優先和廣度優先
- 當類是經典類時,多繼承情況下,會按照深度優先方式查找。 - 當類是新式類時,多繼承情況下,會按照廣度優先方式查找。 - 經典類和新式類,從字面上可以看出一個老一個新,新的必然包含了跟多的功能,也是之后推薦的寫法,從寫法上區分的話,如果 當前類或者父類繼承了object類,那么該類便是新式類,否則便是經典類。 - python2默認是經典類 - python3默認是新式類
經典類繼承:
class D: def bar(self): print "D.bar" class C(D): def bar(self): print "C.bar" class B(D): def bar(self): print "B.bar" class A(B, C): def bar(self): print "A.bar" a = A() # 執行bar方法時 # 首先去A類中查找,如果A類中沒有,則繼續去B類中找,如果B類中么有,則繼續去D類中找,如果D類中么有,則繼續去C類中找,如果還是未找到,則報錯 # 所以,查找順序:A --> B --> D --> C # 在上述查找bar方法的過程中,一旦找到,則尋找過程立即中斷,便不會再繼續找了 a.bar() 經典類多繼承
新式類繼承:
class D(object): def bar(self): print "D.bar" class C(D): def bar(self): print "C.bar" class B(D): def bar(self): print "B.bar" class A(B, C): def bar(self): print "A.bar" a = A() # 執行bar方法時 # 首先去A類中查找,如果A類中沒有,則繼續去B類中找,如果B類中么有,則繼續去C類中找,如果C類中么有,則繼續去D類中找,如果還是未找到,則報錯 # 所以,查找順序:A --> B --> C --> D # 在上述查找bar方法的過程中,一旦找到,則尋找過程立即中斷,便不會再繼續找了 a.bar() 新式類多繼承
經典類:首先去A類中查找,如果A類中沒有,則繼續去B類中找,如果B類中么有,則繼續去D類中找,如果D類中么有,則繼續去C類中找,如果還是未找到,則報錯
新式類:首先去A類中查找,如果A類中沒有,則繼續去B類中找,如果B類中么有,則繼續去C類中找,如果C類中么有,則繼續去D類中找,如果還是未找到,則報錯
注意:在上述查找過程中,一旦找到,則尋找過程立即中斷,便不會再繼續找了
4.組合
組合指的是,在一個類中以另外一個類的對象作為數據屬性,稱為類的組合
文字游戲:
class Game_person: def __init__(self,nickname,sex,hp,ad): self.nickname = nickname self.sex = sex self.hp = hp self.ad = ad def attack(self,p): p.hp = p.hp - self.ad #剩余血量 print("%s攻擊了%s,%s還剩%s血量"%(self.nickname,p.nickname,p.nickname,p.hp)) def wuqi(self,wuqi): self.wuqi = wuqi #tian.wuqi(wuqi1)武器類的對象封裝到人的對象中當做一個屬性.就叫做組合. class Weapon: def __init__(self,name,ad): #武器的名字,武器的傷害 self.name =name self.ad =ad def fight(self,p1,p2): p2.hp = p2.hp - self.ad print("%s使用%s打了%s%s血,%s還剩%s滴血"%(p1.nickname,self.name ,p2.nickname,self.ad,p2.nickname,p2.hp)) tian = Game_person("TIAN","男",200,10) didi = Game_person("DIDI","女",200,50) wuqi = Weapon("鞭子",50) tian.wuqi(wuqi) tian.wuqi.fight(tian,didi)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41884.html
摘要:前言由于寫的文章已經是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導航。 前言 由于寫的文章已經是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導航。 由于更新比較頻繁,因此隔一段時間才會更新目錄導航哦~想要獲取最新原創的技術文章歡迎關注我的公眾號:Java3y Java3y文章目錄導航 Java基礎 泛型就這么簡單 注解就這么簡單 Druid數據庫連接池...
摘要:專題系列共計篇,主要研究日常開發中一些功能點的實現,比如防抖節流去重類型判斷拷貝最值扁平柯里遞歸亂序排序等,特點是研究專題之函數組合專題系列第十六篇,講解函數組合,并且使用柯里化和函數組合實現模式需求我們需要寫一個函數,輸入,返回。 JavaScript 專題之從零實現 jQuery 的 extend JavaScritp 專題系列第七篇,講解如何從零實現一個 jQuery 的 ext...
摘要:看起來好像是廢話,它還有一個補充的說明,在函數式編程中要避免狀態變化和使用可變對象。函數式編程的特點在中,函數即對象,例如聲明一個函數之后,你可以調用其屬性。 ...
閱讀 2568·2021-11-23 09:51
閱讀 2480·2021-09-30 09:48
閱讀 1075·2021-09-10 10:51
閱讀 2212·2021-08-12 13:22
閱讀 3567·2021-08-11 10:24
閱讀 2166·2019-08-30 15:55
閱讀 645·2019-08-30 14:05
閱讀 3209·2019-08-30 13:03