你們好,咱們的git專題已經更新結束了,因此開始繼續給你們寫一點設計模式的內容。git
今天給你們介紹的設計模式很是簡單,叫作iterator,也就是迭代器模式。迭代器是Python語言當中一個很是重要的內容,藉助迭代器咱們能夠很方便地實現不少複雜的功能。在深度學習當中,數據的獲取每每也是經過迭代器實現的。所以這部分的內容很是重要,推薦你們必定要掌握。web
在開始介紹設計模式以前,咱們先來看一個簡單的需求。假設如今咱們須要根據傳入的變量獲取每週的前幾天,好比說咱們傳入3返回的就是[Mon, Tue, Wed],咱們傳入5返回[Mon, Tue, Wed, Thu, Fri]。這個需求你們應該都能理解,很是很是簡單。設計模式
若是用一個函數來實現的話,就是這樣:網絡
def return_days(n):
week = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
return week[:n]
你看三行代碼就實現了,在這個問題場景當中這樣寫固然是沒有問題。但假如咱們把題目稍微變一變,這裏的week不是一個固定的數據,而是從上游或者是某個文件當中讀取的。這裏的n也是一個很大的數,咱們把這個函數改寫成這樣:app
def get_data(n):
data = []
for i in range(n):
data.append(get_from_upstream())
return data
咱們假設get_from_upstream這個函數當中實現了獲取數據的具體邏輯,那麼上面這一段函數有一個什麼問題?編輯器
有些同窗會說這沒有問題啊,由於像是其餘語言實現數據獲取的時候也都是這麼幹的。的確,像是Java等語言可能都是這麼幹的。可是其餘語言這麼幹沒錯,不表明Python這麼幹也沒錯。由於咱們沒有把Python的能力發揮到最大。函數
這裏有兩個問題,第一個問題是延遲,由於前面說了,n是一個很大的數。咱們從上游獲取數據,不管是經過網絡仍是文件讀取,本質上都是IO操做,IO操做的延遲是很是大的。那麼咱們把這n條數據所有蒐集完可能須要很長的時間,致使下游的漫長等待。第二個問題就是內存,由於咱們存儲了這n條數據一塊兒返回的,若是n很大,對於內存的開銷壓力也很大,若是機器內存不夠頗有可能致使崩潰。學習
那怎麼解決呢?url
其實解決的方法很簡單,若是對迭代器熟悉的話,會發現迭代器針對的偏偏是這兩個問題。咱們把上面的邏輯改寫成迭代器實現便可,這也就是iterator模式。spa
iterator模式嚴格提及來其實只是迭代器的一種應用,它很是巧妙地將迭代器與匿名函數結合在一塊兒,裏面也沒有太多的門道能夠說,咱們把剛纔的代碼改寫一下,細節都在代碼當中。
def get_data(n):
for i in range(n):
yield get_from_upstream()
data_10 = lambda: get_data(10)
data_100 = lambda: get_data(100)
# use
for d in data_10:
print(d)
很簡單吧,但可能你要問了,咱們既然寫出了get_data這個迭代器,那麼咱們使用的時候直接for d in get_data(10)這樣用不就行了,爲何中間要用匿名函數包一層呢?
道理也很簡單,若是這個數據是咱們本身使用,固然是不必中間包一層的。但若是咱們是傳給下游使用的話,對於下游來講它確定是不但願考慮上游太多的細節的,越簡單越好。因此咱們直接丟一個包裝好的迭代器過去,下游直接call便可。不然的話,下游還須要感知get_data這個函數傳入的參數,顯然是不夠合理的。
今天的文章就到這裏,衷心祝願你們天天都有所收穫。若是還喜歡今天的內容的話,請來一個三連支持吧~(點贊、關注、轉發)