哈嘍大家好,我是咸魚
好久不見甚是想念,2023 年最后一次法定節(jié)假日已經(jīng)結(jié)束了,不知道各位小伙伴是不是跟咸魚一樣今天就開始“搬磚”了呢?
我們知道元組(tuple)是 Python 的內(nèi)置數(shù)據(jù)類型,tuple 是一個(gè)不可變的值序列
tuple 的元素可以是任何類型,一般用在存儲(chǔ)異構(gòu)數(shù)據(jù)(例如數(shù)據(jù)庫(kù)記錄)的場(chǎng)景
那么今天這篇文章將帶大家深入了解一下 tuple 以及它們的主要功能和示例(原文較長(zhǎng),我分成幾個(gè)部分去講)
原文鏈接:https://realpython.com/python-tuple/
前言
tuple 是不可變的,可以存儲(chǔ)固定數(shù)量的元素(也可以叫項(xiàng)目,item)
例如可以通過(guò) tuple 來(lái)表示笛卡爾坐標(biāo)(x,y)、RGB 顏色(red,green,blue)或者數(shù)據(jù)庫(kù)表中的記錄(name,age,job)
tuple 的一些特點(diǎn)如下:
- 有序:里面的元素可以按照順序排列
- 輕量級(jí):與列表等其他序列相比,tuple 消耗的內(nèi)存要少
- 從零開始索引:可以從零開始索引訪問(wèn)里面的元素
- 不可變:不可以改變里面的元素
- 異構(gòu):可以存儲(chǔ)不同數(shù)據(jù)類型的對(duì)象(包括可變對(duì)象)
- 可嵌套:tuple 里面可以包含 tuple
- 可迭代:能夠遍歷里面的元素
- 可切片:可以從元組中提取一系列元素
- 可組合:支持串聯(lián)操作,可以使用串聯(lián)運(yùn)算符組合多個(gè)元組
- 可哈希:里面的元素都是不可變時(shí)可以用作字典的鍵
在 python 中,tuple 是有序的,這意味著其元素保持原始插入順序,這個(gè)順序在 tuple 的生命周期內(nèi)保持不變
>>> record = ("John", 35, "Python Developer")
>>> record
('John', 35, 'Python Developer')
可以按位置或索引訪問(wèn)元組中的元素(從零開始)
>>> record[0]
'John'
>>> record[1]
35
>>> record[2]
'Python Developer'
創(chuàng)建 tuple
tuple 是以逗號(hào)分隔的序列對(duì)象。要在元組中存儲(chǔ)對(duì)象,需要一次創(chuàng)建包含其所有內(nèi)容的元組對(duì)象
直接創(chuàng)建
# 語(yǔ)法
(item_0, item_1, ..., item_n)
需要注意的是,括號(hào)不是必需的,逗號(hào)才是。但是在大多數(shù)情況下括號(hào)可以提高代碼的可讀性
>>> jane = ("Jane Doe", 25, 1.75, "Canada")
>>> point = (2, 7)
>>> pen = (2, "Solid", True)
>>> days = (
... "Monday",
... "Tuesday",
... "Wednesday",
... "Thursday",
... "Friday",
... "Saturday",
... "Sunday",
... )
盡管括號(hào)對(duì)于定義大多數(shù) tuple 不是必需的,但在創(chuàng)建空 tuple 時(shí)必須包含它們:
>>> empty = ()
>>> empty
()
>>> type(empty)
<class 'tuple'>
因?yàn)?tuple 是不可變的,所以創(chuàng)建空 tuple 之后無(wú)法往里面添加元素。到這里有小伙伴可能會(huì)問(wèn):既然這樣為什么還要?jiǎng)?chuàng)建一個(gè)空 tuple?
例如現(xiàn)在有一個(gè)構(gòu)建并返回 tuple 的函數(shù),在一些情況下這個(gè)函數(shù)不會(huì)為生成的 tuple 創(chuàng)建元素,這樣我們就需要返回一個(gè)空 tuple。以此來(lái)使得函數(shù)的返回值類型保持一致
除此之外,下面的情況也需要使用到括號(hào)
>>> "Hello, %s! You're %s years old." % ("Linda", 24)
'Hello, Linda! You're 24 years old.'
>>> "Hello, %s! You're %s years old." % "Linda", 24
Traceback (most recent call last):
...
TypeError: not enough arguments for format string
當(dāng)我們使用 %
進(jìn)行格式化輸出的時(shí)候:
- 第一種加括號(hào):使用括在括號(hào)中的元組作為
%
運(yùn)算符的右側(cè)操作數(shù),按預(yù)期工作 - 第二種沒加括號(hào):報(bào)錯(cuò)
我們創(chuàng)建單個(gè)元素的 tuple
>>> one_word = "Hello",
>>> one_word
('Hello',)
>>> one_number = (42,)
>>> one_number
(42,)
可以看到括號(hào)不是必需的,尾隨逗號(hào)才是
使用 tuple()
創(chuàng)建
還可以使用 tuple()
從可迭代對(duì)象(列表、集合、字典或字符串)中創(chuàng)建 tuple,默認(rèn)生成一個(gè)空 tuple
# 語(yǔ)法
tuple([iterable])
>>> tuple(["Jane Doe", 25, 1.75, "Canada"])
('Jane Doe', 25, 1.75, 'Canada')
>>> tuple("Pythonista")
('P', 'y', 't', 'h', 'o', 'n', 'i', 's', 't', 'a')
>>> tuple({
... "manufacturer": "Boeing",
... "model": "747",
... "passengers": 416,
... }.values())
('Boeing', '747', 416)
>>> tuple()
()
通過(guò)集合來(lái)創(chuàng)建 tuple 時(shí)需要注意集合是無(wú)序的,會(huì)影響生成 tuple 中的元素的最終順序
如果我們從一個(gè)迭代器對(duì)象中創(chuàng)建一個(gè)tuple,那么 tuple()
函數(shù)會(huì)使用迭代器逐個(gè)生成元素,然后將這些元素組合成一個(gè)元組并返回
my_list = [1, 2, 3, 4, 5] # 可迭代對(duì)象
my_iterator = iter(my_list) # 轉(zhuǎn)換為迭代器對(duì)象 my_iterator
my_tuple = tuple(my_iterator)
print(my_tuple) # 輸出結(jié)果為:(1, 2, 3, 4, 5)
又或者從生成器表達(dá)式中創(chuàng)建 tuple,生成器是一種特殊的迭代器
>>> tuple(x**2 for x in range(10))
(0, 1, 4, 9, 16, 25, 36, 49, 64, 81)
tuple 索引和切片
tuple 中每一個(gè)元素都有一個(gè)整數(shù)索引,用于指定其在元組中的位置,索引從 0 開始
# 語(yǔ)法
tuple_object[index]
# 例子
>>> jane = ("Jane Doe", 25, 1.75, "Canada")
>>> jane[0]
'Jane Doe'
>>> jane[1]
25
>>> jane[3]
'Canada'
用不同的索引為 tuple 建立索引,可以直接訪問(wèn)相關(guān)的值。如果使用大 O 符號(hào)表示時(shí)間復(fù)雜度,那么可以說(shuō)索引是一個(gè)O(1)操作
這意味著 tuple 非常適合需要快速訪問(wèn)序列中的特定項(xiàng)的情況
len()
函數(shù)返回 tuple 長(zhǎng)度
>>> len(jane)
4
如果使用大于或等于 tuple 長(zhǎng)度的索引,則會(huì)報(bào)錯(cuò)
>>> jane[4]
Traceback (most recent call last):
...
IndexError: tuple index out of range
還可以使用負(fù)索引,負(fù)索引從右端開始數(shù)起
負(fù)索引對(duì)于所有 Python 序列(例如列表和字符串)都是通用的
>>> jane[-1]
'Canada'
>>> jane[-2]
1.75
如果使用負(fù)索引,則 -len(tuple_object)
將成為元組中的第一項(xiàng)。如果使用低于此值的索引,則會(huì)報(bào)錯(cuò)
>>> jane[-5]
Traceback (most recent call last):
...
IndexError: tuple index out of range
對(duì)于嵌套 tuple,我們?cè)撊绾卧L問(wèn)到里面的元素?
>>> employee = (
... "John",
... 35,
... "Python Developer",
... ("Django", "Flask", "FastAPI", "CSS", "HTML"),
... )
答案是通過(guò)多層索引
>>> employee[-1][0]
'Django'
>>> employee[-1][1]
'Flask'
tuple 切片
和其他序列一樣,tuple 可以使用切片操作來(lái)提取其中的內(nèi)容
# 語(yǔ)法
tuple_object[start:stop:step]
[start:stop:step]
此構(gòu)造的一部分稱為切片運(yùn)算符。它由一對(duì)方括號(hào)和三個(gè)可選索引組成: start
、 stop
和 step
其中第二個(gè)冒號(hào)不是必須的,如果 step
為1的話就可以省略
Index | Description | Default Value |
---|---|---|
start |
指定要開始切片的索引(開區(qū)間) | 0 |
stop |
指定希望切片停止提取元素的索引(閉區(qū)間) | len(tuple_object) |
step |
提供一個(gè)整數(shù)值,表示切片在每個(gè)步驟中將跳過(guò)多少項(xiàng) | 1 |
>>> days = (
... "Monday",
... "Tuesday",
... "Wednesday",
... "Thursday",
... "Friday",
... "Saturday",
... "Sunday",
... )
>>> days[:5]
('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday')
>>> days[5:]
('Saturday', 'Sunday')
不可變特性
Python 的 tuple 是不可變的,這意味著一旦你創(chuàng)建了一個(gè) tuple,你就不能就地更改或更新它的元素,只能創(chuàng)建新的 tuple 對(duì)象
>>> jane = ("Jane Doe", 25, 1.75, "Canada")
>>> jane[3] = "United States"
Traceback (most recent call last):
...
TypeError: 'tuple' object does not support item assignment
tuple 不可變的另一個(gè)含義是無(wú)法對(duì)其擴(kuò)容縮容,與列表不同,元組沒有.append()
、 .extend()
.insert()
.remove()
和 .clear()
方法
也不支持 del
語(yǔ)句
>>> point = (7, 14, 21)
>>> del point[2]
Traceback (most recent call last):
...
TypeError: 'tuple' object doesn't support item deletion
盡管 tuple 是不可變的,但是我們知道 tuple 里面可以存儲(chǔ)任意類型的對(duì)象,包括可變對(duì)象
這意味著我們可以在 tuple 中存儲(chǔ)列表、集合、字典等其他可變對(duì)象
>>> student_info = ("Linda", 18, ["Math", "Physics", "History"])
student_info
中前兩個(gè)元素是不可變的,最后一個(gè)是列表(可變),所以我們可以對(duì)其進(jìn)行更改
>>> student_info[2][2] = "Computer science"
>>> student_info
('Linda', 22, ['Math', 'Physics', 'Computer science'])
又因?yàn)?tuple 是不可變的(可哈希),所以可以用作字典中的 key文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-711682.html
>>> student_courses = {
... ("John", "Doe"): ["Physics", "Chemistry"],
... ("Jane", "Doe"): ["English", "History"],
... }
>>> student_courses[("Jane", "Doe")]
['English', 'History']
如果用作 key 的 tuple 里面包含可變?cè)兀瑒t會(huì)報(bào)錯(cuò)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-711682.html
>>> student_courses = {
... (["John", "Miguel"], "Doe"): ["Physics", "Chemistry"],
... (["Fatima", "Jane"], "Doe"): ["English", "History"],
... }
Traceback (most recent call last):
...
TypeError: unhashable type: 'list'
到了這里,關(guān)于深挖 Python 元組 pt.1的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!