高頻彩開獎導航網 > 嵌入式技術 > 編程語言及工具 > 正文

平安彩票高频彩直播网

2020年11月23日 13:10 ? 次閱讀

在軟件開發領域中,人們經常會用到這一個概念——“設計模式”(designpattern),它是一種針對軟件設計的共性問題而提出的解決方案。在一本聖經級的書籍《設計模式︰可復用面向對象軟件的基礎》(1991年,DesignPatterns-ElementsofReusableObject-OrientedSoftware)中,它提出了23種設計模式。迭代器模式就是其中的一種,在各種編程語言中都得到了廣泛的應用。

本文將談談Python中的迭代器模式,主要內容︰什麼是迭代器模式、Python如何實現迭代器模式、itertools模塊創建迭代器的方法、其它運用迭代器的場景等等,期待與你共同學習進步。

1、什麼是迭代器模式?

維基百科有如下定義︰

迭代器是一種最簡單也最常見的設計模式。它可以讓用戶透過特定的接口巡訪容器中的每一個元素而不用了解底層的實現。——維基百科

簡單地說,迭代器模式就是一種通用性的可以遍歷容器類型(如序列類型、集合類型等)的實現方式。使用迭代器模式,可以不關心遍歷的對象具體是什麼(如字符串、列表、字典等等),也不需要關心遍歷的實現算法是什麼,它關心的是從容器中遍歷/取出元素的結果。

按遍歷方式劃分,迭代器可分為內部迭代器與外部迭代器,它們的區別在于執行迭代動作與維持迭代狀態的不同。

通常而言,迭代器是一次性的,當迭代過一輪後,再次迭代將獲取不到元素。

2、Python的迭代器模式

由于迭代器模式的使用太常見了,所以大多數編程語言都給常見的容器類型實現了它,例如Java中的CollecTIon,List、Set、Map等。在Java中使用迭代器遍歷List可這麼寫︰

Listlist=newArrayList<>();Iteratoriterator=list.iterator();while(iterator.hasNext()){System.out.println(iterator.next());}

ArrayList類通過自身的iterator()方法獲得一個迭代器iterator,然後由該迭代器實例來落實遍歷過程。

Python當然也應用了迭代器模式,但它的實現思路跟上例卻不太一樣。

首先,Python認為遍歷容器類型並不一定要用到迭代器,因此設計了可迭代對象。

list=[1,2,3,4]foriinlist:print(i,end="")#1234foriinlist:print(i,end="")#1234

上例中的list是可迭代對象(Iterable),但並不是迭代器(雖然在底層實現時用了迭代器的部分思想)。Python抓住了迭代器模式的本質,即是“迭代”,賦予了它極高的地位。

如此設計的好處顯而易見︰(1)寫法簡便,用意直白;(2)可重復迭代,避免一次性迭代器的缺陷;(3)不需要創建迭代器,減少開銷。

可迭代對象可看作是廣義的迭代器,同時,Python也設計了普通意義的狹義的迭代器。

list=[1,2,3,4]it=iter(list)foriinit:print(i,end="")#1234foriinit:print(i,end="")#無輸出

上例中的iter()方法會將可迭代對象變成一個迭代器。從輸出結果可以看出,該迭代器的迭代過程是一次性的。

由此看來,Python其實是將“迭代器模式”一拆為二來實現︰一是可迭代思想,廣泛播種于容器類型的對象中,使它們都可迭代;一是迭代器,一種特殊的可迭代對象,承擔普通意義上的迭代器所特有的迭代任務。

同時,它還提供了將可迭代對象轉化為迭代器的簡易方法,如此安排,真是將迭代器模式的效力發揮到了極致。

(關于可迭代對象與迭代器的更多區別、以及它們的實現原理,請參見《Python進階︰迭代器與迭代器切片》

3、創建迭代器

創建迭代器有如下方式︰
(1)iter()方法,將可迭代對象轉化成迭代器;
(2)__iter__()與__next__()魔術方法,定義類實現這兩個魔術方法;
(3)itertools模塊,使用內置模塊生成迭代器;
(4)其它創建方法,如zip()、map()、enumerate()等等。

四類方法各有適用場所,本節重點介紹itertools模塊。它可以創建三類迭代器︰無限迭代器、有限迭代器與組合迭代器。

3.1無限迭代器

count(start=0,step=1)︰創建一個從start(默認值為0)開始,以step(默認值為1)為步長的的無限整數迭代器。

cycle(iterable)︰對可迭代對象的元素反復執行循環。

repeat(object[,TImes])︰反復生成object至無限,或者到給定的TImes次。

imporTItertoolsco=itertools.count()cy=itertools.cycle('ABC')re=itertools.repeat('A',30)#注意︰請分別執行;以下寫法未加終止判斷,只能按Ctrl+C退出forninco:print(n,end="")#01234......fornincy:print(n,end="")#ABCABCAB......forninre:print(n,end="")#AAAAAAAA....(30個)

3.2有限迭代器


以上方法,比較常用的有︰chain()將多個可迭代對象(可以是不同類型)連接成一個大迭代器;compress()方法根據真假過濾器篩選元素;groupby()把迭代器中相鄰的重復元素挑出來放在一起;islice()方法返回迭代器切片(用法參見《Python進階︰迭代器與迭代器切片》);tee()方法根據可迭代對象創建n個(默認2個)迭代器副本。

forcinitertools.chain('ABC',[1,2,3]):print(c,end="")#輸出結果︰ABC123forcinitertools.compress('ABCDEF',[1,1,0,1,0,1]):print(c,end="")#輸出結果︰ABDFforkey,groupinitertools.groupby('aaabbbaaccd'):print(key,':',list(group))#輸出結果︰a:['a','a','a']b:['b','b','b']a:['a','a']c:['c','c']d:['d']itertools.tee('abc',3)#輸出結果︰(,,)

3.3組合迭代器

product()︰求解多個可迭代對象的笛卡爾積。

permutations()︰求解可迭代對象的元素的排列。

combinations()︰求解可迭代對象的元素的組合。

foriinitertools.product('ABC',[1,2]):print(i,end="")#輸出結果︰('A',1)('A',2)('B',1)('B',2)('C',1)('C',2)foriinitertools.permutations('ABC',2):print(i,end="")#輸出結果︰('A','B')('A','C')('B','A')('B','C')('C','A')('C','B')foriinitertools.combinations('ABC',2):print(i,end="")#輸出結果︰('A','B')('A','C')('B','C')foriinitertools.combinations('ABCD',3):print(i,end="")#輸出結果︰('A','B','C')('A','B','D')('A','C','D')('B','C','D')

4、強大的內置迭代器方法

迭代器模式的使用場景實在太普遍了,而Python也為迭代器的順利使用而提供了很多便利的條件,本節將介紹相關的幾個內置方法。這些方法非常常用而且強大,是Python進階的必會內容。

4.1zip()方法

zip()方法可以同時迭代多個序列,並各取一個元素,生成一個可返回元組的迭代器。此迭代器的長度以較短序列的長度保持一致,若想生成較長序列的長度,需要使用itertools模塊的zip_longest()方法。

importitertoolsa=[1,2,3]b=['w','x','y','z']foriinzip(a,b):print(i,end="")#(1,'w')(2,'x')(3,'y')#空缺值以None填補foriinitertools.zip_longest(a,b):print(i,end="")#(1,'w')(2,'x')(3,'y')(None,'z')

4.2enumerate()方法

enumerate()方法接收一個序列類型參數,生成一個可返回元組的迭代器,元組內容是下標及其對應的元素值。它還可接收一個可選參數,指定下標的起始值,默認是0。

注意︰眾所周知,Python中序列的索引值從0開始,但是,enumerate()可以達到改變起始索引數值的效果。

seasons=['Spring','Summer','Fall','Winter']foriinenumerate(seasons):print(i,end="")#輸出結果︰(0,'Spring')(1,'Summer')(2,'Fall')(3,'Winter')foriinenumerate(seasons,start=7):print(i,end="")#輸出結果︰(7,'Spring')(8,'Summer')(9,'Fall')(10,'Winter')

4.3map()方法

map()方法的參數是一個函數及一個或多個可迭代對象,它會將可迭代對象的元素映射到該函數中,然後迭代地運行該函數,返回結果也是一個迭代器。當存在多個可迭代對象參數時,迭代長度等于較短對象的長度。

defsquare(x):returnx**2l=map(square,[1,2,3,4,5])print(list(l))#輸出結果︰[1,4,9,16,25]m=map(lambdax,y:x+y,[1,3,5,7,9],[2,4,6,8,10,2])print(list(m))#輸出結果︰[3,7,11,15,19]

4.4filter()方法

filter()方法的參數是一個判斷函數及一個可迭代對象,遍歷可迭代對象執行判斷函數,過濾下判斷為True的元素,與它相對,若想保留判斷為False的元素,可使用itertoole模塊的filterfalse()方法。

importitertoolsfi=filter(lambdax:x%2,range(10))ff=itertools.filterfalse(lambdax:x%2,range(10))foriinfi:print(i,end="")#輸出結果︰13579foriinff:print(i,end="")#輸出結果︰02468

5.小結

迭代器模式幾乎是23種設計模式中最常用的設計模式,本文主要介紹了Python是如何運用迭代器模式,並介紹了itertools模塊生成迭代器的18種方法,以及5種生成迭代器的內置方法。

編輯︰hfy


下載發燒友APP

打造屬于您的人脈電子圈

關注高頻彩開獎導航微信

有趣有料的資訊及技術干貨

關注發燒友課堂

鎖定最新課程活動及技術直播

高頻彩開獎導航觀察

一線報道 ? 深度觀察 ? 最新資訊
人收藏
分享︰

平安彩票高频彩直播网

相關推薦

發表于 2019-04-09 00:00? 0次閱讀

零基礎Python入門教程二

系統全面的介紹Sublime Text

Sublime Text 官方網站 提供了 Sublime Text 各系統各版本的下載,目前Sub....
發表于 2020-11-23 11:33? 34次閱讀
系統全面的介紹Sublime Text

Java第二名的位置已經被Python取代了

有人說Python的流行和數據挖掘、人工智能數值計算等領域的蓬勃發展息息相關,但是,TIOBE CE....
發表于 2020-11-23 11:12? 81次閱讀
Java第二名的位置已經被Python取代了

未來人工智能的人才在全球都是香餑餑

近日,國家工業信息安全發展研究中心發布了《人工智能與制造業融合發展白皮書2020》。白皮書指出,人工....
發表于 2020-11-23 09:35? 196次閱讀
未來人工智能的人才在全球都是香餑餑

C#良好兼容了值類型/引用類型

反觀歷史,C#也曾經因為 值類型/引用類型 保守詬病,“拆箱”和“裝箱”一直是個招黑的設計。但後來我....
發表于 2020-11-20 10:14? 92次閱讀
C#良好兼容了值類型/引用類型

Python逐漸失去魅力

自從20世紀90年代初發布以來,Python一直相當火爆,在這二十多年里,它的流行程度遠遠超過了C、....
發表于 2020-11-19 11:05? 203次閱讀
Python逐漸失去魅力

Python20年來首次超越Java

根據 2020 年 11 月最新出爐的 TIOBE 編程語言排行榜,Python 以 12.12% ....
發表于 2020-11-16 11:28? 301次閱讀
python文件的操作步驟
發表于 2020-11-16 07:53? 0次閱讀
刪除字符串中的空白︰ 在程序中,額外的空白可能令人迷惑。對程序員來說,'python' 和'python ' 看起來幾乎沒什麼...
發表于 2020-11-14 11:24? 404次閱讀
將python3.7版本環境(圖中前兩個)上移到最上層,用戶變量和系統變量都要調。...
發表于 2020-11-14 00:03? 101次閱讀
出現ImportError: No module named PyQt4.QtGui的解決方法

Python 之父正式加入微軟

11月13日消息 去年 10 月, Python 創始人 Guido van Rossum 在 Dr....
發表于 2020-11-13 17:39? 349次閱讀
一直想在kindle電子書屏幕上作為樹莓派或者maaxboard開發板的顯示器,刷新速度雖然慢,但是編程調試夠用。 之前了解...
發表于 2020-11-13 15:09? 303次閱讀
【MaaXBoard開發板試用體驗】十運行python程序建立web網站

Python 創始人復出 宣布已加入微軟開發者部...

去年 10 月, Python 創始人 Guido van Rossum 在 Dropbox 公司工....
發表于 2020-11-13 11:41? 272次閱讀
Python 創始人復出 宣布已加入微軟開發者部...

人工智能行業,編程學習是Python還是C++好...

很多想要進入人工智能行業的開發者都會糾結于學習Python還是學習C++。有些人認為,Python目....
發表于 2020-11-13 09:29? 306次閱讀
字符串拼接 在編碼的過程很多時候都會用到字符串的拼接,例如,你可能想將姓和名存儲在不同的變量中,等要顯示姓名時...
發表于 2020-11-11 15:30? 303次閱讀
零基礎學python_03_字符串(拼接+換行+制表符)

不再低調,QuecPython橫空出世

移遠通信正式推出一套輕松上手、功能完善的嵌入式操作系統——QuecPython,可讓客戶基于移遠模組....
發表于 2020-11-11 11:49? 556次閱讀
用Python給頭像添加國旗的方法
發表于 2020-11-11 08:02? 0次閱讀
python小案例demo01
發表于 2020-11-10 07:18? 0次閱讀
求python小案例demo01?

Python仍是人工智能和機器學習的主導編程語言...

上世紀90年代初,Python面世了。近30年來,關于它的“炒作”一直沒有少過。當然,編程界花了至少....
發表于 2020-11-09 14:30? 475次閱讀
Python中的類方法、實例方法和靜態方法
發表于 2020-11-09 07:13? 0次閱讀
請問Python中的類方法、實例方法和靜態方法是什麼?

最新的編程語言排行說明Python沖上第二

本月的排行榜出現了自 TIOBE 榜單發布以來,近二十年從未見過的變化︰前兩名的位置首次出現了一個除....
發表于 2020-11-07 10:54? 389次閱讀
最新的編程語言排行說明Python沖上第二

怎樣使用Python創建詞雲

介紹從開始從事數據可視化工作的那一天起,我就愛上它了,我總是喜歡從數據中獲得有用的見解。在此之前,我....
發表于 2020-11-06 17:26? 311次閱讀
這是一本非常基礎的 AI 入門書籍。AI 的與會比傳統IT(信息)有趣的地方是,當今 AI 的基礎是︰機器學習(Machi...
發表于 2020-11-06 17:25? 909次閱讀
vlookup函數功能非常強大,那在Python中如何實現?...
發表于 2020-11-06 06:11? 0次閱讀
請問Python中如何實現vlookup函數的功能?

Python3.9的新特性必知圖

Python3.9,「千呼萬喚始出來」。 先來速看下此次發布版本的重點。 新語法特性︰ PEP 58....
發表于 2020-11-05 15:33? 347次閱讀
Python3.9的新特性必知圖

Python 在未來十年內仍是機器學習的首選語言

愚者多怨,仁者不言,生活中就是會有很多愛唱反調的人,但不管怎麼說Python 在接下來十年仍然會很重....
發表于 2020-11-05 14:38? 315次閱讀
Python 在未來十年內仍是機器學習的首選語言

能夠指揮AI機器的編程網紅Python,被譽為“...

在這樣的背景之下,我國也非常重視Python的教育︰浙江已經把Python列為中學生必修項目;山東、....
發表于 2020-11-05 14:09? 530次閱讀
能夠指揮AI機器的編程網紅Python,被譽為“...

20年來首次︰Java被編程語言 Python超...

日前,TIOBE公布了最新一期的編程語言排行榜(11月)。 接近20年來的首次,Java和C沒有分享....
發表于 2020-11-05 13:28? 321次閱讀
20年來首次︰Java被編程語言 Python超...

20年來首次。Java掉出全球最受歡迎的兩大編程...

日前,TIOBE公布了最新一期的編程語言排行榜(11月)。接近20年來的首次,Java和C沒有分享前....
發表于 2020-11-05 12:11? 214次閱讀
20年來首次。Java掉出全球最受歡迎的兩大編程...

如何利用Python判斷統計每個月天數源

如何利用Python判斷統計每個月天數源。在日常的學習或是工作中會經常遇到需要統計日期數據的情況。特....
發表于 2020-11-02 09:41? 362次閱讀
如何利用Python判斷統計每個月天數源

如何基于 ES6 的 JavaScript 進行...

TensorFlow.js 是 TensorFlow 的 JavaScript 版本,支持 GPU ....
發表于 2020-10-31 11:16? 586次閱讀
如何基于 ES6 的 JavaScript 進行...

在Python中實現異步編程(附源碼)

異步編程是並行編程的一種方式。單個工作單元獨立于主應用程序線程運行,並通知調用線程其完成、失敗情況或....
發表于 2020-10-27 14:36? 372次閱讀
在Python中實現異步編程(附源碼)

世界上最深奧的編程語言有哪些

當我們談論 c,c++ ,Java,Python的時候,有些語言不僅很難,而且對于大多數軟件開發者來....
發表于 2020-10-25 10:13? 331次閱讀
世界上最深奧的編程語言有哪些

TIOBE已公布2020年10月的編程語言排行榜

Python從去年開始就已經登上了TIOBE榜單的第三位,但它的受歡迎程度一直在上升,本月,該指數達....
發表于 2020-10-23 10:41? 5874次閱讀
TIOBE已公布2020年10月的編程語言排行榜

Python受歡迎程度直上升 即將超過Java

來自︰程序猿(ID︰imkuqin) TIOBE已公布2020年10月的編程語言排行榜。C語言依然排....
發表于 2020-10-23 10:41? 406次閱讀
Python受歡迎程度直上升 即將超過Java

Go為什麼是2020年最受歡迎的語言?

在接下來的幾年中,Python無疑還將繼續在這些領域佔據主導地位。但是,與一些新興語言相比,它存在一....
發表于 2020-10-23 10:37? 365次閱讀
Go為什麼是2020年最受歡迎的語言?

STM32的backtrace深度講解(cort...

STM32上的backtrace原理與分析 1.說明 2.cortex-m上的棧布局 2.1 cor....
發表于 2020-10-22 15:13? 595次閱讀
STM32的backtrace深度講解(cort...

2020年10月編程語言排行榜︰Python即將...

來源︰菜鳥教程 TIOBE 2020 年 10 月份的編程語言排行榜已經公布,官方的標題是︰Pyth....
發表于 2020-10-19 11:37? 529次閱讀
2020年10月編程語言排行榜︰Python即將...

為什麼一定要學Python 答案太扎心了

今年秋招太難了。畢業生們紛紛表示心酸︰ 投了100份簡歷,面試邀請為0;別說大公司了,就連名不見經傳....
發表于 2020-10-13 17:36? 358次閱讀
為什麼一定要學Python  答案太扎心了

集中討論谷歌、亞馬遜等技術巨頭使用Python開...

十年前,由于編程語言種類匱乏,開發人員不必苦惱自己應該選擇哪一種編程語言;但是現在,世界上正在使用的....
發表于 2020-10-11 09:51? 556次閱讀
集中討論谷歌、亞馬遜等技術巨頭使用Python開...

Python編程已經走進中小學課堂

在編程世界,關于哪個語言是最好的爭論從未停止,雖然道理誰也不服誰,但是關于編程的熱度,我們可以從TI....
發表于 2020-10-10 17:10? 404次閱讀
Python編程已經走進中小學課堂

如何系統型的學習深度學習?

更要命的是,我發現我一直都是在寫算法,從沒考慮過如何部署模型,也就是整天紙上談兵。所以我最近開始學網....
發表于 2020-10-10 10:39? 373次閱讀
如何系統型的學習深度學習?