1、迭代器
一、什麼是迭代器?
迭代是一個重複的過程,可是每次重複都是基於上一次重複的結果而繼續
while True:
# print()#這不是迭代,單純的循環
#基於索引的迭代取值
l('a','b','c',)
i=0
while i < len(l):
print(l[i])
i+=1
什麼是迭代器
迭代取值的工具
二、爲何要用迭代器
迭代器
優勢
一、提供一個不依賴索引的迭代取值方式
二、更節省內存
缺點:
一、不如索引取值方便
二、取值是一次性的,只能日後取,沒法預測值的個數
三、如何用迭代器
可跌打的對象:str/list/tuple/dict/set/文件對象
但凡內置有__iter__的方法的對象都稱之爲可迭代對象
迭代器對象:文件對象
既內置有__iter__方法又內置有__next__方法對象都稱之爲迭代器對象
調用可迭代對象__iter__方法,會有一個返回值,該返回值就是內置一個迭代器對象
s='abcdef'
l=['a','b','c']
d={'k1':111,'k2':222,'k3':333}
iter_d=d.__iter__()
try:
print(iter_d.__next__())
print(iter_d.__next__())
print(iter_d.__next__())
print(iter_d.__next__())
except stopIteration:
print('取值完畢')
s='abcdef'
l=['a','b','c']
d={'k1':111,'k2':222,'k3':333}
iter_d=d.__iter__()
while Ture:
try:
v=iter_d.__next__()
print(v)
except StopIteration:
break
for k in d
print(k)
# for 循環的底層原理:
一、調用in後面那個值/對象的_iter_方法,拿到一個迭代器對象iter_obj
二、調用迭代器對象iter_obj._next_()將的到的返回值賦值變量名k,循環往復直到取值完畢拋出異常StopIteration
三、捕捉異常直到結束
2、生成器
生成器就是一種自定義的迭代器
如何的到生成器
但凡函數出現yield關鍵字,再去調用函數不會當即執行函數體代碼,會獲得一個返回值,該返回值就是生成器對象
def func()
print('first')
yield 1
print('second')
yield 2
prind('third')
yield 3
g=func
#print(g)
next(g)
總結yield:
一、提供一種自定義迭代器解決方案
二、yield & return
相同點:均可以返回值,返回值沒有類型限制/個數限制
不一樣點ruturn只能夠返回一個值,yield可讓函數體暫停某一個位置,能夠返回多個值
3、函數遞歸調用與二分法
一、函數的遞歸調用:
在調用一個函數的過程又直接又間接又調用該函數自己,稱之爲遞歸調用
遞歸必須知足兩個條件:
一、每進行下一次遞歸調用,問題的規模都應該有所減小
二、遞歸必須有一個明確的結束條件
遞歸有兩個明確的階段:
一、回溯
二、遞推
如下是沒有意義的的遞歸
def func()
print(1)
print(2)
print(3)
func()
func()
def bar()
print('for bar')
foo()
def foo()
print('for foo')
bar()
foo()
age(5)=age(4)+2
age(4)=age(3)+2
age(3)=age(2)+2
age(2)=age(1)+2
age(1)=18
age(n)=age(n-1)+2 # n > 1
age(1)=18 # n = 1
def age(n):
if n == 1:
return 18
return age(n-1)+2
l = [1, [2, [3, [4, [5, [6, [7, [8, [9, ]]]]]]]]]def func(lists): # 定義函數 for item in lists: # 循環列表 if type(item) is not list: # 判斷值是不是列表 print(item) # 不是則打印 else: func(item) # 是則調用函數循環func(l)nums = [3, 5, 7, 11, 13, 23, 24, 76, 103, 111, 201, 202, 250, 303, 341]find_num = 203for num in nums: # 循環列表 if num == find_num: # 若是值是203 print('find it') break else: print('not exists')nums = [3, 5, 7, 11, 13, 23, 24, 76, 103, 111, 201, 202, 250, 303, 341]def func(listl, find_num): # 定義一個函數,參數爲列表及須要的值 print(listl) if len(listl) == 0: # 當尋找完列表爲空 print('not exists') return mid_index = len(listl) // 2 # 取中間數 if find_num > listl[mid_index]: # 當尋找的值大於中間數 func(listl[mid_index + 1:], find_num) # 調用函數繼續在大於中間數的列表內尋找 elif find_num < listl[mid_index]: # 當尋找的值小於中間數 func(listl[:mid_index], find_num) # 調用函數繼續在小於中間數的列表內尋找 else: # 當尋找值等於中間數 print('find it')func(nums, 202)