菜鳥學Python第十三天
阿新 • • 發佈:2018-12-03
迭代器
-
什麼是迭代器
-
迭代:迭代是一個重複的過程,但是每次重複都是基於上一次重複的結果而繼續
-
迭代器:迭代取值的工具
-
-
為什要用迭代器
-
優點
-
提供了一種不依賴索引的迭代取值方式
-
更節省記憶體
-
-
缺點
-
不如按索引的取值方式靈活
-
取值一次性的,只能往後取,無法預測值的個數
-
-
如何用迭代器
-
可迭代的物件: 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) exceptStopIteration: # 當錯誤內容正好是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:
-
提供一種自定義迭代器的解決方案
-
yield &return
-
相同點: 都可以返回值,返回值沒有型別限制和個數限制
-
不同點: return只能返回一次值,yield卻可以讓函式暫停在某個位置,可以返回多次值。
-
-
遞迴函式與二分法
-
函式的遞迴呼叫:
在呼叫一個函式的過程中又直接或者間接地呼叫該函式本身,稱之為遞迴呼叫
-
遞迴必須滿足兩個條件:
-
每進入下一次遞迴呼叫,問題的規模都應該有所減少
-
遞迴必須有一個明確的結束條件
-
-
遞迴兩個明確的階段:
-
回溯:函式呼叫迴圈規模減少的過程
-
遞推:迴圈結束一層層返回結果的過程
-
# 實現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)