迭代器、生成器、函數遞歸與二分法

 

一、迭代器


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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章