一、迭代器
1.什麼是迭代
迭代就是重複一個過程,但不是單純的重複,每一次的重複都是基於上次重複的結果。
例如:
l=[1,2,3]
count=0
while True:
if count<len(l):
print(l[count])
count+=1
以上每次迭代的結果都是下一次迭代的初始值。
2.迭代器
2.1 什麼是迭代器:
迭代取值的工具
2.2 爲什麼要用迭代器:
優點:
1.提供一種不依賴索引的迭代取值方式
2.更節省內存空間
缺點:
1.不如索引的取值方式靈活
2.取值一次性,只能往後取,無法預測值的個數
2.3 如何用迭代器:
2.3可迭代的對象:
str、list、tuple、dict、set、file
但凡內置有__iter__方法的都稱之爲可迭代的對象
2.4迭代器對象:file
既內置有__iter__方法又內置有__next__方法的對象都稱之爲迭代器對象
調用迭代器對象下__iter__方法,會有一個返回值,返回值就是內置的迭代器對象本身
2.4 for循環底層原理
1.調用in後面那個值/對象的__iter__方法,拿到一個迭代器對象iter_obj
2.調用迭代器對象iter_obj.__next__()將得到的返回值賦值變量名k,循環往復直到拋出異常StopIteration
3.捕捉異常結束循環
二、生成器
1.什麼是生成器
生成器就是一種自定義的迭代器
2.如何得到生成器
但凡函數內出現yield關鍵字,再調用函數不會立刻執行函數體代碼,會得到一個返回值,該返回值就是生成器對象
3.總結yield
1.提供了一種自定義迭代器的解決方案
2.yield&return
相同點:都可以返回值,返回值沒有類型限制
不同點:return只能返回一次值,yield卻可以讓函數暫停在某個位置,返回多次值
比如利用生成器代替range:
def func(start,end,steps):
while start < end:
yield start
start += steps
for i in func(1,5,2):
print(i)
三、函數的遞歸調用與二分法
1.什麼是遞歸調用
在調用一個函數的過程中又調用該函數本身,稱之爲遞歸調用
遞歸調用必須滿足兩個條件:
1.每進入下一次遞歸調用,問題的規模都應該有所減少
2.遞歸必須有一個明確的條件
遞歸有兩個明確的階段:
1.回溯
2.遞推
例如:
l=[1,[2,[3,[4,[5,[6,[7]]]]]]]
def func(list1):
for item in list1:
if type(item) is not list:
print(item)
else:
func(item)
func(l)
2.二分法
從中間一分爲二的方法,當數據量很大適宜採用該方法,但數據需是排好序的。
例如:
二分法類似in的用法:
num=[3,5,7,11,13,23,24,76,103,111,201,202,250,303,341]
def func(n,num):
if len(num) == 0:
print('no')
return
erfen = len(num) // 2
if n < num[erfen]:
num = num[ :erfen]
func(n,num)
elif n > num[erfen]:
num = num[erfen+1: ]
func(n,num)
else:
print('find')
func(23,num)