迭代器,生成器,函式遞迴呼叫與二分法

2022-08-28 13:45:20 字數 2677 閱讀 6847

1、什麼是迭代器?

什麼是迭代?

迭代是乙個重複的過程,但每次重複都是基於上次重複的結果而繼續

什麼是迭代器?

迭代取值的工具

2、為什麼要用迭代器?

迭代器優點:

​   1.提供了一種不依賴於索引的迭代取值方式

​   2.更節省記憶體

缺點:​   1.不能按照索引的取值方式靈活取值

​   2.取值是一次性的,只能往後取,無法**值的個數

3、如何用迭代器

可迭代的物件:str\list\tuple\dict\set\檔案物件

​   但凡內建有__iter__方法的物件都可以稱之為可迭代物件

迭代器對像:檔案物件

​   既內建有__iter__方法又內建有__next__方法的物件稱之為迭代器物件

呼叫可迭代物件__iter__方法,會有乙個返回值,改返回值就是內建的迭代器物件

d=iter_d=d.__iter__()

while true:

try:

v=iter_d.__next__()

print(v)

except stopiteration:

break

try execpt 檢測異常

可以直接用for迴圈:

for k in d:

print(k)

for迴圈的底層原理:

1.呼叫in後面那個值/物件的 __iter__方法,拿到乙個迭代器物件iter_obj

2.呼叫迭代器物件iter_obj.__next__()將得到的返回值賦值變數名k,迴圈往復直到取值完畢丟擲異常stopiteration

3.捕捉異常結束迴圈

以後用:

iter_d=iter(d)

print(next(iter_d))

二、生成器

生成器是一種自定義的迭代器

如何得到生成器?

但凡函式內出現yield關鍵字,再去呼叫函式不會立即執行函式體**,會得到乙個返回值,該返回值就是生成器物件,既自定義的迭代器

return只能返回一次值,yield可以返回多次值

def func():

print('first')

yield 1

print('second')

yield 2

print('third')

yield 3

g=func()

res1=next(g)

print(res1)

res2=next(g)

print(res2)

res3=next(g)

print(res3)

nex(g)

總結yield

1.提供一種自定義迭代器的解決方案

2.yield&return

相同點:都可以返回值,返回值沒有型別限制\個數限制

不同點:return只能返回一次值,yield卻可以讓函式暫停在某乙個位置,可以返回多次值

自己寫乙個可以造無窮個值的range功能

def my_range(start,stop,step):

while true:

if start三、函式遞迴呼叫與二分法

1.函式的遞迴呼叫

在呼叫乙個函式的過程又直接或者間接地呼叫了該函式的本身,稱之為遞迴函式

遞迴函式滿足兩個條件:

1.沒進入下一次遞迴呼叫,問題的規模都應該有所減少

2.遞迴必須有乙個明確的結束條件

遞迴有兩個明確的階段:

1.回溯

2.遞推

def age(n):

if n == 1:

return 18

else:

return age(n-1)+2

print(age(5))

l=[1,[2,[3,[4,[5,[6,[7,[8,[9,]]]]]]]]]

def func(list1):

for item in list1:

if type(item) is not list:

print(item)

else:

func(item)

func(l)

2.二分法

nums=[3,5,7,11,13,23,24,76,103,111,201,202,250,303,341]

def binary_search(list1,find_num):

print(list1)

if len(list1) == 0:

print('not exist')

return #結束迴圈用break,結束函式要用return

mid_index = len(list1)//2

if find_num >list1[mid_index]:

binary_search(list1[mid_index+1:],find_num)

elif find_num < list1[mid_index]:

binary_search(list1[:mid_index], find_num)

else:

print('find it')

binary_search(nums,205)

二分法是演算法的一種,用來解決查詢的問題

演算法:如何高效解決問題的方法

演算法都是用解決固定的問題

迭代器 生成器與遞迴呼叫

1.迭代器 迭代器是迴圈取值的工具。2.迭代器的有點與作用 1.迭代器提供一種不依賴索引的取值方式。2.迭代器能夠節省記憶體。3.迭代器的使用 1.可迭代物件 但凡內建有 iter 方法的物件,都稱之為可迭代物件。如 字串 字典 元組 列表 集合 檔案 2.迭代器物件 但凡內建有 ister 和 n...

生成器 迭代器 遞迴

27 生成器 1 def f1 print 123 yield 1 yield 2 yield 3 ret f1 ret.next 進入函式找到yield 獲取yield 後面的資料。1231 ret.next 進入函式找到yield 獲取yield 後面的資料。2 ret.next 進入函式找到y...

函式 生成器 迭代器

1.函式 1 函式的好處就是能將固定功能的模組封裝起來,在需要多次實現這個功能的時候就呼叫函式避免 的重複書寫,過於冗長 2 傳參 依次往後放這是規定 num,args,a 2,kwargs 中間兩個交換位置不影響 位置引數 引數關鍵字引數 引數 3 返回值函式執行沒遇到return返回值一定為no...