python基礎教程_學習筆記1:序列-1

序列

數據結構:通過某種方式組織在一起的數據元素的集合,這些數據元素可以是數字或者字符,甚至可以是其他數據結構。


python中,最基本的數據結構是序列

序列中的每個元素被分配一個序號——即元素的位置,也稱爲索引。第一個索引是0,第二個是1,以此類推。

序列概覽

python包含6種內建的序列:列表、元組、字符串、Unicode字符串、buffer對象和xrange對象。

列表和元組的主要區別在於,列表可以修改,元組不能。

使用後者的理由通常是技術性的,它與python內部的運作方式有關。這也是內建函數可能返回元組的原因。

一般來說,在幾乎所有的情況下,列表都可以代替元組。其中一種需要注意到例外情況:使用元組作爲字典的鍵。在這種情況下,因爲鍵不可修改,所以不能使用列表。

通用序列操作

所有序列類型都可以進行某些特定的操作。這些操作包括:索引、分片、加、乘以及檢查某個元素是否屬於序列的成員(成員資格)。除此之外,python還有計算序列長度、找出最大元素和最小元素的內建函數。

注:另外一個重要的操作:迭代,後續會接觸到。

索引

序列中的所有元素都是編號的——從0開始遞增。這些元素可以通過編號分別訪問。使用負數索引時,python會從右邊,也就是最後一個元素開始計數。最後1個元素的位置編號是-1(記住:不是0)

字符串

>>> greeting = 'hello'

>>> greeting[0]

'h'

>>> greeting[-1]

'o'

>>> greeting[1]

'e'

>>> greeting[-2]

'l'

字符串字面值也可以使用索引。

>>> 'hello'[-1]

'o'

>>> 'hello'[-2]

'l'

列表

>>>greeting=['hello','world','you','and','i']

>>> greeting[0]

'hello'

>>> greeting[-1]

'i'

元組

>>>greeting=('hello','world','you','i')

>>> greeting[0]

'hello'

>>> greeting[-2]

'you'

如果一個函數調用返回一個序列,可以直接對返回結果進行索引操作。

>>>forth_num=raw_input("Please input a num(lenght>4): ")[3]

Please input a num(lenght>4): 20140508

>>> forth_num

'4'

分片

使用分片操作可以訪問一定範圍內的元素,通過冒號相隔的兩個索引來實現。

字符串

>>> greeting = 'Hello,world!'

>>> greeting[0:3]

'Hel'

列表

>>> greeting=['hello','world','you','and','i']

>>> greeting[1:3]

['world', 'you']

元組

>>>greeting=('hello','world','you','i')

>>> greeting[0:3]

('hello', 'world', 'you')

 

可知,分片中第一個索引是需要提取部分的第一個元素的編號,第二個索引是分片之後剩下部分的第1個元素的編號。簡言之,分片操作的實現需要提供兩個索引作爲邊界,第一個索引是包含在分片內的,第2個則不包含在分片內。

優雅的捷徑

如果需要訪問序列的最後幾個元素呢?當然可以顯式的操作:

>>> greeting=['hello','world','you','and','i']

>>> greeting[1:5]

['world', 'you', 'and', 'i']

索引5指向的元素並不存在,這種方法當然是可行的。但如果需要從列表的結尾開始計數呢?

>>> greeting[-4:-1]

['world', 'you', 'and']

>>> greeting[-4:0]

[]

這並不是我們想要的結果。

實際上,只要分片最左邊的索引比右邊的晚出現在序列中,結果就是一個空序列。可以使用捷徑:如果分片所得部分包含序列結尾的元素,置空最後一個索引即可

>>> greeting[-4:]

['world', 'you', 'and', 'i']

同樣可以用於序列開始的元素:

>>> greeting[:3]

['hello', 'world', 'you']

同理,想要複製整個序列,可以將兩個索引置空(冒號不能省略):

>>> greeting[:]

['hello', 'world', 'you', 'and', 'i']

更大的步長

進行分片,分片的開始和結束點需要進行指定,另外一個參數——步長——通常是隱式設置的。在普通的分片中,步長是1——分片操作就是按照這個步長逐個遍歷序列的元素,然後返回開始和結束點之間的所有元素。

>>> numbers=[1,2,3,4,5,6,7,8,9,10]

>>> numbers[0:10:2]

[1, 3, 5, 7, 9]

捷徑在這裏依然適用。將每4個元素中的第一個提取出來:

>>> numbers[::4]

[1, 5, 9]

步長不能爲0,因爲無法向下進行:

>>> numbers[::0]

 

Traceback (most recent call last):

 File "<pyshell#49>", line 1, in <module>

   numbers[::0]

ValueError: slice step cannot be zero

 

步長可以是負數,即從右到左提取元素:

>>> numbers[8:3:-1]

[9, 8, 7, 6, 5]

>>> numbers[::-2]

[10, 8, 6, 4, 2]

>>> numbers[:5:-2]

[10, 8]

>>> numbers[5::-2]

[6, 4, 2]

>>> numbers[3:8:-1]

[]

記住:分片最左邊的索引比右邊的晚出現在序列中,結果就是一個空序列。

當使用一個負數作爲步長時,必須讓開始點大於結束點。在沒有明確指定開始點和結束點的時候,正負數的使用可能會帶來一些混淆。

總之,對於一個正數步長,python會從序列的頭部開始向右提前元素,直至最後一個元素;

對於負數步長,從序列的尾部開始向左提取元素,直到第一個元素。

發佈了69 篇原創文章 · 獲贊 73 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章