迭代器、生成器、遞迴、二分法
一.迭代器
1.什麼是迭代器:迭代取值的工具
迭代:迭代是一個重複的過程,但是每次重複都是基於上一次重複的結果而繼續
2.為什麼要用迭代器
優點:1.提供一種不依賴索引的迭代取值方式
2.更加節省記憶體
缺點:1.沒有按照索引的取值方式靈活
2.取值是一次性的,只能往後取,無法預測值的個數
3.如何用迭代器
可迭代的物件:內建有__iter__方法的物件,稱之為可迭代物件。(str/list/tuple/dict/set/檔案物件)
迭代器物件:內建既有_iter__方法,又有__next__方法的物件,稱之為迭代器物件。(檔案物件)
注:呼叫可迭代物件下__iter__方法,會有一個返回值,該返回值就是內建的迭代器物件
我們通常不用__iter__這樣的形式,直接用iter()這種形式
while True:
try:
v=iter_d.__next__()
print(v)
except StopIteration:
break
#我們用try,except Stoplteration這種形式,在迴圈取迭代器時,負責監控報錯資訊,這樣就避免掉程式
報錯,崩潰等現象出現。
4.for迴圈的底層原理
4.1呼叫in後面那個物件的__iter__方法,拿到一個迭代器物件
4.2呼叫迭代器物件__iter__()方法,將得到的返回值賦值給in前面的變數名,迴圈往復直到取值完畢丟擲異常Stoplteration
4.3捕捉異常結束迴圈
二.生成器
1.生成器就是一種自定義的迭代器
2.如何得到生成器:函式內出現yield關鍵字,再去呼叫函式不會立即執行函式體程式碼,會得到一個返回值,該返回值就是生成器物件,即自定義的迭代器。
3.yield:1.提供一種自定義的迭代器的解決方案
2.yield & return
相同點:都可以返回值,返回值沒有型別限制,也沒有個數限制
不同點:return只能返回一個值,yield可以讓函式暫停在某一個位置,可以返回多次值
三.函式的遞迴呼叫
在呼叫一個函式的過程時,又直接或者間接的呼叫該函式本身,稱之為遞迴呼叫
#呼叫函式時會產生區域性名稱空間,佔用記憶體,在遞迴呼叫函式時,如果出現一種死迴圈的情況,python直譯器的記憶體管理機制為了防止其無限制佔用記憶體,對函式的遞迴呼叫做了最大的層級限制
遞迴必須滿足兩個條件:1.每進入下一次遞迴呼叫,問題的規模都應該有所減少
2.遞迴必須有一個明確的結束條件
遞迴有兩個明確的階段:1.回溯:2.遞推
四.二分法
想從一個按照從小到大排列的數字列表中找到指定的數字,遍歷的效率太低,用二分法(演算法的一種,演算法是解決問題的方法)可以極大低縮小問題規模
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]:
binary_search(list1[mid_index + 1:],find_num)
elif find_num < list1[mid_index]:
binary_search(list1[:mid_index],find_num)
else:
print('find it')
binary_search(nums,203)