三元表示式 ,迭代器, 生成器,二分法 阿新 • • 發佈:2018-12-03 三元表示式# x if x > y else y ##如果x大於y,值返回左邊,不然則返回右邊 #用一行程式碼表達一個函式需要做的事情,使程式碼更簡潔 # 例1,# res='x' if True else 'y'# print(res)迭代器 # 1. 什麼是迭代器# 什麼是迭代?# 迭代是一個重複的過程,但是每次重複都是基於上一次重複的結果而繼續 #下列迴圈知識單純的重複 # while True: #while迴圈取值,是單純的重複。迭代取得是基於上一次取下一次的值 # print(1) # 基於索引的迭代取值 #基於索引的方式可取值的物件不包括數字 #字串,列表,字典 #例1, # l=['a','b','c'] # i=0 # while i < len(l): # print(l[i]) # i+=1 # 什麼是迭代器? # 迭代取值的工具# 2. 為什麼要用迭代器# 優點# 1. 提供一種不依賴索引的迭代取值方式 #比如,元組,列表都是不基於索引取值# 2.佔用記憶體小,迭代下一次的時候上一次的迭代的內容被回收(這也是缺點,無法索引取值)# 缺點# 1,不如按照索引取值的內容靈活# 2,取值一次性的,只能往後取,且無法預測取值的格式# 3. 如何用迭代器# 可迭代的物件:str\list\tuple\dict\set\檔案物件 (除了整形)# 但凡內建有__iter__方法的物件都稱之為可迭代物件 #例2, # a='str' #a除了整形都可以使用__iter__內建方法 # a.__iter__() # 迭代器物件: 檔案物件 # 既內建有__iter__方法又內建有__next__方法的物件都稱之為迭代器物件 # 呼叫可迭代物件下__iter__方法,會有一個返回值,該返回值就是內建的迭代器物件 #例3, # a=[1,2,3,4] # a_1=a.__iter__() # a_1.__next__()# 例4,# iter(d)=d.__iter__# next(d)=d.__next__# len(d)=d.__len__'''# d={'k1':111,'k2':222,'k3':333} # iter_d=d.__iter__()# # print(iter_d)## try: #ry方法,可以捕捉異常(報錯檔案)# print(iter_d.__next__()) #輸出第一次迭代的內容# print(iter_d.__next__()) #輸出基於上一次迭代的內容# print(iter_d.__next__())# print(iter_d.__next__()) #如果迭代內容為空(迭代完了),再次迭代則報錯# except StopIteration: #對應try,如果報錯內容為StopIteration,輸出下一行程式碼, #即隱藏了報錯內容,使程式碼得已繼續執行# print('取值完畢') #報錯時執行的程式碼'''''' # for迴圈的底層原理d={'k1':111,'k2':222,'k3':333} iter_d=d.__iter__() #賦值迭代物件while True: #while迴圈迭代內容 try: #捕捉並處理報錯內容的程式碼 v=iter_d.__next__() #產生迭代內容 print(v) except StopIteration: #處理報錯(迭代內容超過迭代物件的內容報錯的情況) break #報錯時執行的內容(結束迴圈)'''# for k in d:# print(k) #for迴圈的底層原理: # 1. 呼叫in後面那個值/物件的__iter__方法,拿到一個迭代器物件iter_obj #如果物件不能迭代,則報錯。比如數字型別 # 2. 呼叫迭代器物件iter_obj.__next__()將得到的返回值賦值變數名k, # 迴圈往復直到取值完畢丟擲異常StopIteration # 3. 捕捉異常結束迴圈生成器 生成器就是一種自定義的迭代器如何得到生成器? 但凡函式內出現yield關鍵字,再去呼叫函式不會立即執行函式體程式碼, 會得到一個返回值,該返回值就是生成器物件,即自定義的迭代器'''# def func():# print('first')# yield 1 #yield與return的區別# # yield執行到此處會暫停,return代表函式結束# print('second')# yield 2# print('third')# yield 3### g=func() # g對應的就是一個生成器# # print(g)# ## res1=next(g) #生成器開始執行,第一次迭代的結果就是yield 返回的內容,同時之前的程式碼也會執行# print(res1)# ## res2=next(g) #生成器第二次迭代# print(res2)## res3=next(g) #生成器第三次迭代# print(res3)## next(g)# 總結yield:# 1. 提供一種自定義迭代器的解決方案# 2. yield & return# 相同點: 都可以返回值,返回值沒有型別限制\個數限制# 不同點: return只能返回一次值,yield卻可以讓函式暫停在某一個位置,可以返回多次值# 小練習# 實現與range一樣的功能,開頭結尾和步長# def my_range(start,stop,step=1):# while start < stop: # yield start # start+=step 二分法 # 二分法是演算法的一種;演算法是將問題簡單化的一種解決方法。## 二分法的應用場景很侷限:當我們有一個有序的序列:從小到大或從大到小;我們需要查詢一個數是否在這個序列中,就可以運用二分法去解決問題。## 二分法模擬成員運算in'''nums = [1, 13, 15, 23, 27, 31, 33, 57, 73, 81, 93, 94, 97, 101] # 從小到大排列的數字列表def binary_search(find_num,nums): print(nums) if len(nums) == 0: print('False') return # 功能 mid_index = len(nums) // 2 if find_num > nums[mid_index]: # in the right nums=nums[mid_index+1:] #nums[x:] 刪除第x列之前的內容 # 重新執行功能,傳入新列表 binary_search(find_num,nums) elif find_num < nums[mid_index]: # in the left nums=nums[:mid_index] # 重新執行功能,傳入新列表 binary_search(find_num,nums) else: print('True')'''