1. 程式人生 > >菜鳥學Python第十三天

菜鳥學Python第十三天

迭代器

  • 什麼是迭代器

    • 迭代:迭代是一個重複的過程,但是每次重複都是基於上一次重複的結果而繼續

    • 迭代器:迭代取值的工具

  • 為什要用迭代器

    • 優點

      1. 提供了一種不依賴索引的迭代取值方式

      2. 更節省記憶體

    • 缺點

      1. 不如按索引的取值方式靈活

      2. 取值一次性的,只能往後取,無法預測值的個數

如何用迭代器

  • 可迭代的物件: str/list/tuple/dict/set/檔案

    但凡內建有__ iter __方法的物件都稱之為迭代物件

  • 迭代器型別:

    既內建有__ iter __ 方法有內建有 __ next __方法的物件都稱之為迭代器物件

  • 呼叫可迭代物件下__ iter __ 方法,會有一個返回值,該返回值就是內建的迭代器物件

# while 實現迭代取值
​
d = {'k1':111,'k2':222, 'k3':333}
iter_d = d.__iter__  # 將可迭代物件轉化為迭代器物件
while True:
    try:  # 測試檔案
        v = iter_d.__next__  # 迭代迴圈一個內容
        print(v)
    except
StopIteration: # 當錯誤內容正好是except即接收不報錯 break # for 迴圈迭代取值(底層原理如上) d = {'k1':111,'k2':222, 'k3':333} for k in d: print(k) # for迴圈的底層原理 # 1. 呼叫in後面的那個值/物件的__inter__方法,拿到一個迭代器物件iter_obj # 2. 呼叫迭代器物件iter_obj.__next__()將得到的返回值賦值變數k,迴圈往復直到取值完畢丟擲異常StopIteration # 3. 捕捉異常結束迴圈

  


 

生成器

  • 什麼是生成器

    生成器就是一種自定義的迭代器

    def func():  # 生成器
        print('first')
        yield 1
        print('second')
        yield 2
        print('third')
        yield 3
        
    for i in func():  # 迭代迴圈func內容
        print(i)

     

  • 如何得到生成器

    但凡函式內出現yield關鍵字,再去呼叫函式不會立刻執行函式體程式碼,會得到一個返回值,該返回值就是生成器物件,及自定義迭代器

  • 總結yield:

    1. 提供一種自定義迭代器的解決方案

    2. yield &return

      • 相同點: 都可以返回值,返回值沒有型別限制和個數限制

      • 不同點: return只能返回一次值,yield卻可以讓函式暫停在某個位置,可以返回多次值。

 


 

遞迴函式與二分法

  • 函式的遞迴呼叫

    在呼叫一個函式的過程中又直接或者間接地呼叫該函式本身,稱之為遞迴呼叫

    • 遞迴必須滿足兩個條件:

      1. 每進入下一次遞迴呼叫,問題的規模都應該有所減少

      2. 遞迴必須有一個明確的結束條件

    • 遞迴兩個明確的階段:

      1. 回溯:函式呼叫迴圈規模減少的過程

      2. 遞推:迴圈結束一層層返回結果的過程

    # 實現5的階乘5!
    def factorial(n):
        if n == 1:
            return 1
        else:
            return n * factorial(n - 1)
    ​
    ​
    print(factorial(5))
     
  • 二分法

    在有序的區間內查詢時,使用二分法使對比範圍縮小一半,大大提升了查詢效率(普通查詢需要一個個進行遍歷,效率太低)

    # 在列表內查詢值
    l1 = [1,2,3,4,6,7,8,9,13,23,24,25,26,29,30,40,48,55,60]
    def find_n(list1, num):
        if len(list1) == 0:
            print('not in')
            return
        x = list1[len(list1) // 2]
        if num > x:
            list1 = list1[len(list1) // 2 + 1:]
            return find_n(list1, num)
        elif num < x:
            list1 = list1[:len(list1) // 2]
            return find_n(list1, num)
        else:
            print('find it')
    ​
    ​
    find_n(l1, 23)