1. 程式人生 > >迭代器、生成器、遞迴、二分法

迭代器、生成器、遞迴、二分法

一.迭代器

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)