迭代器、生成器、函數的遞歸調用、二分法

一:迭代器ide

  1.什麼是迭代?函數

  迭代是一個重複的過程,可是每次重複都是基於上一次重複的結果而繼續。工具

  下列循環單純重複:spa

        while True:
            print(1)

        # 基於索引的迭代取值
        l=['a','b','c']
        i=0

        while i < len(l):
            print(l[i])
            i+=1
View Code

  2.什麼是迭代器?3d

  迭代器是重複取值的工具code

  3.爲何要用迭代器?對象

  迭代器blog

  優勢:遞歸

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

    2.更節省內存

  缺點:

    1.不如按照索引的取值方式靈活

    2.取值一次性的,只能日後取,沒法預測值的個數

  4.如何用迭代器?

  可迭代的對象: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__()
# print(iter_d)
監測是否執行完畢
try:
    print(iter_d.__next__())
    print(iter_d.__next__())
    print(iter_d.__next__())
    print(iter_d.__next__())
except StopIteration:
    print('取值完畢')
View Code
#while循環
d={'k1':111,'k2':222,'k3':333}
iter_d=d.__iter__()
while True:
    try:
        v=iter_d.__next__()
        print(v)
    except StopIteration:
        break

#for循環
for k in d:
    print(k)
for循環和while循環對比

  for循環的底層原理:

    1.調用in後面的那個值/對象的__iter__方法,拿到一個迭代器對象iter_obj

    2.調用迭代器對象iter_obj.__next__()將獲得的返回值賦值變量名k,循環往復直到取值完畢拋出異常StopIteration

    3.捕捉異常結束循環

二:生成器

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

  如何獲得生成器?

    只要函數內出現yield關鍵字,再去調用函數不會當即執行函數體代碼,會獲得一個返回值,該返回值就是生成器對象,即自定義的迭代器。

  總結yield:

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

    2.yield & return

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

      不一樣點:return只能返回一次值,yield卻能夠讓函數暫停在某一個位置,能夠返回多個值

def my_range(start,stop,step=1):
    while start < stop: # 5 < 5
        yield start # 3
        start+=step #start=5
自定義起始位置的循環取值

三:函數的遞歸調用

  1.函數的遞歸調用:

    在調用一個函數的過程當中又直接或者間接的調用該函數自己,稱之爲遞歸調用

  2.遞歸調用必須知足兩個條件:

    1.每進入下一次遞歸調用,問題的規模都應該有所減小

    2.遞歸必須有一個明確的結束條件

如下遞歸只是單純的重複,沒有意義:

def func():
    print(1)
    print(2)
    print(3)
    func()

func()

def bar():
    print('from bar')
    foo()

def foo():
    print('from foo')
    bar()

foo()
View Code

  3.遞歸有兩個明確的階段:

    1.回溯

    2.遞推

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

print(age(5))
求年齡

四:二分法

  具體以例爲證:

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
    mid_index=len(list1) // 2
    if find_num > list1[mid_index]:
        # in the right
        binary_search(list1[mid_index + 1:],find_num)
    elif find_num < list1[mid_index]:
        # in the left
        binary_search(list1[:mid_index],find_num)
    else:
        print('find it')

binary_search(nums,201)
查找數字201
相關文章
相關標籤/搜索