您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“Python怎么實現(xiàn)外部迭代器”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
效果
迭代器簡化了聚合的接口
一般來講,聚合類內(nèi)部實現(xiàn)的不同或多或少都會影響到聚合類的接口,訪問其子元素的接口也是如此。由于設計者經(jīng)驗和能力的限制,經(jīng)常需要增加接口或修改接口。使用迭代器模式之后,聚合類只需要提供取得迭代器的接口,接下來訪問聚合類的子元素的操作都可以通過迭代器來進行,而不需要另外準備其他的訪問子元素接口。另外由于迭代器接口已經(jīng)經(jīng)過了長時間各種情況的考驗,已被證明可以滿足大多數(shù)情況的需求,啥意思啊基本上不再需要聚合類增加其他的訪問方式。
支持在一個聚合上同時發(fā)生多個遍歷操作
迭代器本身可以保存迭代的狀態(tài),一個自然的結(jié)果就是,可以同時對一個內(nèi)聚類進行多個遍歷。這一點在進行某些操作(例如排序)的時候非常有用。
支持以不同的方式遍歷聚合
由于迭代器的實現(xiàn)已經(jīng)獨立于聚合類,只要替換迭代器就可以實現(xiàn)不同方式的遍歷。
實現(xiàn)
外部迭代還是內(nèi)部迭代
外部迭代是指由利用者控制迭代的動作,而內(nèi)部迭代指的是由用戶向迭代器提交操作時由迭代器自動執(zhí)行迭代動作。接下來通過偽代碼來說明這兩種迭代器的區(qū)別。首先是外部迭代器:
Iterator it = Aggregate.CreateInterator();
while(!it.isDone())
{
it.CurrentItem()->dosomething();
it.next();
}
迭代的動作也就是next的調(diào)用由利用者控制。
Iterator it = Aggregate.CreateInterator();
while(!it.isDone())
{
it.CurrentItem()->dosomething();
}
而內(nèi)部迭代器,則會在用戶向迭代器提交操作的時候,自動進行迭代動作。這種方式很方便,但是方便的另一面就是不夠靈活,更不要說這種方便的好處很有限。因此大部分情況下,使用外部迭代器就好。
誰來實現(xiàn)迭代動作
這里有幾個選擇。一個是由迭代器來實現(xiàn),這種情況下需要迭代器了解聚合類的內(nèi)部結(jié)構(gòu),一定程度上破壞了封裝性。另一個選擇是由聚合類實現(xiàn)迭代動作,而迭代器只負責保存迭代的當前位置,這種方式的迭代器也被稱為游標。這種方式也有一個問題那就是不夠靈活,增加或者調(diào)整迭代算法都需要對聚合類進行修改。在實際的開發(fā)中,也可以使用第三種方法:聚合類提供基本的迭代功能,然后由另外的迭代器提供附加的功能。這些功能通常是對子元素的篩選。
是否需要空迭代器
空迭代器的IsDone方法總是返回true。它的作用是當聚合類沒有下級節(jié)點的時候返回,這樣使用迭代器的代碼可以使用同樣的邏輯處理下級節(jié)點而不需要判斷聚合類是否返回迭代器。這樣代碼看起來更簡潔。
是否需要健壯的迭代器
目前大部分迭代器都不支持在迭代的同時增加和刪除元素。如果程序員真這么做了,一般的結(jié)果就是發(fā)生錯誤。實現(xiàn)這種所謂健壯的迭代器非常困難,所以通常的做法是將處理分為兩步:先迭代檢索操作對象,然后再另行操作。這種方式更容易實現(xiàn)。
“Python怎么實現(xiàn)外部迭代器”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。