1. 程式人生 > >遞歸函數、二分查找、面相對象初識、類空間,對象空間、組合、繼承

遞歸函數、二分查找、面相對象初識、類空間,對象空間、組合、繼承

二分查找 tar %s anim style nim index 訪問類 AI

一、遞歸函數 一般遞歸100多次,都沒有解決的問題,放棄遞歸。 默認遞歸深度:998 修改默認遞歸次數 import sys sys.setrecursionlimit(100000) #設置十萬次 count = 0 def func1(): global count count += 1 print(count) func1() func1() 用遞歸 解決一個年齡問題。 alex 他比佩奇 大兩歲。 4 age(3) + 2 佩奇 他比日天 大兩歲。 3 age(2) + 2 日天 他比太白 大兩歲。 2 age(1) + 2 太白:我今年23. 1 23
def age(n): if n == 1: return 23 else: return age(n-1) + 2 print(age(4)) 二、二分查找 l = [2,3,5,10,15,16,18,22,26,30,43,55,56,66,67,69,72,76] 有序的不重復數字列表 查詢到66 索引 print(l.index(66)) # 方法一 不用index查詢66的索引 index = 0 for i in l: if i == 66: print(index) index += 1 for i in range(len(l)):
if l[i] == 66: print(i) 利用遞歸函數,通過二分查找的方法尋找目標的索引 l = [2,3,5,10,15,16] 因為每次切片,改變了原列表,進而改變了索引。 #根據所想瞎寫的查找 def two_search(l,aim): mid_index = len(l) // 2 if aim > l[mid_index]: return two_search(l[mid_index+1:],aim) elif aim < l[mid_index]: return two_search(l[:mid_index],aim)
elif aim == l[mid_index]: return mid_index else: return ‘沒有此值‘ #查找16的索引 l1 = [2,3,5,10,15,16] def two_search(l,aim,start=0,end=None): end = len(l) - 1 if end is None else end if end >= start: mid_index = (end - start) // 2 + start if aim > l[mid_index]: return two_search(l,aim,start=mid_index+1,end=end) elif aim < l[mid_index]: return two_search(l,aim,start=start,end=mid_index-1) elif aim == l[mid_index]: return mid_index else: return ‘沒有此值‘ else: return ‘沒有此值‘ print(two_search(l1,5)) 三、面相對象初識 什麽是類 類:是具有相同屬性和技能的一類事物。 什麽是對象 實例化的一個類,是類的具體體現。 貓就是一類,我家樓下那只小花貓,這是一個對象。(小花貓是個具體的對象) 類開頭首字母 大寫 class Person: # class 關鍵字,定義了一個類 ‘‘‘ 類裏面的所有內容 ‘‘‘ animal = ‘高級動物‘ # 靜態變量 soup = ‘有思想‘ # 靜態變量 def __init__(self,name,sex,eye,high,weight,): # 構造方法 self.eye = eye # 屬性 self.name = name self.sex = sex self.high = high self.weight = weight print(666) #self默認不用填寫 def work(self): # 動態變量,動態方法,方法 print(self) # self.job = ‘IT‘ print(‘人會工作....‘) 查看 靜態變量,動態變量 1.類名.__dict__方法 #只能查看,不能增刪改 print(Person.__dict__) print(Person.__dict__[‘animal‘]) Person.__dict__[‘name‘] = ‘alex‘ Person.__dict__[‘animal‘] = ‘低級動物‘ 2.類名.變量名 #可增刪改查 print(Person.animal) print(Person.soup) Person.kind = ‘有性格‘ Person.animal = ‘低等動物‘ del Person.kind print(Person.__dict__) PS:想查詢全部的靜態變量時,用__dict__ 其他全部都用類名.變量名 類 操作 方法有兩種方式 1、類名.__dict__[方法名]() print(Person.__dict__[‘work‘](11)) 2、類名.方法名 Person.work(11) 對象 類名() #實例化一個對象 p1 = Person() #p1 對象,實例化對象,類名()過程就叫做實例化。 只要實例化一個對象,自動觸發__init__ 內部進行三步: 1,實例化一個對象,在內存中產生一個對象空間。 2,自動執行init方法,並將這個空間對象。 <__main__.Person object at 0x0000000001F5ABE0> 傳給self 3,通過構造方法裏的代碼給空間對象添加一些屬性,並返回給對象。 p1 = Person(‘峰哥‘,‘男‘,‘大眼睛‘,176,170) print(p1.__dict__) 666 {‘eye‘: ‘大眼睛‘, ‘name‘: ‘峰哥‘, ‘sex‘: ‘男‘, ‘high‘: 176, ‘weight‘: 170} 對象 查看 靜態變量,動態變量 1、對象.__dict__方法 #只能查看,不能增刪改 2、對象.變量名 #可增刪改查 print(p1.name) print(p1.eye) p1.color = ‘黃皮膚‘ print(p1.color) print(p1, type(p1)) 3、可以訪問類的靜態變量 print(p1.__dict__) print(p1.animal) print(p1.soup) 一般你想查詢全部的靜態變量時,用__dict__ 其他全部都用類名.變量名。 對象 操作 兩種方式 1、對象.方法名() p1.work() print(p1) print(p1.__dict__) 2、類名.方法名(對象) Person.work(111) Person.work(p1) 四、類空間,對象空間 class Person: animal = ‘高級動物‘ # 靜態變量 soup = ‘有思想‘ # 靜態變量 name = ‘taibai‘ def __init__(self,name,sex,eye,high,weight,): # 構造方法 self.eye = eye # 屬性 self.name = name self.sex = sex self.high = high self.weight = weight print(666) def work(self,job): # 動態變量,動態方法,方法 self.name = ‘oldboy‘ self.job = job print(‘人會工作....‘) #self 約定俗稱叫self 不能改變。 p1 = Person(‘alex‘,‘女‘,‘小眼睛‘,178,160) print(p1.name) 666 alex print(p1.__dict__) 666 {‘eye‘: ‘小眼睛‘, ‘name‘: ‘alex‘, ‘sex‘: ‘女‘, ‘high‘: 178, ‘weight‘: 160} print(p1.eye) 666 小眼睛 練習一:在終端輸出如下信息 小明,10歲,男,上山去砍柴 小明,10歲,男,開車去東北 小明,10歲,男,最愛大保健 老李,90歲,男,上山去砍柴 老李,90歲,男,開車去東北 老李,90歲,男,最愛大保健 方法一、 def chop_wood(name,age,sex): print(‘%s,%s歲,%s,上山去砍柴‘%(name,age,sex)) def driver(name,age,sex): print(‘%s,%s歲,%s,開車去東北‘%(name,age,sex)) def healthcare(name,age,sex): print(‘%s,%s歲,%s,最愛大保健‘%(name,age,sex)) chop_wood(‘小明‘,12,‘男‘) driver(‘小明‘,12,‘男‘) healthcare(‘小明‘,12,‘男‘) chop_wood(‘老李‘,22,‘男‘) 方法二、 class Dayaction: def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex def chop_wood(self): print(‘%s,%s歲,%s,上山去砍柴‘%(self.name,self.age,self.sex)) def driver(self): print(‘%s,%s歲,%s,開車去東北‘%(self.name,self.age,self.sex)) def healthcare(self): print(‘%s,%s歲,%s,最愛大保健‘%(self.name,self.age,self.sex)) p1 = Dayaction(‘小明‘, 15, ‘男‘) p1.chop_wood() p1.driver() p1.healthcare()五、組合 給一個類對象的屬性 封裝 另一個類的對象。 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 -= self.ad print(‘%s攻擊了%s,%s還剩%s血量‘%(self.nickname,p.nickname,p.nickname,p.hp)) def weapon_attack(self,武器): self.武器 = 武器 #斧子對象 class Weapon: def __init__(self,name,ad): self.name=name self.ad=ad def fight(self,p1,p2): p2.hp -= self.ad print(‘%s使用%s打了%s%s血,%s還剩%s滴血‘\ %(p1.nickname,self.name,p2.nickname,self.ad,p2.nickname,p2.hp)) ts = Game_person(‘泰森‘,‘男‘,200,50) barry = Game_person(‘太白‘,‘男‘,100,10) fuzi = Weapon(‘斧子‘,60)六、繼承 面向對象三大特點: 封裝 繼承 多態 繼承:單繼承,多繼承。 繼承:可以有效的節省代碼。 繼承是一種創建新類的方式,在python中, 新建的類可以繼承一個或多個父類,父類又可稱為基類或超類, 新建的類稱為派生類或子類 類分為兩種:新式類,經典類。但是python3x中只有新式類。 新式類 :遵循的廣度優先。 經典類 :遵循的深度優先。 class Animal: soup = ‘靈魂‘ def __init__(self,varieties, sex, color): self.varieties = varieties self.sex = sex self.color = color def eat(self): print(‘吃‘) class Cat(Animal): a = Animal.eat def eat(self): print(‘貓吃飯‘) #Cat 繼承 Animal 多繼承 鉆石繼承 class A: def func(self): print(‘A‘) class B(A): pass def func(self): print(‘B‘) class C(A): pass def func(self): print(‘C‘) class D(B,C): pass d1 = D() d1.func() class A: def func(self): print(‘A‘) class B(A): pass def func(self): print(‘B‘) class C(A): pass def func(self): print(‘C‘) class D(B): pass def func(self): print(‘D‘) class E(C): pass def func(self): print(‘E‘) class F(D,E): pass def func(self): print(‘F‘) print(F.mro()) #mro差看繼承走位

遞歸函數、二分查找、面相對象初識、類空間,對象空間、組合、繼承