day4 叠代器與生成器解析
一、叠代器
叠代器是訪問集合元素的一種方式。其實叠代器就是一種列表,只是訪問集合元素的時候比較特殊,具有一些特定功能,記憶功能,能夠記住用戶上一次的狀態。叠代器是訪問集合元素的一種方式。並且,叠代器只能前進,不能後退。叠代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。
特定:
(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 叠代器與生成器解析