一:迭代器ide
1.什麼是迭代?函數
迭代是一個重複的過程,可是每次重複都是基於上一次重複的結果而繼續。工具
下列循環單純重複:spa
while True: print(1) # 基於索引的迭代取值 l=['a','b','c'] i=0 while i < len(l): print(l[i]) i+=1
2.什麼是迭代器?3d
迭代器是重複取值的工具code
3.爲何要用迭代器?對象
迭代器blog
優勢:遞歸
1.提供一種不依賴索引取值的迭代取值方式、索引
2.更節省內存
缺點:
1.不如按照索引的取值方式靈活
2.取值一次性的,只能日後取,沒法預測值的個數
4.如何用迭代器?
可迭代的對象:str\list\tuple\dict\set\文件對象
只要內置有__iter__方法的對象都稱爲可迭代的對象
迭代器對象:文件對象
即內置有__iter__方法,又內置有__next__方法的對象都稱之爲迭代器對象。
調用迭代器方法下的__iter__方法會有一個返回值,該返回值就是內置的迭代器對象。
s='abcdef' l=['a','b','c'] d={'k1':111,'k2':222,'k3':333} iter_d=d.__iter__() # print(iter_d) 監測是否執行完畢 try: print(iter_d.__next__()) print(iter_d.__next__()) print(iter_d.__next__()) print(iter_d.__next__()) except StopIteration: print('取值完畢')
#while循環 d={'k1':111,'k2':222,'k3':333} iter_d=d.__iter__() while True: try: v=iter_d.__next__() print(v) except StopIteration: break #for循環 for k in d: print(k)
for循環的底層原理:
1.調用in後面的那個值/對象的__iter__方法,拿到一個迭代器對象iter_obj
2.調用迭代器對象iter_obj.__next__()將獲得的返回值賦值變量名k,循環往復直到取值完畢拋出異常StopIteration
3.捕捉異常結束循環
二:生成器
生成器就是一種自定義的迭代器
如何獲得生成器?
只要函數內出現yield關鍵字,再去調用函數不會當即執行函數體代碼,會獲得一個返回值,該返回值就是生成器對象,即自定義的迭代器。
總結yield:
1.提供一種自定義迭代器的解決方案
2.yield & return
相同點:均可以返回值,返回值沒有類型\個數限制
不一樣點:return只能返回一次值,yield卻能夠讓函數暫停在某一個位置,能夠返回多個值
def my_range(start,stop,step=1): while start < stop: # 5 < 5 yield start # 3 start+=step #start=5
三:函數的遞歸調用
1.函數的遞歸調用:
在調用一個函數的過程當中又直接或者間接的調用該函數自己,稱之爲遞歸調用
2.遞歸調用必須知足兩個條件:
1.每進入下一次遞歸調用,問題的規模都應該有所減小
2.遞歸必須有一個明確的結束條件
如下遞歸只是單純的重複,沒有意義:
def func(): print(1) print(2) print(3) func() func() def bar(): print('from bar') foo() def foo(): print('from foo') bar() foo()
3.遞歸有兩個明確的階段:
1.回溯
2.遞推
age(5)=age(4)+2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2 age(1)=18 age(n)=age(n-1)+2 # n > 1 age(1)=18 # n = 1 遞歸: def age(n): if n == 1: return 18 return age(n-1)+2 print(age(5))
四:二分法
具體以例爲證:
nums=[3,5,7,11,13,23,24,76,103,111,201,202,250,303,341] def binary_search(list1,find_num): print(list1) if len(list1) == 0: print('not exist') return mid_index=len(list1) // 2 if find_num > list1[mid_index]: # in the right binary_search(list1[mid_index + 1:],find_num) elif find_num < list1[mid_index]: # in the left binary_search(list1[:mid_index],find_num) else: print('find it') binary_search(nums,201)