2020年9月13日星期日

005 零基礎入門學習Python 第5章 清單、元組合字串

申明本站飛宇網 https://feiyetopro.blogspot.com/自網路收集整理之書籍文章影音僅供預覽交流學習研究,其[書籍、文章、影音]情節內容, 評論屬其個人行為, 與本網站無關。版權歸原作者和出版社所有,請在下載 24 小時內刪除,不得用作商業用途;如果您喜歡其作品,請支持訂閱購買[正版]謝謝!



5章 清單、元組合字串

5.1 列表:一個打了激素的陣列
有時候需要把一堆東西暫時存儲起來,因為它們有某種直接或者間接的聯繫,需要把它們放在某種或者集合中,因為將來可能用得上。很多接觸過程式設計的朋友都知道或者聽說過陣列。陣列這個概念呢,就是把一大堆同種類型的資料挨個兒擺在一塊兒,然後通過陣列下標進行索引。但陣列有一個基本要求,就是你所放在一起的資料必須類型一致。由於Python的變數沒有資料類型,也就是說,Python是沒有陣列的。但是呢,Python加入了更為強大的列表。
Python的列表有多強大?如果把陣列比作是一個集裝箱的話,那麼Python的列表就是一個工廠的倉庫了。清單真的非常有用,基本上所有的Python程式都要使用到清單,包括之前的打飛機遊戲,裡邊的小飛機可以全部扔到一個清單中統一管理。

5.1.1 創建列表
創建清單和創建普通變數一樣,用中括弧括起一堆資料就可以了,資料之間用逗號隔開,這樣一個普普通通的列表就創建成功了:
我們說清單是打了激素的陣列不是沒有道理的,可以創建一個魚龍混雜的列表:
可以看到上邊這個清單裡有整型、字串、浮點型資料,甚至還可以包含著另一個列表。當然,如果實在想不到要往清單裡邊塞什麼資料的時候,可以先創建一個空列表:

5.1.2 向清單添加元素
清單相當靈活,所以它的內容不可能總是固定的,現在就來教大家如何向清單添加元素吧。要向清單添加元素,可以使用append()方法:
可以看到,參數6已經被添加到列表number的末尾了。有讀者可能會問,這個方法調用怎麼跟平時的BIF內置函式呼叫不一樣呢?嗯,因為append()不是一個BIF,它是屬於清單物件的一個方法。
中間這個“.”,大家暫時可以理解為範圍的意思:append()這個方法是屬於一個叫作number的清單物件的。關於物件的知識,咱暫時只需要理解這麼多,後邊再給大家介紹物件。同理,我們可以把數字78添加進去,但是我們發現似乎不能用append()同時添加多個元素:
這時候就可以使用extend()方法向清單末尾添加多個元素:
哎呀,怎麼又報錯了呢?!嗯,其實小甲魚是故意的。extend()方法事實上使用一個列表來擴展另一個列表,所以它的參數應該是一個列表:
好,我們又再一次向世界證明我們成功了!但是又發現了一個問題,到目前為止,我們都是往清單的末尾添加資料,那如果我想插隊呢?
當然沒問題,想要往清單的任意位置插入元素,就要使用insert()方法。insert()方法有兩個參數:第一個參數代表在列表中的位置,第二個參數是在這個位置處插入一個元素。不妨來試一下,讓數字0出現在清單number的最前邊:
等等,不是說好插入到第一個位置嗎?怎麼插入後0還是排在1的後邊呢?其實是這樣的:凡是順序索引,Python均從0開始,同時這也是大多數程式設計語言約定俗成的規範。那麼大家知道為什麼要用0來表示第一個數嗎?
是因為電腦本身就是二進位的,在二進位的世界裡只有兩個數:01,當然,0就是二進位裡的第一個數了,所以嘛,秉承著這樣的傳統,0也就習慣用於表示第一個數。所以,正確的做法應該是:

5.1.3 從清單中獲取元素
跟陣列一樣,可以通過元素的索引值(index)從清單獲取單個元素,注意,清單索引值是從0開始的:
那按照這個方法讓李狗蛋鴨蛋的位置互調:

5.1.4 從清單刪除元素
從清單刪除元素,這裡也介紹三種方法:remove()delpop()。先演示一下用remove()刪除元素:
使用remove()刪除元素,你並不需要知道這個元素在清單中的具體位置,只需要知道該元素存在清單中就可以了。如果要刪除的東西根本不在清單中,程式就會報錯:
remove()方法並不能指定刪除某個位置的元素,這時就要用del來實現:
注意,del是一個語句,不是一個列表的方法,所以你不必在它後邊加上小括弧()。另外,如果你想刪除整個列表,還可以直接用del加列表名刪除:
最後,演示用pop()方法彈出元素:
大家看到了,pop()方法默認是彈出清單中的最後一個元素。但這個pop()方法其實還可以靈活運用,當你為它加上一個索引值作為參數的時候,它會彈出這個索引值對應的元素:

5.1.5 列表分片
利用索引值,每次可以從清單獲取一個元素,但是人總是貪心的,如果需要一次性獲取多個元素,有沒有辦法實現呢?利用列表分片(slice),可以方便地實現這個要求:
很簡單對吧?只不過是用一個冒號隔開兩個索引值,左邊是開始位置,右邊是結束位置。這裡要注意的一點是,結束位置上的元素是不包含的。利用清單分片,得到一個原來清單的拷貝,原來清單並沒有發生改變。
列表分片也可以簡寫,我們說過Python就是以簡潔聞名於世,所以你能想到的便捷方案Python的作者以及Python社區的小夥伴們都已經想到了,並付諸實踐,你要做的就是驗證一下是否可行:
如果沒有開始位置,Python會默認開始位置是0。同樣道理,如果要得到從指定索引值到清單末尾的所有元素,把結束位置省去即可。如果沒有放入任何索引值,而只有一個冒號,將得到整個清單的拷貝。
再一次強調:清單分片就是建立原清單的一個拷貝(或者說副本),所以如果你想對列表做出某些修改,但同時還想保持原來的那個列表,那麼直接使用分片的方法來獲取拷貝就很方便了。

5.1.6 列表分片的進階玩法
分片操作實際上還可以接收第三個參數,其代表的是步長,預設情況下(不指定它的時候)該值為1,來試試將其改成2會有什麼效果?
如果將步長改成2,那麼每前進兩個元素才取一個出來。其實還可以直接寫成list1[::2]。如果步長的值是負數,例如-1,結果會怎樣呢?不妨試試看:
是不是很有意思?這裡步長設置為-1,就相當於複製一個反轉的列表。

5.1.7 一些常用操作符
此前學過的大多數操作符都可以運用到列表上:
我們發現列表還是挺聰明的,竟然會懂得比較大小。那如果清單中不止一個元素呢?結果又會如何?
怎麼會這樣?list1列表的和是123+456=579,按理應該比list2列表的和234+123=357要大,為什麼list1>list2還會返回False呢?
思考片刻後得出結論:Python的列表原來並沒有我們想像中那麼智慧(注:在後邊講魔法方法的章節會教大家如何把列表改變得更加聰明),當清單包含多個元素的時候,預設是從第一個元素開始比較,只要有一個PK贏了,就算整個列表贏了。字串比較也是同樣的道理(字串比較的是第一個字元對應的ASCII碼值的大小)。
我們知道字串可以用加號(+)來進行拼接,用乘號(*)來複製自身若干次。它們在列表身上也是可以實現的:
加號(+)也叫連接操作符,它允許我們把多個清單物件合併在一起,其實就相當於extend()方法實現的效果。一般情況下建議大家使用extend()方法來擴展列表,因為這樣顯得更為規範和專業。另外,連接操作符並不能實現清單添加新元素的操作:
所以如果要添加一個元素到清單中,用什麼方法?嗯,可以用append()或者insert()方法,希望大家還記得。乘號(*)也叫重複操作符,重複操作符可以用於列表中:
當然複合設定運算子也可以用於列表:
另外有個成員關係操作符大家也不陌生,我們是在談for迴圈的時候認識它的,成員關係操作符就是innot in
之前說過列表裡邊可以包含另一個列表,那麼對於清單中的清單元素,能不能使用innot in測試呢?試試便知:
可見,innot in只能判斷一個層次的成員關係,這跟breakcontinue語句只能作用於一個層次的迴圈是一個道理。那要判斷清單裡邊的清單的元素,應該先進入一層列表:
順便說一下,前面提到使用索引號去訪問清單中的值,那麼對於列表中的列表,應該如何訪問呢?
大家應該猜到了,其實跟C語言訪問二維陣列的方法相似:

5.1.8 列表的小夥伴們
接下來認識一下清單的小夥伴們,那麼列表有多少小夥伴呢?不妨讓Python自己告訴我們:
產生了一個熟悉又陌生的列表,很多熟悉的方法似曾相識,例如append()extend()insert()pop()remove()都是學過的。現在再給大家介紹幾個常用的方法。
count()這個方法的作用是計算它的參數在列表中出現的次數:
index()這個方法會返回它的參數在列表中的位置:
可以看到,這裡是返回第一個目標(1)在list1中的位置,index()方法還有兩個參數,用於限定查找的範圍。因此可以這樣查找第二個目標在list1的位置:
reverse()方法的作用是將整個列表原地翻轉,就是排最後的放到最前邊,排最前的放到最後,那麼排倒數第二的就排在第二,以此類推:
sort()這個方法是用指定的方式對清單的成員進行排序,預設不需要參數,從小到大排隊:
那如果需要從大到小排隊呢?很簡單,先調用sort()方法,列表會先從小到大排好隊,然後調用reverse()方法原地翻轉就可以啦。
什麼?太麻煩?好吧,大家真是越來越懶了……很好,大家離天才又近了一步[1]。其實,sort()這個方法其實有三個參數,其形式為sort(func, key, reverse)
funckey參數用於設置排序的演算法和關鍵字,預設是使用歸併排序,演算法問題不在這裡討論,有興趣的朋友可以看一下小甲魚另一本不錯的教程:《資料結構和演算法》(C語言)。這裡要討論sort()方法的第三個參數:reverse,沒錯,就是剛剛學的那個reverse()方法的那個reverse。不過這裡作為sort()的一個默認參數,它的預設值是sort(reverse=False),表示不顛倒順序。因此,只需要把False改為True,列表就相當於從大到小排序:

5.1.9 關於分片拷貝概念的補充
上一節提到使用分片創建清單的拷貝:
看似一樣,對吧?但事實上呢?利用列表的一個小夥伴做以下修改,大家看看差別:
可以看到list1已經從小到大排好了序,那list2list3呢?使用分片方式得到的list2很有原則、很有格調,並不會因為list1的改變而改變,這個原理我待會兒跟大家說;接著看list3……看,真正的牆頭草是list3,它竟然跟著list1改變了,這是為什麼呢?
不知道大家還記不記得在講解變數的時候說過,Python的變數就像一個標籤,就一個名字而已……還是給大家畫個圖好理解,如圖5-1所示。
5-1 拷貝清單
這下大家應該明白了吧,為一個列表指定另一個名字的做法,只是向同一個列表增加一個新的標籤而已,真正的拷貝是要使用分片的方法。這個也是初學者最容易混淆的地方,大家以後寫代碼時一定要注意哦。

5.2 元組:戴上了枷鎖的列表
早在三百多年前,孟德斯鳩在《論法的精神》裡邊就提到一切擁有權力的人都容易濫用權力,這是萬古不變的一條經驗。但是凡是擁有大權力的人,都想用自身的實踐證明孟德斯鳩是一個隻會說屁話的傢伙,但是他們好像都失敗了……
由於列表過分強大,Python的作者覺得這樣似乎不妥,於是發明了列表的表親”——元組。
元組和列表最大的區別就是你可以任意修改清單中的元素,可以任意插入或者刪除一個元素,而對元組是不行的,元組是不可改變的(像字串一樣),所以你也別指望對元組進行原地排序等高級操作了。

5.2.1 創建和訪問一個元組
元組和清單,除了不可改變這個顯著特徵之外,還有一個明顯的區別是,創建列表用的是中括弧,而創建元組大部分時候用的是小括弧(注意,我這裡說的是大部分):
訪問元組的方式與清單無異:
也使用分片的方式來複製一個元組:
如果你試圖修改元組的一個元素,那麼抱歉,Python會很不開心:
我很好奇如果問你,清單的標誌性符號是中括弧([]),那麼元組的標誌性符號是什麼?你會怎麼回答呢?
小甲魚相信百分之九十的朋友都會不假思索地回答:小括弧啊,有部分比較激進的朋友還可能會補充一句小甲魚你傻啊?
好吧,這個問題其實也是大部分初學者所忽略和容易上當的,我們實驗一下:
還記得type()方法吧,作用是返回參數的類型,這裡它返回說temp變數是整型(int)。再試試:
噢,發現了吧?就算沒有小括弧,temp還是元組類型,所以逗號(,)才是關鍵,小括弧只是起到補充的作用。但是你如果想要創建一個空元組,那麼你就直接使用小括弧即可:
所以這裡要注意的是,如果要創建的元組中只有一個元素,請在它後邊加上一個逗號(,),這樣可以明確告訴Python你要的是一個元組,不要拿什麼整型、浮點型來忽悠你:
為了證明逗號(,)起到了決定性作用,再給大家舉個例子:

5.2.2 更新和刪除元組
有朋友可能會說,剛才不是你自己說元組是板上釘釘不能修改的嗎?你現在又來談更新一個元組,小甲魚你這不是自己打臉嗎?
大家不要激動……我們只是討論一個相對含蓄的做法(直接在同一個元組上更新是不可行的,除非你學習了後邊的魔法方法章節)。不知道大家還記不記得以前是如何更新一個字串的?沒錯,是通過拷貝現有的字串片段構造一個新的字串的方式解決的,對元組也是使用同樣的方法:
上面的代碼需要在小鴨小豬中間插入小甲魚,那麼通過分片的方法讓元組拆分為兩部分,然後再使用連接操作符(+)合併成一個新元組,最後將原來的變數名(temp)指向連接好的新元組。不妨可以把這樣的做法稱為狸貓換太子。在這裡就要注意了,逗號是必需的,小括弧也是必需的!
在談到列表的時候,小甲魚跟大家說有三個方法可以刪除清單裡邊的元素,但是對於元組是不可變的原則來說,單獨刪除一個元素是不可能的,當然你可以用剛才小甲魚教給大家更新元組的方法,間接地刪除一個元素:
如果要刪除整個元組,只要使用del語句即可顯式地刪除一個元組:
其實在日常使用中,很少使用del去刪除整個元組,因為Python的回收機制會在這個元組不再被使用到的時候自動刪除。
最後小結一下哪些操作符可以使用在元組上,拼接操作符和重複操作符剛剛演示過了,關係操作符、邏輯操作符和成員關係操作符innot in也可以直接應用在元組上,這跟列表是一樣的,大家自己實踐一下就知道了。關於列表和元組,我們今後會談得更多,目前,就先聊到這裡。

5.3 字串
或許現在又回過頭來談字串,有些朋友可能會覺得沒必要。
其實關於字串,還有很多你可能不知道的秘密,由於字串在日常使用中是如此常見,因此小甲魚抱著負責任的態度在本節把所知道的都倒出來跟大家分享一下。
關於創建和訪問字串,前面已經介紹過了。不過學了列表和元組,我們知道了分片的概念,事實上也可以應用於字串之上:
接觸過C語言的朋友應該知道,在C語言中,字串和字元是兩個不同的概念(C語言用單引號表示字元,雙引號表示字串)。但在Python並沒有字元這個類型,在Python看來,所謂字元,就是長度為1的字串。當要訪問字串的其中一個字元的時候,只需用索引清單或元組的方法來索引字串即可:
字串跟元組一樣,都是屬於一言既出、駟馬難追的傢伙。所以一旦定下來就不能直接對它們進行修改了,如果必須要修改,我們就需要委曲求全……
但是大家要注意,這種通過拼接舊字串的各個部分得到新字串的方式並不是真正意義上的改變原始字串,原來的那個傢伙還在,只是將變數指向了新的字串(舊的字串一旦失去了變數的引用,就會被Python的垃圾回收機制釋放掉)。
像比較操作符、邏輯操作符、成員關係操作符等的操作跟列表和元組是一樣的,這裡就不再囉唆了。

5.3.1 各種內置方法
列表和元組都有它們的方法,大家可能覺得列表的方法已經非常多了,其實字串更多呢。表5-1總結了字串的所有方法及對應的含義。
5-1 Python字串的方法

續表

這裡選幾個常用的給大家演示一下用法,首先是casefold()方法,它的作用是將字串的所有字元變為小寫:
count(sub[, start[, end]])方法之前試過了,就是查找sub子字串出現的次數,可選參數(注:在Python文檔中,用方括號([])括起來表示為可選)startend表示查找的範圍:
如果要查找某個子字串在該字串中的位置,可以使用find(sub[, start[, end]])index(sub[, start[, end]])方法。如果找到了,則返回值是第一個字元的索引值;如果找不到,則find()方法會返回-1,而index()方法會拋出異常(注:異常是可以被捕獲並處理的錯誤,目前你可以認為就是錯誤):
今後你可能會在很多文檔中看到join(sub)的身影,程式師喜歡用它來連接字串,但它的用法也許會讓你感到詫異。join是以字串作為分隔符號,插入到sub字串中所有的字元之間:
為什麼說程式師喜歡用join()來連接字串,我們不是有很好用的連接子號(+)嗎?這是因為當使用連接子號(+)去拼接大量的字串時是非常低效率的,因為加號連接會引起記憶體複製以及垃圾回收操作。所以對於大量的字串拼接來說,使用join()方法的效率要高一些:
replace(old, new[, count])方法如其名,就是替換指定的字串:
split(sep = None, maxsplit = G1)join()正好相反,split()用於拆分字串:
5.3.2 格式化
前面介紹了Python字串大部分方法的使用,但唯獨漏了一個format()方法。因為小甲魚覺得format()方法跟本節的話題如出一轍,都是關於字串的格式化,所以放一塊來講解。
那什麼是字串的格式化,又為什麼需要對字串進行格式化呢?舉個小例子給大家聽:某天小甲魚召開了魚C國際互聯安全大會,到會的朋友有來自世界各地的各界精英人士,有小烏龜、喵星人、旺星人,當然還有米奇和唐老鴨。哇噻,那氣勢簡直跟小甲魚開了個動物園一樣……但是問題來了,大家交流起來簡直是雞同鴨講,不知所云!但是最後聰明的小甲魚還是把問題給解決了,其實也很簡單,各界都找一個翻譯就行了,統一都翻譯成普通話,那麼問題就解決了……最後我們這個大會當然取得了卓越的成功並記入了吉尼斯動物大全。舉這個例子就是想跟大家說,格式化字串,就是按照統一的規格去輸出一個字串。如果規格不統一,就很可能造成誤會,例如十六進位的10跟十進位的10或二進位的10完全是不同的概念(十六進位10等於十進位16,二進位10等於十進位2)。字串格式化,正是説明我們糾正並規範這類問題而存在的。
1format()
format()方法接受位置參數和關鍵字參數(位置參數和關鍵字參數在函數章節有詳細講解),二者均傳遞到一個叫作replacement欄位。而這個replacement欄位在字串內由大括弧({})表示。先看一個例子:
怎麼回事呢?仔細看,字串中的{0}{1}{2}應該跟位置有關,依次被format()的三個參數替換,那麼format()的三個參數就叫作位置參數。那什麼是關鍵字參數呢,再來看一個例子:
{a}{b}{c}就相當於三個標籤,format()將參數中等值的字串替換進去,這就是關鍵字參數啦。另外,你也可以綜合位置參數和關鍵字參數在一起使用:
但要注意的是,如果將位置參數和關鍵字參數綜合在一起使用,那麼位置參數必須在關鍵字參數之前,否則就會出錯:
如果要把大括弧列印出來,你有辦法嗎?沒錯,這跟字串轉義字元有點像,只需要用多一層大括弧包起來即可(要列印轉義字元(\),只需用轉義字元轉義本身(\\)):
位置參數不列印沒有被輸出,這是因為{0}的特殊功能被外層的大括弧({})剝奪,因此沒有欄位可以輸出。注意,這並不會產生錯誤哦。最後來看另一個例子:
可以看到,位置參數{1}跟平常有些不同,後邊多了個冒號。在替換域中,冒號表示格式化符號的開始,“.2”的意思是四捨五入到保留兩位小數點,而f的意思是浮點數,所以按照格式化符號的要求列印出了3.14
2.格式化操作符:%
剛才講的是字串的格式化方法,現在來談談字串所獨享的一個操作符:%,有人說,這不是求餘數的操作符嗎?是的,沒錯。當%的左右均為數字的時候,那麼它表示求餘數的操作;但當它出現在字元中的時候,它表示的是格式化操作符。表5-2列舉了Python的格式化符號及含義。
5-2 Python格式化符號及含義
下面給大家舉幾個例子參考:
Python還提供了格式化操作符的輔助指令,如表5-3所示。
5-3 格式化操作符的輔助指令
同樣給大家舉幾個例子供參考:
3Python的轉義字元及含義
Python的部分轉義字元已經使用了一段時間,是時候來給它做個總結了,見表5-4
5-4 轉義字元及含義

5.4 序列
聰明的你可能已經發現,小甲魚把清單、元組和字串放在一塊兒來講解是有道理的,因為它們之間有很多共同點:
都可以通過索引得到每一個元素。
預設索引值總是從0開始(當然靈活的Python還支援負數索引)。
可以通過分片的方法得到一個範圍內的元素的集合。
有很多共同的操作符(重複操作符、拼接操作符、成員關係操作符)。
我們把它們統稱為:序列!下面介紹一些關於序列的常用BIF(內建方法)。
1list([iterable])
list()方法用於把一個可反覆運算物件轉換為清單,很多朋友經常聽到反覆運算這個詞,但要是讓你解釋的時候,很多朋友就含糊其詞了:反覆運算……反覆運算就是for迴圈嘛……
這裡小甲魚幫大家科普一下:所謂反覆運算,是重複回饋過程的活動,其目的通常是為了接近並到達所需的目標或結果。每一次對過程的重複被稱為一次反覆運算,而每一次反覆運算得到的結果會被用來作為下一次反覆運算的初始值……就目前來說,反覆運算還就是一個for迴圈,但今後會介紹到反覆運算器,那個功能,那叫一個驚豔!
好了,這裡說list()方法要麼不帶參數,要麼帶一個可反覆運算物件作為參數,而這個序列天生就是可反覆運算物件(反覆運算這個概念實際上就是從序列中泛化而來的)。還是通過幾個例子給大家講解吧:
事實上這個list()方法大家自己也可以動手實現對不對?很簡單嘛,實現過程大概就是新建一個清單,然後迴圈通過索引反覆運算參數的每一個元素並加入清單,反覆運算完畢後返回列表即可。大家課後不妨自己動動手來嘗試一下。
2tuple([iterable])
tuple()方法用於把一個可反覆運算物件轉換為元組,具體的用法和list()一樣,這裡就不囉唆了。
3str(obj)
str()方法用於把obj物件轉換為字串,這個方法在前面結合int()float()方法給大家講過,還記得吧?
4len(sub)
len()方法用於返回sub參數的長度:
5max(…)
max()方法用於返回序列或者參數集合中的最大值,也就是說,max()的參數可以是一個序列,返回值是該序列中的最大值;也可以是多個參數,那麼max()將返回這些參數中最大的一個:
6min(…)
min()方法跟max()用法一樣,但效果相反:返回序列或者參數集合中的最小值。這裡需要注意的是,使用max()方法和min()方法都要保證序列或參數的資料類型統一,否則會出錯。
人家說:外行看熱鬧,內行看門道。分析一下這個錯誤資訊。Python這裡說“TypeErrorunorderable typesstr()>int()”,意思是說不能拿字串和整型進行比較。這說明了什麼呢?
你看,str()>int(),說明max()方法和min()方法的內部實現事實上類似於之前提到的,通過索引得到每一個元素,然後將各個元素進行對比。所以不妨根據猜想寫出可能的代碼:
由此可見,Python的內置方法其實也沒啥了不起的,有些我們也可以自己實現,對吧?所以只要認真跟著本書的內容學習下去,很多看似如狼似虎的問題,將來都能迎刃而解!
7sum(iterable[, start])
sum()方法用於返回序列iterable的總和,用法跟max()min()一樣。但sum()方法有一個可選參數(start),如果設置該參數,表示從該值開始加起,預設值是0
8sorted(iterable, key=None, reverse=False)
sorted()方法用於返回一個排序的列表,大家還記得列表的內建方法sort()嗎?它們的實現效果一致,但列表的內建方法sort()是實現列表原地排序;而sorted()是返回一個排序後的新列表。
9reversed(sequence)
reversed()方法用於返回逆向反覆運算序列的值。同樣的道理,實現效果跟列表的內建方法reverse()一致。區別是列表的內建方法是原地翻轉,而reversed()是返回一個翻轉後的反覆運算器物件。你沒看錯,它不是返回一個列表,是返回一個反覆運算器物件:
10enumerate(iterable)
enumerate()方法生成由二元組(二元組就是元素數量為二的元組)構成的一個反覆運算物件,每個二元組是由可反覆運算參數的索引號及其對應的元素組成的。舉個例子你就明白了:
11zip(iter1[, iter2[...]])
zip()方法用於返回由各個可反覆運算參數共同組成的元組,舉個例子比較容易理解:



[1] 小甲魚個人認為是創新發明的根源和動力。


0 留言:

發佈留言