1. 程式人生 > >三元表示式 ,迭代器, 生成器,二分法

三元表示式 ,迭代器, 生成器,二分法

三元表示式

# 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')
'''