Python 簡易手冊

單元 38 - 序對與 Range

序對 (tuple) 跟 range 都是不可變的 (immutable) 序列 (sequence) ,不可變的序列支援以下操作

操作說明
x in s判斷 x 是否是 s 的元素
x not in s判斷 x 是否不是 s 的元素
s + t回傳合併 s 與 t 的新序列
s * n
n * s
回傳將 s 複製 n 倍的新序列
s[i]取得 s 中索引值為 i 的元素
s[i:j]取得 s 中索引值為 i 到 j - 1 的子序列
s[i:j:k]取得 s 中索引值為 i 到 j - 1 間隔 k 的子序列
len(s)回傳 s 中的元素總量
min(s)回傳 s 中的最小值
max(s)回傳 s 中的最大值
s.index(x[, i[, j]])回傳 s 中 x 的索引值,或是 x 在 i 到 j 之間的索引值
s.count(x)回傳 x 在 s 中的數量

基本上 range 是整數序列,由內建函數 (built-in function) range() 回傳由參數 (parameter) 定義的整數數列,總共最多可以有三個引數 (argument)

操作說明
range(stop)依 stop 建立 range 物件
range(start, stop[, step])依 start 、 stop 及 step 建立 range 物件

例如

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 建立 0 到 9 的整數數列
print(tuple(range(10)))
# 建立 1 到 10 的整數數列
print(tuple(range(1, 11)))
# 建立 0 到 18 間隔 2 的整數數列
print(tuple(range(0, 20, 2)))
# 建立 20 到 2 倒數間隔 3 的整數數列
print(tuple(range(20, 0, -3)))

# 檔名: range_demo.py
# 說明: 《Python簡易手冊》的範例
# 網址: http://kaiching.org
# 作者: Kaiching Chang
# 時間: 2024 年 3 月

以上都是先建立 range 物件,然後用另一個內建函數 tuple() 轉換成序對型態,然後直接當作 print() 的引數印在命令列上

 1
 2
# 建立 0 到 9 的整數數列
print(tuple(range(10)))

簡單說,預設建立的整數數列是從 0 開始,然後是引數指定的個數,所以引數 10 就是從 09 總共 10 個數字,同樣在第 4 行提供兩個引數

 3
 4
# 建立 1 到 10 的整數數列
print(tuple(range(1, 11)))

第一個引數 1 表示從 1 開始,第二個引數 11 表示總個數 111 為 10 個,所以這一行會產生從 110 總共 10 個數字的整數數字。

range() 的數字間隔預設為 1 ,也可以由第三個引數自行設定,例如第 6 行

 5
 6
# 建立 0 到 18 間隔 2 的整數數列
print(tuple(range(0, 20, 2)))

這是從第一個引數 0 開始到第二個引數 20 為止,間隔 2 ,所以是 200 得到 20 ,再除以 2 得到總共 10 個數字,所以是從 0 開始,整數數列每個數字加 2 ,到第 10 個數字 18 為止。

第三個引數可以是負數,這樣就是倒數的整數數列,例如第 8 行

 7
 8
# 建立 20 到 2 倒數間隔 3 的整數數列
print(tuple(range(20, 0, -3)))

同樣是從第一個引數 20 開始到第二個引數 0 為止,間隔設定為 -3 也就是減 3 ,所以是 200 得到 20 ,再除以 3 得到組共 7 個數字,所以是從 20 開始,整數數列每個數字減 3 ,到第 7 個數字 2 為止。

此例執行結果如下

> python range_demo.py
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
(0, 2, 4, 6, 8, 10, 12, 14, 16, 18)
(20, 17, 14, 11, 8, 5, 2)
>

以上也可以看到序對的字面常數 (literal) 是小括弧,序對同樣是不可變的序列,序對中的元素可以是任意的資料型態,舉簡單例子如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 建立序對變數
t1 = 1, 2, 3, 4, 5
t2 = (1, 2, 3, 4, 5)

# 印出變數的資料型態
print(type(t1))
print(type(t2))

# 示範操作
print(6 in t2)
print(t1 + t2)
print(t1[3])

# 檔名: tuple_demo.py
# 說明: 《Python簡易手冊》的範例
# 網址: http://kaiching.org
# 作者: Kaiching Chang
# 時間: 2024 年 3 月

第 2 行及第 3 行都是序對,其實定義序對不加小括弧也可以,只要把元素用逗號分開即可

 1
 2
 3
# 建立序對變數
t1 = 1, 2, 3, 4, 5
t2 = (1, 2, 3, 4, 5)

所以程式中用逗號間隔的資料基本上是序對型態,例如函數 (function) 定義在 return 陳述 (statement) 接上以逗號分格的數值,嚴格說,此時函數的回傳值 (return value) 為序對,如何定義函數會在單元 44 - 函數與 return 陳述介紹。

下面印出兩個變數 (variable) 的型態及示範一些操作,執行結果如下

> python tuple_demo.py
<class 'tuple'>
<class 'tuple'>
False
(1, 2, 3, 4, 5, 1, 2, 3, 4, 5)
4
>

由於序對是不可變的,因此如果處理的資料不需要變動,就可以放到序對中來處理,如果下例由 range() 產生數列後,逐一將每個數列數字放到串列 (list) 中,最後再把串列轉換成序對

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 建立數列放到串列中
t1 = []
for i in range(10):
    t1.append(i)
# 將串列轉換成序對
t2 = tuple(t1)
# 印出序對
print(t2)
# 印出序對的型態名稱
print(type(t2))

# 檔名: tuple_demo2.py
# 說明: 《Python簡易手冊》的範例
# 網址: http://kaiching.org
# 作者: Kaiching Chang
# 時間: 2024 年 3 月

單元 39 - 串列會詳細介紹如何定義串列。

此例執行結果如下

> python tuple_demo2.py
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
<class 'tuple'>
>

內建函數 tuple() 可以將可迭代的 iterable 轉換成序對

操作說明
tuple([iterable])將 iterable 轉換成序對物件

單元 66 - 迭代器會介紹迭代器及如何定義迭代器,也會說明可迭代與迭代器的不同。

參考資料

上一頁 單元 37 - 二進制序列
回 Python 簡易手冊 首頁
下一頁 單元 39 - 串列
回 Python 教材首頁
回程式語言教材首頁