菜鳥Python之序列(字符串、元組、列表)通用方法

前言 

     今天是小編正式回校的第一天。新的學期,新的開始,在兩天的休息整頓之後按理也該在我的編程學習之旅上繼續前行了。

      上一篇博文我們學習到Python組合數據類型的分類,知道了組合數據類型可以分爲三大類型:序列類型,集合類型以及映射類型,也知道了最常用最重要的序列類型還可以繼續劃分爲字符串、元組以及列表。今天的博文不細說字符串、元組以及列表的使用,今天我的目標是依據Magnus教授基於Python2的教材梳理一下序列類型的通用內建方法。我覺得需要在這裏說明一點的是小編從一開始入手學習的就是Python3,所以內心也更加傾向於Python3,在使用Python2教材的時候也會努力企圖將Python2與Python3不兼容的地方修改成Python3使用的語法,由於精力與經驗有限,所以對Python2與Python3的區別並未曾有過深入的分析研究,有所不當之處還望各位大佬評論指教。

      在教材上教授給出了這樣幾種常用的序列通用操作方法,分別是索引、分片、序列相加、乘法、成員資格、長度、最小值和最大值。其中有幾個名詞我自己第一遍讀的時候也覺得很陌生晦澀,因而令新手望而生畏也是理所當然。但是我個人覺得只要理解了這些專業術語的意思,在我們自己的腦海裏用自己的熟悉的語句對其進行通俗解釋,這些方法我們統統都可以掌握。下面我們對其進行一一分析歸納:

1、序列通用操作--索引

      在具體介紹某個概念之前,我們必須要向對方說明清楚這個概念的用處到底是什麼。索引是一種方法,那麼用這個方法我們能夠做什麼?這是我們學習新東西的時候必須要問自己的一個問題。我在上一篇博文裏寫道過序列就相當於我們數學裏的數列,數列是一組排好順序的數據。比如,現在有一個數列S0 = 1,3,9,4,26,6。。。,我想問數列中的第50個元素是多少(假設數列長度大於50)?那麼這個時候對於這樣一個並不算輕鬆的任務我們急切需要一個方法自動幫我們找到第50個數的值並將結果返回給我們。在Python中索引方法由此誕生,索引我們就可以理解爲查找,幫我們查找到我們想知道的序列中某位置處對應的確定值。使用索引方法的時候,我們不用管我們正在處理的對象類型到底是什麼,是字符串,是元組,還是列表,這並不重要,我們只需要在心裏明確的一點就是我們正在處理的對象它屬於序列類型,是一種按順序排列好的類型,是一種在特定位置有唯一確定值的類型。

      好了,廢話不再多說。接下來我們需要知道的是怎樣使用索引方法達到我們想要得到的答案即可。(有C和C++基礎的同胞最後會發現Python中的索引正類似於C或C++中的數組引用方法)。這裏有一個簡單的例子,設定變量s = [1,2,3,4,5],問:這個序列中的第三個元素是多少?(說明:這個變量s的類型是一個列表,列表我們後面會細講)在Python中,我們使用s[2]就可以得到序列中第三個元素的值,這就是一個索引的例子。那麼我們再從數拓展到字符,第二個例子,設定變量s = "hello",問該序列的第三個元素是多少?("hello"是一個字符串,也是序列類型),同樣s[2]直接解決問題。需要注意的是,當正向索引的時候我們訪問的第一個數據索引號爲0。這是我們在C和C++中司空見慣的東西,那麼Python中的索引有沒有更爲方便的地方呢?還真有!我們說Python中的序列類型還可以倒着數?意思就是當我們要查找的數據接近數據列的末尾時,比如我們問倒數第三個,倒數第一個數據是多少,這樣的要求反向索引就顯得尤爲方便。我們還用上面的兩個例子即可說明問題:1、s = [1,2,3,4,5],問這個序列中倒數第三個數是多少?我們使用s[-3]即可查找到,2、s = "hello",我們使用s[-3]也能同樣地索引到倒數第三個數對應的值。


 2、序列通用操作--分片

    分片看似又是一個陌生的概念,然而實際上呢?實際上分片只是對於索引方法的一個延伸。我們知道了索引只能幫助我們提取出序列中的一個元素,但是如果我們想要一步提取出序列中的N多元素呢,這個時候分片就幫助我們完美地解決了這個問題。比如我們想要提取出某序列中一串連續的數據,那麼我們僅需要在索引的時候給它確定一個左右邊界,類似於用左右邊界將我們想要提取的內容框定起來,即可完成操作。

     我們還以例子加以說明。設定一個變量numbers = [1,2,3,4,5,6,7,8,9,10],應該如何提取出該序列中的第3到第6個數據呢?我們使用numbers[2:6]就可以實現這樣一個效果。我們簡單分析一下,該行代碼用冒號將左右邊界隔開,那麼爲什麼我們要提取的是第3到第6個數據,而左右兩邊的數字分別是2和6呢?看完索引我們不難明白左邊界2代表的是第三個數據,這一點毋庸置疑,而右邊界的6,即numbers[6]已經是第七個數據,它是取不到的。這也就意味着在分片中存在一個取左邊界而不取右邊界的規則。這一點值得我們去十分注意。對於反向索引使用類似的方法進行使用即可。還有一點可以說的是,使用分片方法取的元素個數問題,以該例進行說明,6-2=4,提取出來的元素數量就是4,與題意符合,那也就意味着雖然存在左閉右開的規則,但是假如我們想取從第三個數據開始往後的10個數據的話,是numbers[2:12]即可解決問題。

     第二個分片方法的例子是關於正反向索引的混用問題。聽上去挺複雜的,但是卻在很多時候可以幫助我們簡化問題。有這樣一個問題背景,現在有一個很長的序列,我們需要提取其中的第二個到倒數第二個數據中間的N多個數據。在這種情況下,顯然我們使用完全正向或完全反向並不合適。假設變量s = "hello,world!",我們想提取第一個數據到倒數第二個數據之間的全部數據,我們使用s[0:-1]即可提取出"hello,world",同樣,冒號左右兩邊處於左閉右開狀態,s[-1]即最後一個數據不被提取,被提取的數據一直到s[-2]即倒數第二個數據爲止。

    有時候我們不想提取一串連續的數據,我們想跳着提取數據怎麼辦呢?在分片方法中,我們可以設置步長。還是這個序列,numbers = [1,2,3,4,5,6,7,8,9,10],我們想提取從第一個數據開始一直到結尾以每隔一個數據的方式提取出我們想要的結果。首先說明一下,在分片操作中,numbers[:]可以原樣提取出所有的元素,相當於複製。那麼在該例中,我們用numbers[::2]這樣一個命令即可對全部數據以每隔一個的方式進行提取。


3、序列通用操作--序列相加

     序列相加這個概念相對於前兩個則比較簡單。但是我們需要注意的是這裏是對序列進行相加,不能與基本數據類型相加形成混淆,我們在大腦中的習慣性思維是2+3 = 5這樣的加法類型。序列之間是沒有辦法進行數值相加的,在這裏的加我們可以理解爲連接。比如這裏有兩個序列,都爲列表類型,序列s1 = [1,2,3], s2 = [4,5,6], 那麼s1+s2的結果是多少呢?既然序列相加是連接,那麼結果自然就是[1,2,3,4,5,6];再舉一個例子,兩個字符串類型的序列,序列s1 = "hello" ,序列s2 = "World", s1+s2的結果顯然就是"helloWorld"。有一個注意點,即便同是屬於序列這樣一個大家族,但是不同的序列類型之間是沒有辦法進行序列相加操作的,例如,s1 = "hello", s2 = [1,2,3],執行s1+s2時就會出現報錯。


4、序列通用操作--序列乘法

     下面我們繼續介紹Python給我們提供的比較方便的序列操作--乘法。這裏的乘法同樣不是數值上的乘,而可以理解爲一種多次複製。比如我們現在想要將"hello,"這樣一個字符串賦值3次,只需要採用"hello,"*3便可以得到"hello,hello,hello,",簡單方便。同樣,對於列表類型,[10]*10,我們得到的結果就是[10,10,10,10,10,10,10,10,10,10]。


5、序列通用操作--成員資格

     成員資格這樣一個詞似乎又是一個對於我們來說相對陌生的概念。成員資格是做什麼用的呢?它是用來檢查某個值是否在該序列中,如果在則返回True,如果不在則返回False。舉一個實際一點的例子,比如我們這裏有一個龐大的數據庫用來存儲所有註冊過的用戶的用戶名,在某個用戶登錄時我們需要先檢查一下該用戶輸入的用戶名是否在該數據庫中,那麼這就是成員資格的應用。簡而言之,成員資格就是用來判斷你這個值是否是我們序列的成員。例如,字符串s1 = "hello",我們想判斷"he"這個字符串在不在序列s1中,我們使用"he" in s1這樣一個命令,得到的結果是True, 那麼"hl"呢,我們輸入"hl" in s1 ,返回結果爲False,說明不在。對於列表類型同樣如此,列表s2 = [1,3,7],輸入3 in s2和10 in s2的結果分別是什麼呢?如下圖所示:


6、序列通用操作--長度、最大值和最小值

     長度、最大值、最小值也是比較容易理解的,在這裏我們使用到內建函數(即可以直接使用的函數)len(),max(),min(),假設有一個列表s1 = [1,2,3,4,5],使用len(s1)語句即可計算出列表的長度,即列表內的元素個數,在這裏得到的答案就是5,max(s1)得到的就是s1中的最大數值,min(s1)得到的自然就是s1中的最小數值。


總結

     序列的通用操作到這裏就整理結束了。這些操作在我們實際使用處理大批量數據時都將會派上很大的用場,後面的博文我會繼續整理序列類型中的第一個子類型字符串類型,看看Python中到底提供了哪些十分方便的方法來處理我們的字符串信息。不得不說,寫博文真的是一個耗時間的工作,從晚上九點半開始,一直到現在,凌晨12點半,整整三個小時,也不過才整理了6個通用序列操作,這裏的每一個字,每一張圖都是我通過對書本的理解一個字一個字以自己的理解碼出來的,寫完之後,感覺自己的思路也通暢了許多,也深深地覺得寫文字的時候明顯沒有前面兩篇那麼猶豫了。從來沒有什麼工作是輕鬆的,但是傾心付出的時候會獲得快樂。大二下的生活馬上就要開始了,這學期的課程再加上手上正在做的智能車競賽,時間也真的是吃得緊,希望自己每天都能夠安排好自己的生活,多留下一點和自己的思想進行交流碰撞的時間吧。人生還是要努力,嗯!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章