1. 程式人生 > 其它 >大爽Python入門教程 2-2 序列: 字串、元組與列表

大爽Python入門教程 2-2 序列: 字串、元組與列表

大爽Python入門公開課教案
點選檢視教程總目錄

序列

序列(sequence): 顧名思義,有序的排列。
有序排列的一串資料。
一種容器,容器內成員有序排列。

python的字串str,元組tuple,列表str都是序列。

所以字串str,元組tuple,列表str有些操作是相通的,
都支援序列操作。

序列內的成員個數,一般也稱為序列的長度。
可以使用len(sequence)函式獲取,
其中sequence為序列變數。

使用示例:

>>> len("abcde")
5
>>> len('')
0
>>> a_tuple = (3, 4)
>>> len(a_tuple)
2
>>> a_list = [1, 0, 0, 1]
>>> len(a_list)
4

索引

索引(index): 序列中元素的位置的值(編號)。
可以通過索引來獲取對應位置的資料。
寫法為sequence[index]
python的索引從0開始,
即序列第一個值的索引為0,
第二個值的索引為1,
第三個值的索引為2。
以此類推。。。

由於索引從0開始,
也有人喜歡把第一個值稱為第0個值。
但是這樣會導致交流時理解混亂。
比如一個人說第一個值,到底是列表開頭的那個,還是索引為1的那個。
所以為了準確與避免混淆,表達時最好專門說明其索引為幾
比如列表中索引為1的值...
而第幾個值,還是按照常規意思來理解。

超出索引會報錯

IndexError: ... index out of range

使用示例:
字串

>>> s = "abc"
>>> s[0]
'a'
>>> s[1]
'b'
>>> s[2]
'c'
>>> s[3]
Traceback (most recent call last):
  File "<input>", line 1, in <module>
IndexError: string index out of range

元組

>>> t = ("li hua", 18)
>>> t[0]
'li hua'
>>> t[1]
18
>>> t[2]
Traceback (most recent call last):
  File "<input>", line 1, in <module>
IndexError: tuple index out of range

列表

>>> numbers = ["one", 2.0, "3", 4, "five"]
>>> numbers[0]
'one'
>>> squares[1]
2.0
>>> squares[2]
'3'
>>> squares[3]
4
>>> squares[4]
'five'
>>> squares[5]
Traceback (most recent call last):
  File "<input>", line 1, in <module>
IndexError: list index out of range

可以通過
sequence.find(value)
方法查詢值對應的索引,
如果該值出現了多次,會得到第一個對應的索引,
如果沒出現過,會返回-1。

sequence.index(value)也可以得到值對應的索引
但是如果值沒出現過的話,會報錯ValueError

示例如下:

>>> s = "abc cba"
>>> s.find("a")
0
>>> s.find("b")
1
>>> s.find("d")
-1
>>> s.index("a")
0
>>> s.index("c")
2
>>> s.index("d")
Traceback (most recent call last):
  File "<input>", line 1, in <module>
ValueError: substring not found

倒序索引

python中索引可以是負數,代表倒著數的序號。
倒數第一個索引是-1,
倒數第二個索引是-2,
倒數第三個索引是-3,
以此類推。。。
示例

>>> numbers = ["one", 2.0, "3", 4, "five"]
>>> numbers[-1]
'five'
>>> squares[-2]
4
>>> squares[-5]
'one'
>>> numbers[-6]
Traceback (most recent call last):
  File "<input>", line 1, in <module>
IndexError: list index out of range

切片

切片切片,切出一片。從序列中切出一段,
或者說截取出一段,更準確的來說是複製了一段
得到一個新的序列。
注:切片操作不會改變原來的序列。

切片操作的基礎語法是sequence[start:end]
取出從start這個索引開始(包含start索引對應的值),
一直到end這個索引為止(不包含end索引對應的值)的這一段。

>>> s = "abcdefg"
>>> s[1]
'b'
>>> s[1:4]
'bcd'
>>> s[4]
'e'
>>> s[4:6]
'ef'

start和end都可以不寫,
不寫start代表從開頭開始,
不寫end代表沒有end(從start開始後一直取完後面所有的)。

>>> s[:3]
'abc'
>>> s[0:3]
'abc'
>>> s[4:]
'efg'

切片操作時,
start和end可以超出序列長度,不會報錯。

>>> s[4:7]
'efg'
>>> s[4:10]
'efg'
>>> s[7:10]
''

start甚至可以大於end,
不過此時取出來的是空(start等於end時也是空)。

>>> s[3:1]
''
>>> s[3:3]
''

解包Unpack

解包Unpack語法不是序列專屬的,很多容器都支援這個語法。

解包這個概念比較生僻,不好理解。
那麼這麼想:
首先,pack是打包的意思,
比如把幾個蘋果裝到一個箱子容器裡面
Unpack就是這個過程反過來,
把裝有蘋果的箱子裡的蘋果全部取出來。

示例:

>>> loc = (3, 4)
>>> x, y = loc  # Unpack
>>> x
3
>>> y
4

上面的x, y = loc就是解包元組
英語來講就是Unpack the tuple

解壓時,序列中有多少個元素,左邊就要有對應個數的變數。
數量不匹配就會報錯ValueError

>>> a,b,c = loc
Traceback (most recent call last):
  File "<input>", line 1, in <module>
ValueError: not enough values to unpack (expected 3, got 2)

解包Unpack的語法,一般是tuple用。
雖然字串和列表也可以用,但是由於其長度一般不確定,
所以一般不是用這個語法。

修改

注意:
字串和元組都是不可變物件,不可以修改。
列表是可變物件,可以修改。
修改字串和元組會報錯TypeError
對於列表,可以使用索引來修改對應索引的值。
其語法為list[index]=new_value

示例如下

>>> s = "abcde"
>>> s[0] = "d"
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>> lst = [1, 2, 3, 4, 5]
>>> lst[3] = 6
>>> lst
[1, 2, 3, 6, 5]
>>> lst[0], lst[2] = lst[2], lst[0]
[3, 2, 1, 6, 5]

最後2句補充說明: 先執行等號右邊的,
再把等號右邊的賦值給等號左邊的。

python的字串是不可變物件,不能直接修改,
有人可能碰到過一些方法,看起來好像修改了字串。
這些方法本質上都是生成了一個新的字串。

拓展說明:
對於元組來講,成員物件不能變,
但是變數的屬性修改是可以的。
這是比較複雜的東西,暫不深究。

拼接

序列之間可以使用加法,表示拼接,
會得到一個新的拼到一起的序列。
示例

>>> "123" + "456"
'123456'
>>> (1, 2) + (3, 4)
(1, 2, 3, 4)
>>> ["a", 12] + ["b", 20]
['a', 12, 'b', 20]