1. 程式人生 > >day4 叠代器與生成器解析

day4 叠代器與生成器解析

one chang 內部 spa 後退 str 保存 16px mos

一、叠代器

叠代器是訪問集合元素的一種方式。其實叠代器就是一種列表,只是訪問集合元素的時候比較特殊,具有一些特定功能,記憶功能,能夠記住用戶上一次的狀態。叠代器是訪問集合元素的一種方式。並且,叠代器只能前進,不能後退叠代器對象從集合的第一個元素開始訪問直到所有的元素被訪問完結束

特定:

(1).訪問者不需要關心叠代器內部的文件,僅需通過next()方法不斷去取下一個內容;

  (2).不能隨機訪問集合中的某個值,只能從頭到尾依次訪問;

  (3).訪問到一半時不能往回退

  (4).便於循環比較大的數據集合,節省內存生成一個叠代器。

iter()用來聲明叠代器,示例如下:

names = iter(["alex","sb",11,22,"gengchangxue"])
  print(names.__next__())
  print(names.__next__())
  print(names.__next__())
  print(names.__next__())
  print(names.__next__())
  print(names.__next__())

運行結果如下:

alex
  sb
  11
  22
  gengchangxue
  Traceback (most recent call last):
  File "/home/zhuzhu/day4/iterator.py", line 7, in <module>
   print(names.__next__())
  StopIteration

從上面結果可以看出,叠代器是使用__next__()方法來遍歷集合中的每一個元素,當超過列表的長度的時候會出現錯誤,stoplteration(停止叠代)。上面集合有5個元素,我們去了6次,結果就報錯。叠代器只能從元素的第一個值開始遍歷,直到所有的元素遍歷完為止。中間過程不能後退,也不能取中間某個特定位置的值。

叠代器中只有一個__next__()方法,用來去元素。

二、生成器generator

定義:一個函數調用時返回一個叠代器,那這個函數就叫做生成器(generator),如果函數中包含yield語法,那這個函數就會變成生成器

其實,生成器(generator)函數中包含yield,yield的作用與return作用類似,只是yield結束本地循環之後,記錄程序運行的狀態,能夠保持在當前狀態,當用戶再一次調用的時候,會從這裏開始,重新進行循環,並且,yield能夠返回一個值給函數,並且yield與send結合還能夠接收返回值。

def cash_money(amount):
    while amount > 0:
      amount -= 100
      yield 100
      print("敗家子,又來取錢了!...")


  atm = cash_money(600)

上面我們寫了一個函數,並且調用這個函數,但是print()語句並沒有執行。下面來看看atm的類型:

print(type(atm))

運行如下:

<class ‘generator‘>

可以看出,atm是一個生成器,生成器的調用要使用__next__()方法。實例如下:

def cash_money(amount):
    while amount > 0:
      amount -= 100
      yield 100
      print("敗家子,又來取錢了!...")


  atm = cash_money(600)
  print(atm.__next__())
  print(atm.__next__())

生成器的作用,我們之前學的程序都是串行的,從上到下進行執行,如果中間某個過程沒有執行,那麽會一直等待,但是我們使用yield就能夠保持記憶功能。讓程序其做其他的事情,作用之後在回來繼續做這件事情,比如我們去做一個大保健,做完之後重新回來取錢。

def cash_money(amount):
    while amount > 0:
      amount -= 100
      yield 100
      print("敗家子,又來取錢了!...")


    atm = cash_money(600)
    print(atm.__next__())
    print(atm.__next__())
    print("叫個大保健")
    print(atm.__next__())

運行結果如下:

100
  敗家子,又來取錢了!...
  100
  叫個大保健
  敗家子,又來取錢了!...
  100

yield就是保存函數的狀態,可以讓我們先去完成其他事情,然後繼續執行。生成器在某些時候很有用,比如我們想保存之前用戶的狀態,以便用戶下次登錄能夠知道之前的信息。比如銀行的系統,用戶取錢之後肯定要進行減去金額,並且保存之前操作的狀態。

day4 叠代器與生成器解析