Python元組(Tuple)全部高級用法大全
很多 Python 新手剛學(xué)元組時,第一反應(yīng)是:
元組不就是不能修改的列表嗎?
這個理解沒錯,但只說對了一半。元組確實和列表很像,都能存多個數(shù)據(jù);但元組在實際開發(fā)里還有很多常見用法,比如函數(shù)返回多個值、多變量賦值、數(shù)據(jù)解包、作為字典鍵、保存配置常量、防止數(shù)據(jù)被誤改等。
這篇文章用大白話把 Python 元組從基礎(chǔ)到高級完整講一遍。每個知識點都配有可運行代碼、示例數(shù)據(jù)、運行結(jié)果和實際使用場景,適合 Python 新手收藏復(fù)盤。
1. 先回顧:什么是元組?
元組英文叫 tuple,它可以保存多個數(shù)據(jù)。
最常見寫法是用小括號 ():
# 創(chuàng)建一個元組
person = ("小王", 18, "Python")
print(person)
print(type(person))
運行結(jié)果:
('小王', 18, 'Python')
<class 'tuple'>
你可以把元組理解成一個固定內(nèi)容的數(shù)據(jù)包。創(chuàng)建好以后,里面的元素不能被直接修改。
person = ("小王", 18, "Python")
print(person[0])
print(person[1])
print(person[2])
運行結(jié)果:
小王 18 Python
實際使用場景:
- 保存一個人的固定信息,比如姓名、年齡、技能。
- 保存接口返回的多個結(jié)果。
- 保存不會被修改的配置項。
新手先記住一句話:
元組適合存一組固定數(shù)據(jù),列表適合存一組經(jīng)常變化的數(shù)據(jù)。
2. 元組 VS 列表:核心區(qū)別
元組和列表很像,但它們最大的區(qū)別是:
| 對比項 | 元組 tuple | 列表 list |
|---|---|---|
| 寫法 | ("A", "B") | ["A", "B"] |
| 是否可修改 | 不可直接修改 | 可以修改 |
| 常用場景 | 固定數(shù)據(jù)、配置、函數(shù)返回值 | 增刪改數(shù)據(jù) |
| 能否作為字典鍵 | 滿足條件時可以 | 不可以 |
| 語義 | 數(shù)據(jù)不希望被改 | 數(shù)據(jù)后續(xù)可能變化 |
看代碼更直觀:
# 列表可以修改
names_list = ["小王", "小李"]
names_list[0] = "小張"
print(names_list)
# 元組不能直接修改
names_tuple = ("小王", "小李")
print(names_tuple)
運行結(jié)果:
['小張', '小李']
('小王', '小李')
如果你強行修改元組,會報錯:
names_tuple = ("小王", "小李")
names_tuple[0] = "小張"
運行結(jié)果:
TypeError: 'tuple' object does not support item assignment
實際使用場景:
- 需要修改數(shù)據(jù),用列表。
- 不希望數(shù)據(jù)被誤改,用元組。
- 一組數(shù)據(jù)只是用來讀取、傳遞、返回,用元組很合適。
新手避坑:
- 元組不是“更高級的列表”,它們只是用途不同。
- 不要為了看起來高級就亂用元組。
- 如果后面要頻繁增加、刪除、修改元素,直接用列表。
3. 單元素元組正確寫法與避坑
這是新手最容易踩的坑。
很多人以為這樣就是單元素元組:
value = ("Python")
print(value)
print(type(value))
運行結(jié)果:
Python <class 'str'>
它不是元組,而是字符串。因為小括號在這里只是普通分組。
單元素元組必須加逗號。
value = ("Python",)
print(value)
print(type(value))
運行結(jié)果:
('Python',)
<class 'tuple'>
數(shù)字也一樣:
a = (100) b = (100,) print(type(a)) print(type(b))
運行結(jié)果:
<class 'int'> <class 'tuple'>
實際使用場景:
- 函數(shù)參數(shù)需要傳入元組時,哪怕只有一個元素,也要寫成
(value,)。 - 數(shù)據(jù)庫查詢參數(shù)只有一個值時,經(jīng)常需要單元素元組。
- 某些接口要求參數(shù)類型必須是元組。
新手避坑:
- 判斷單元素元組,看逗號,不看小括號。
("Python")是字符串。("Python",)才是元組。
4. 元組可以不寫小括號嗎?
可以。Python 里真正決定元組的,很多時候是逗號。
point = 10, 20 print(point) print(type(point))
運行結(jié)果:
(10, 20) <class 'tuple'>
這也是元組。
不過新手建議先寫小括號,因為更清楚:
point = (10, 20) print(point)
運行結(jié)果:
(10, 20)
實際使用場景:
- 多變量賦值時經(jīng)常省略小括號。
- 函數(shù)返回多個值時,底層其實返回的是元組。
新手避坑:
- 雖然能省略小括號,但代碼太復(fù)雜時建議寫上,別人更容易讀懂。
- 單元素元組不能只寫小括號,必須寫逗號。
5. 元組解包:一次取出多個值
元組解包就是把元組里的值,一次性分給多個變量。
person = ("小王", 18, "Python")
name, age, skill = person
print(name)
print(age)
print(skill)
運行結(jié)果:
小王 18 Python
可以理解成:
name 接收 "小王" age 接收 18 skill 接收 "Python"
實際使用場景:
- 接收函數(shù)返回的多個結(jié)果。
- 讀取固定格式的數(shù)據(jù)。
- 讓代碼更清楚,不用反復(fù)寫下標(biāo)。
對比一下不用解包的寫法:
person = ("小王", 18, "Python")
print(person[0])
print(person[1])
print(person[2])
運行結(jié)果:
小王 18 Python
雖然也能用,但 person[0]、person[1] 對新手來說不夠直觀。解包后變量名更清楚。
新手避坑:
- 左邊變量數(shù)量要和元組元素數(shù)量一致。
錯誤示例:
person = ("小王", 18, "Python")
name, age = person
運行結(jié)果:
ValueError: too many values to unpack (expected 2)
原因是右邊有 3 個值,左邊只有 2 個變量,接不住。
6. 多變量賦值:優(yōu)雅交換變量
Python 里可以用元組思想做多變量賦值。
a, b = 10, 20 print(a) print(b)
運行結(jié)果:
10 20
最經(jīng)典的用法是交換兩個變量:
a = 10 b = 20 # 交換 a 和 b 的值 a, b = b, a print(a) print(b)
運行結(jié)果:
20 10
實際使用場景:
- 交換兩個變量。
- 同時接收多個配置值。
- 同時初始化多個變量。
示例:同時保存坐標(biāo)。
x, y = 100, 200
print(f"x 坐標(biāo):{x}")
print(f"y 坐標(biāo):{y}")
運行結(jié)果:
x 坐標(biāo):100 y 坐標(biāo):200
新手避坑:
a, b = b, a不是魔法,可以理解為右邊先打包成一個臨時元組,再解包給左邊。- 左邊變量數(shù)量和右邊值數(shù)量仍然要匹配。
7. 星號 * 不定長解包
如果元組里的元素數(shù)量不固定,可以用星號 * 接收多余的元素。
scores = (90, 85, 70, 60, 100) first, *middle, last = scores print(first) print(middle) print(last)
運行結(jié)果:
90 [85, 70, 60] 100
注意:*middle 接收到的是一個列表,不是元組。
再看一個只取前兩個,其余打包的例子:
data = ("小王", "Python", "北京", "后端開發(fā)")
name, skill, *others = data
print(name)
print(skill)
print(others)
運行結(jié)果:
小王 Python ['北京', '后端開發(fā)']
實際使用場景:
- 只關(guān)心頭尾數(shù)據(jù),中間數(shù)據(jù)統(tǒng)一收起來。
- 接收接口返回的不定長數(shù)據(jù)。
- 處理 CSV、日志、命令行參數(shù)這類字段數(shù)量可能變化的數(shù)據(jù)。
新手避坑:
- 一個解包語句里只能有一個星號變量。
錯誤示例:
nums = (1, 2, 3, 4) *left, *right = nums
運行結(jié)果:
SyntaxError: multiple starred expressions in assignment
正確寫法:
nums = (1, 2, 3, 4) first, *rest = nums print(first) print(rest)
運行結(jié)果:
1 [2, 3, 4]
8. 忽略不需要的值:用下劃線 _
有些值你不想用,可以用 _ 接住。
person = ("小王", 18, "Python")
name, _, skill = person
print(name)
print(skill)
運行結(jié)果:
小王 Python
這里 _ 表示這個值我不關(guān)心。
實際使用場景:
- 數(shù)據(jù)格式固定,但只需要其中幾個字段。
- 函數(shù)返回多個值,只用其中一部分。
示例:
def get_user_info():
return ("小王", 18, "北京")
name, _, city = get_user_info()
print(name)
print(city)
運行結(jié)果:
小王 北京
新手避坑:
_只是一個普通變量名,不是真的“消失”。- 它只是約定俗成地表示“不使用這個值”。
a, _ = (10, 20) print(_)
運行結(jié)果:
20
9. 元組嵌套使用
元組里面還可以放元組,這叫嵌套元組。
student = ("小王", (90, 85, 88), "一班")
print(student)
運行結(jié)果:
('小王', (90, 85, 88), '一班')
這個數(shù)據(jù)可以理解為:
學(xué)生姓名:小王 成績:90, 85, 88 班級:一班
實際使用場景:
- 封裝結(jié)構(gòu)化數(shù)據(jù)。
- 保存坐標(biāo)點,比如
(x, y)、(x, y, z)。 - 保存一條記錄里的多個子信息。
示例:多個坐標(biāo)點。
points = ((0, 0), (10, 20), (30, 40)) print(points)
運行結(jié)果:
((0, 0), (10, 20), (30, 40))
新手避坑:
- 嵌套層級不要太深。
- 如果數(shù)據(jù)字段很多、結(jié)構(gòu)復(fù)雜,可以考慮字典或類,別把元組寫成“套娃”。
10. 嵌套元組取值
嵌套元組取值,就是一層一層用下標(biāo)。
student = ("小王", (90, 85, 88), "一班")
name = student[0]
scores = student[1]
english_score = student[1][1]
print(name)
print(scores)
print(english_score)
運行結(jié)果:
小王 (90, 85, 88) 85
student[1][1] 的意思是:
student[1] 先拿到 (90, 85, 88) student[1][1] 再拿這個元組里的第 2 個元素
還可以配合解包:
student = ("小王", (90, 85, 88), "一班")
name, (math_score, english_score, chinese_score), class_name = student
print(name)
print(math_score)
print(english_score)
print(chinese_score)
print(class_name)
運行結(jié)果:
小王 90 85 88 一班
實際使用場景:
- 讀取固定格式的復(fù)雜數(shù)據(jù)。
- 處理二維坐標(biāo)、三維坐標(biāo)。
- 解析接口返回的簡單嵌套結(jié)構(gòu)。
新手避坑:
- 下標(biāo)從
0開始。 - 下標(biāo)寫錯會取到錯誤字段。
- 嵌套結(jié)構(gòu)太復(fù)雜時,不要硬用元組,字典可能更清楚。
11. 元組與列表互相轉(zhuǎn)換
元組可以轉(zhuǎn)列表,列表也可以轉(zhuǎn)元組。
names_tuple = ("小王", "小李", "小張")
names_list = list(names_tuple)
print(names_list)
print(type(names_list))
運行結(jié)果:
['小王', '小李', '小張'] <class 'list'>
列表轉(zhuǎn)元組:
names_list = ["小王", "小李", "小張"] names_tuple = tuple(names_list) print(names_tuple) print(type(names_tuple))
運行結(jié)果:
('小王', '小李', '小張')
<class 'tuple'>
實際使用場景:
- 元組需要臨時修改時,先轉(zhuǎn)成列表,改完再轉(zhuǎn)回元組。
- 列表數(shù)據(jù)處理完成后,轉(zhuǎn)成元組防止后續(xù)誤改。
- 某些函數(shù)要求傳入元組類型。
示例:修改元組內(nèi)容的常見思路。
colors = ("red", "green", "blue")
# 元組不能直接改,先轉(zhuǎn)成列表
colors_list = list(colors)
colors_list[1] = "yellow"
# 改完再轉(zhuǎn)回元組
colors = tuple(colors_list)
print(colors)
運行結(jié)果:
('red', 'yellow', 'blue')
新手避坑:
- 這不是“直接修改元組”,而是創(chuàng)建了一個新的元組。
- 如果你經(jīng)常要改,說明一開始就應(yīng)該用列表。
12. 元組與字典互相轉(zhuǎn)換
元組經(jīng)常和字典配合使用,尤其是二元組。
二元組列表可以轉(zhuǎn)成字典:
pairs = (("name", "小王"), ("age", 18), ("skill", "Python"))
user = dict(pairs)
print(user)
運行結(jié)果:
{'name': '小王', 'age': 18, 'skill': 'Python'}
字典也可以轉(zhuǎn)成由鍵值對組成的元組:
user = {"name": "小王", "age": 18, "skill": "Python"}
items_tuple = tuple(user.items())
print(items_tuple)
運行結(jié)果:
(('name', '小王'), ('age', 18), ('skill', 'Python'))
實際使用場景:
- 接口返回的鍵值對數(shù)據(jù)轉(zhuǎn)成字典。
- 把字典內(nèi)容固定下來,防止后續(xù)隨便改結(jié)構(gòu)。
- 批量處理鍵值對。
新手避坑:
- 轉(zhuǎn)字典時,每個小元組必須是兩個元素:鍵和值。
錯誤示例:
pairs = (("name", "小王", "多余字段"), ("age", 18))
user = dict(pairs)
運行結(jié)果:
ValueError: dictionary update sequence element #0 has length 3; 2 is required
13. 元組與集合互相轉(zhuǎn)換
元組轉(zhuǎn)集合可以去重。
nums = (1, 2, 2, 3, 3, 3) unique_nums = set(nums) print(unique_nums)
運行結(jié)果:
{1, 2, 3}
集合轉(zhuǎn)元組:
nums_set = {3, 1, 2}
nums_tuple = tuple(nums_set)
print(nums_tuple)
運行結(jié)果示例:
(1, 2, 3)
注意:集合本身沒有固定順序,不同環(huán)境下輸出順序可能不一樣。
如果你想穩(wěn)定排序,可以這樣:
nums = (3, 1, 2, 2, 3) result = tuple(sorted(set(nums))) print(result)
運行結(jié)果:
(1, 2, 3)
實際使用場景:
- 元組數(shù)據(jù)去重。
- 判斷數(shù)據(jù)是否重復(fù)。
- 把去重后的結(jié)果重新固定成元組。
新手避坑:
set()會去重,但不保證原順序。- 想要穩(wěn)定順序,配合
sorted()。
14. 元組拼接:用 + 合并
元組可以用 + 拼接。
base_info = ("小王", 18)
extra_info = ("Python", "北京")
user_info = base_info + extra_info
print(user_info)
運行結(jié)果:
('小王', 18, 'Python', '北京')
實際使用場景:
- 合并固定字段。
- 給已有元組追加一段信息。
- 拼接多個接口返回結(jié)果。
新手避坑:
- 元組拼接不會修改原元組,而是生成新元組。
a = (1, 2) b = (3, 4) c = a + b print(a) print(b) print(c)
運行結(jié)果:
(1, 2) (3, 4) (1, 2, 3, 4)
如果頻繁拼接大量數(shù)據(jù),不建議反復(fù)用 +,可以先用列表收集,最后轉(zhuǎn)元組。
15. 元組重復(fù):用 * 快速生成固定數(shù)據(jù)
元組可以用 * 重復(fù)。
flags = ("未處理",) * 5
print(flags)
運行結(jié)果:
('未處理', '未處理', '未處理', '未處理', '未處理')
注意單元素元組還是要寫逗號:("未處理",)。
實際使用場景:
- 快速生成默認(rèn)狀態(tài)。
- 快速生成固定長度的占位數(shù)據(jù)。
- 初始化簡單配置。
示例:
default_scores = (0,) * 4 print(default_scores)
運行結(jié)果:
(0, 0, 0, 0)
新手避坑:
("未處理") * 5得到的是字符串重復(fù),不是元組重復(fù)。
wrong = ("未處理") * 3
right = ("未處理",) * 3
print(wrong)
print(right)
運行結(jié)果:
未處理未處理未處理
('未處理', '未處理', '未處理')
16. 快速合并技巧:星號展開多個元組
除了 +,還可以用星號 * 展開元組,再重新打包。
a = (1, 2) b = (3, 4) c = (5, 6) result = (*a, *b, *c) print(result)
運行結(jié)果:
(1, 2, 3, 4, 5, 6)
這種寫法在需要同時插入新元素時很方便:
old_data = ("小王", 18)
new_data = (*old_data, "Python", "北京")
print(new_data)
運行結(jié)果:
('小王', 18, 'Python', '北京')
實際使用場景:
- 合并多個固定數(shù)據(jù)包。
- 在原有數(shù)據(jù)前后追加字段。
- 構(gòu)造函數(shù)參數(shù)。
新手避坑:
*在這里表示“展開”,不是乘法。- 展開后重新用小括號包起來,得到新的元組。
17. zip() 搭配元組批量配對數(shù)據(jù)
zip() 可以把多個序列按位置配對,返回一組一組的元組。
names = ("小王", "小李", "小張")
scores = (90, 85, 88)
for item in zip(names, scores):
print(item)
運行結(jié)果:
('小王', 90)
('小李', 85)
('小張', 88)
也可以直接解包:
names = ("小王", "小李", "小張")
scores = (90, 85, 88)
for name, score in zip(names, scores):
print(f"{name} 的成績是 {score}")
運行結(jié)果:
小王 的成績是 90 小李 的成績是 85 小張 的成績是 88
實際使用場景:
- 批量配對姓名和成績。
- 批量配對商品和價格。
- 批量配對字段名和值。
示例:字段名和值轉(zhuǎn)字典。
fields = ("name", "age", "skill")
values = ("小王", 18, "Python")
user = dict(zip(fields, values))
print(user)
運行結(jié)果:
{'name': '小王', 'age': 18, 'skill': 'Python'}
新手避坑:
zip()會按最短的序列停止。
names = ("小王", "小李", "小張")
scores = (90, 85)
print(list(zip(names, scores)))
運行結(jié)果:
[('小王', 90), ('小李', 85)]
小張 沒有對應(yīng)成績,所以被丟掉了。
18. enumerate() 結(jié)合元組遍歷
enumerate() 可以在遍歷元組時,同時拿到序號和值。
skills = ("Python", "SQL", "Linux")
for index, skill in enumerate(skills):
print(index, skill)
運行結(jié)果:
0 Python 1 SQL 2 Linux
如果想讓序號從 1 開始:
skills = ("Python", "SQL", "Linux")
for index, skill in enumerate(skills, start=1):
print(f"{index}. {skill}")
運行結(jié)果:
1. Python 2. SQL 3. Linux
實際使用場景:
- 給菜單編號。
- 給排行榜編號。
- 遍歷固定配置項時輸出序號。
示例:打印菜單。
menus = ("查看余額", "轉(zhuǎn)賬", "退出")
for number, menu in enumerate(menus, start=1):
print(f"{number}. {menu}")
運行結(jié)果:
1. 查看余額 2. 轉(zhuǎn)賬 3. 退出
新手避坑:
- 只需要序號和值,用
enumerate()比range(len(...))更清楚。 enumerate()返回的每一項本質(zhì)上也是一個二元組,比如(0, "Python")。
skills = ("Python", "SQL")
print(list(enumerate(skills)))
運行結(jié)果:
[(0, 'Python'), (1, 'SQL')]
19. 元組不可變的實際優(yōu)勢
元組不可變,不只是限制,也是優(yōu)勢。
19.1 防止數(shù)據(jù)被誤改
config = ("localhost", 3306, "root")
print(config)
運行結(jié)果:
('localhost', 3306, 'root')
如果有人想直接改:
config = ("localhost", 3306, "root")
config[1] = 3307
運行結(jié)果:
TypeError: 'tuple' object does not support item assignment
實際使用場景:
- 數(shù)據(jù)庫連接配置。
- 系統(tǒng)固定選項。
- 坐標(biāo)、顏色、狀態(tài)碼等不希望隨便被改的數(shù)據(jù)。
19.2 表達(dá)“只讀數(shù)據(jù)”的意圖
roles = ("admin", "editor", "guest")
for role in roles:
print(role)
運行結(jié)果:
admin editor guest
看到元組,別人就知道這組角色一般不應(yīng)該被隨便改。
實際使用場景:
- 權(quán)限角色列表。
- 固定菜單項。
- 不允許動態(tài)添加的枚舉值。
新手避坑:
- 元組不可變,指的是元組里“每個位置的引用”不能改。
- 如果元組里面放了列表,列表本身還是可以改。
data = ("小王", ["Python", "SQL"])
data[1].append("Linux")
print(data)
運行結(jié)果:
('小王', ['Python', 'SQL', 'Linux'])
這點很容易誤解。元組不允許你把 data[1] 換成別的對象,但 data[1] 這個列表自身可以修改。
20. 元組作為字典鍵
字典的鍵要求是可哈希的,簡單理解就是:這個鍵本身不能隨便變。
元組如果里面的元素也都是不可變數(shù)據(jù),就可以作為字典鍵。
locations = {
(0, 0): "起點",
(10, 20): "商店",
(30, 40): "醫(yī)院"
}
print(locations[(10, 20)])
運行結(jié)果:
商店
實際使用場景:
- 用坐標(biāo)作為字典鍵。
- 用多個字段組合成唯一標(biāo)識。
- 緩存函數(shù)計算結(jié)果。
示例:用姓名和城市作為組合鍵。
users = {
("小王", "北京"): "后端開發(fā)",
("小李", "上海"): "數(shù)據(jù)分析"
}
print(users[("小王", "北京")])
運行結(jié)果:
后端開發(fā)
新手避坑:
- 元組里如果包含列表,就不能作為字典鍵。
bad_key = ("小王", ["Python", "SQL"])
data = {
bad_key: "測試"
}
運行結(jié)果:
TypeError: unhashable type: 'list'
因為列表是可變的,放進(jìn)元組后,整個元組也不能安全地作為字典鍵。
21. 函數(shù)返回多值:本質(zhì)就是元組
Python 函數(shù)可以返回多個值。
def get_user():
return "小王", 18, "Python"
result = get_user()
print(result)
print(type(result))
運行結(jié)果:
('小王', 18, 'Python')
<class 'tuple'>
函數(shù)看起來返回了 3 個值,本質(zhì)上是返回了一個元組。
通常我們會直接解包:
def get_user():
return "小王", 18, "Python"
name, age, skill = get_user()
print(name)
print(age)
print(skill)
運行結(jié)果:
小王 18 Python
實際使用場景:
- 函數(shù)同時返回狀態(tài)和結(jié)果。
- 函數(shù)同時返回最大值、最小值、平均值。
- 接口封裝時返回多個相關(guān)信息。
示例:
def analyze_scores(scores):
total = sum(scores)
average = total / len(scores)
return total, average
total_score, average_score = analyze_scores((90, 80, 70))
print(total_score)
print(average_score)
運行結(jié)果:
240 80.0
新手避坑:
- 返回多個值時,接收變量數(shù)量要一致。
- 如果只關(guān)心其中一個值,可以用
_忽略其他值。
def analyze_scores(scores):
total = sum(scores)
average = total / len(scores)
return total, average
_, average_score = analyze_scores((90, 80, 70))
print(average_score)
運行結(jié)果:
80.0
22. 函數(shù)參數(shù)打包:*args
函數(shù)定義里寫 *args,可以接收不確定數(shù)量的位置參數(shù)。
這些參數(shù)會被打包成一個元組。
def show_numbers(*args):
print(args)
print(type(args))
show_numbers(10, 20, 30)
運行結(jié)果:
(10, 20, 30) <class 'tuple'>
實際使用場景:
- 函數(shù)參數(shù)數(shù)量不固定。
- 寫求和、打印、批量處理這類通用函數(shù)。
示例:自定義求和。
def my_sum(*numbers):
total = 0
for number in numbers:
total += number
return total
print(my_sum(1, 2, 3))
print(my_sum(10, 20, 30, 40))
運行結(jié)果:
6 100
新手避坑:
args這個名字可以換,但習(xí)慣上都寫*args。*args接收到的是元組,不是列表。
23. 函數(shù)參數(shù)解包:把元組拆開傳進(jìn)去
如果函數(shù)需要多個參數(shù),而你手里有一個元組,可以用 * 把元組拆開傳進(jìn)去。
def introduce(name, age, skill):
print(f"我叫{name},今年{age}歲,會{skill}")
user = ("小王", 18, "Python")
introduce(*user)
運行結(jié)果:
我叫小王,今年18歲,會Python
如果不用 *,會把整個元組當(dāng)成第一個參數(shù),參數(shù)數(shù)量就不對。
def introduce(name, age, skill):
print(name, age, skill)
user = ("小王", 18, "Python")
introduce(user)
運行結(jié)果:
TypeError: introduce() missing 2 required positional arguments: 'age' and 'skill'
實際使用場景:
- 參數(shù)已經(jīng)被封裝成元組。
- 批量調(diào)用函數(shù)。
- 從配置、接口或數(shù)據(jù)庫里讀出參數(shù)后直接傳給函數(shù)。
新手避坑:
- 函數(shù)需要幾個參數(shù),元組里就要有幾個值。
*user表示把元組拆開,不是乘法。
24. len():獲取元組長度
len() 可以獲取元組里有多少個元素。
skills = ("Python", "SQL", "Linux")
print(len(skills))
運行結(jié)果:
3
實際使用場景:
- 判斷數(shù)據(jù)字段數(shù)量是否正確。
- 判斷配置項是否完整。
- 遍歷時確認(rèn)數(shù)據(jù)規(guī)模。
示例:
user = ("小王", 18, "Python")
if len(user) == 3:
print("用戶信息完整")
else:
print("用戶信息不完整")
運行結(jié)果:
用戶信息完整
新手避坑:
len()統(tǒng)計的是頂層元素數(shù)量,不會自動統(tǒng)計嵌套元組里的元素。
data = ("小王", (90, 80, 70))
print(len(data))
運行結(jié)果:
2
25. max()、min():獲取最大值和最小值
元組里如果都是可比較的數(shù)據(jù),可以用 max() 和 min()。
scores = (90, 85, 100, 60) print(max(scores)) print(min(scores))
運行結(jié)果:
100 60
實際使用場景:
- 獲取最高分、最低分。
- 獲取最大價格、最小價格。
- 獲取最大編號、最小編號。
示例:
prices = (199, 299, 99, 399)
print(f"最高價格:{max(prices)}")
print(f"最低價格:{min(prices)}")
運行結(jié)果:
最高價格:399 最低價格:99
新手避坑:
- 不要把數(shù)字和字符串混在一起比較。
data = (100, "200", 300) print(max(data))
運行結(jié)果:
TypeError: '>' not supported between instances of 'str' and 'int'
26. sum():對數(shù)字元組求和
sum() 可以對數(shù)字元組求和。
scores = (90, 85, 100) total = sum(scores) print(total)
運行結(jié)果:
275
實際使用場景:
- 計算總分。
- 計算總金額。
- 計算總數(shù)量。
示例:計算平均分。
scores = (90, 85, 100) total = sum(scores) average = total / len(scores) print(total) print(average)
運行結(jié)果:
275 91.66666666666667
新手避坑:
sum()只能對數(shù)字求和。
data = ("Python", "SQL")
print(sum(data))
運行結(jié)果:
TypeError: unsupported operand type(s) for +: 'int' and 'str'
字符串拼接不要用 sum(),可以用 join()。
data = ("Python", "SQL")
print(" + ".join(data))
運行結(jié)果:
Python + SQL
27. count():統(tǒng)計某個元素出現(xiàn)次數(shù)
count() 用來統(tǒng)計某個值在元組里出現(xiàn)了幾次。
levels = ("初級", "中級", "初級", "高級", "初級")
print(levels.count("初級"))
print(levels.count("高級"))
運行結(jié)果:
3 1
實際使用場景:
- 統(tǒng)計某個狀態(tài)出現(xiàn)次數(shù)。
- 統(tǒng)計某個標(biāo)簽出現(xiàn)次數(shù)。
- 統(tǒng)計考試等級、訂單狀態(tài)、任務(wù)狀態(tài)。
示例:
statuses = ("成功", "失敗", "成功", "處理中", "成功")
success_count = statuses.count("成功")
print(f"成功次數(shù):{success_count}")
運行結(jié)果:
成功次數(shù):3
新手避坑:
count()只統(tǒng)計完全相等的值。
words = ("Python", "python", "PYTHON")
print(words.count("Python"))
運行結(jié)果:
1
大小寫不同,結(jié)果就不同。
28. index():查找元素位置
index() 可以查找某個元素第一次出現(xiàn)的位置。
skills = ("Python", "SQL", "Linux", "Python")
print(skills.index("Python"))
print(skills.index("Linux"))
運行結(jié)果:
0 2
注意:index() 返回的是第一次出現(xiàn)的位置。
實際使用場景:
- 查找某個狀態(tài)所在位置。
- 查找某個菜單項編號。
- 查找固定配置項的位置。
示例:
menus = ("首頁", "課程", "訂單", "我的")
position = menus.index("訂單")
print(position)
運行結(jié)果:
2
新手避坑:
- 如果元素不存在,
index()會報錯。
menus = ("首頁", "課程", "訂單", "我的")
print(menus.index("設(shè)置"))
運行結(jié)果:
ValueError: tuple.index(x): x not in tuple
更安全的寫法:
menus = ("首頁", "課程", "訂單", "我的")
target = "設(shè)置"
if target in menus:
print(menus.index(target))
else:
print("沒有找到")
運行結(jié)果:
沒有找到
29. 什么時候必須用元組?
嚴(yán)格來說,很多時候列表和元組都能完成任務(wù)。但下面幾種情況,元組更合適,甚至必須用。
29.1 想作為字典鍵
point_names = {
(0, 0): "原點",
(1, 2): "目標(biāo)點"
}
print(point_names[(1, 2)])
運行結(jié)果:
目標(biāo)點
列表不能作為字典鍵:
point_names = {
[0, 0]: "原點"
}
運行結(jié)果:
TypeError: unhashable type: 'list'
29.2 想表達(dá)數(shù)據(jù)不應(yīng)該被修改
database_config = ("127.0.0.1", 3306, "root")
print(database_config)
運行結(jié)果:
('127.0.0.1', 3306, 'root')
配置數(shù)據(jù)通常不希望運行過程中隨便被改,元組更能表達(dá)這個意思。
29.3 函數(shù)返回多個值
def get_range_info(numbers):
return min(numbers), max(numbers)
small, big = get_range_info((8, 3, 10, 1))
print(small)
print(big)
運行結(jié)果:
1 10
Python 返回多個值時,本質(zhì)就是元組。
29.4 固定結(jié)構(gòu)的數(shù)據(jù)
rgb = (255, 128, 0) red, green, blue = rgb print(red) print(green) print(blue)
運行結(jié)果:
255 128 0
RGB 顏色值固定就是 3 個數(shù)字,用元組非常合適。
30. 新手高頻易錯點總結(jié)
30.1 單元素元組忘記逗號
wrong = ("Python")
right = ("Python",)
print(type(wrong))
print(type(right))
運行結(jié)果:
<class 'str'> <class 'tuple'>
30.2 以為元組絕對不能變
data = ("小王", ["Python"])
data[1].append("SQL")
print(data)
運行結(jié)果:
('小王', ['Python', 'SQL'])
元組位置不能改,但里面的可變對象自己還能改。
30.3 解包數(shù)量不匹配
info = ("小王", 18, "Python")
name, age = info
運行結(jié)果:
ValueError: too many values to unpack (expected 2)
解決辦法是變量數(shù)量匹配,或者使用 * 接收多余值。
info = ("小王", 18, "Python")
name, *others = info
print(name)
print(others)
運行結(jié)果:
小王 [18, 'Python']
30.4 index() 查不到元素會報錯
skills = ("Python", "SQL")
target = "Java"
if target in skills:
print(skills.index(target))
else:
print("沒有這個技能")
運行結(jié)果:
沒有這個技能
30.5 把元組當(dāng)列表頻繁修改
如果你寫代碼時總是這樣:
data = ("A", "B", "C")
data_list = list(data)
data_list.append("D")
data = tuple(data_list)
print(data)
運行結(jié)果:
('A', 'B', 'C', 'D')
說明你可能一開始就應(yīng)該用列表。
31. 元組實戰(zhàn):封裝用戶數(shù)據(jù)并批量處理
最后用一個接近實際開發(fā)的小例子,把元組、解包、zip()、enumerate() 串起來。
# 用戶字段和用戶數(shù)據(jù)
fields = ("name", "age", "skill")
users = (
("小王", 18, "Python"),
("小李", 20, "SQL"),
("小張", 22, "Linux")
)
for index, user in enumerate(users, start=1):
# zip 把字段名和值配對,再轉(zhuǎn)成字典
user_dict = dict(zip(fields, user))
print(f"第 {index} 個用戶")
print(user_dict)
運行結(jié)果:
第 1 個用戶
{'name': '小王', 'age': 18, 'skill': 'Python'}
第 2 個用戶
{'name': '小李', 'age': 20, 'skill': 'SQL'}
第 3 個用戶
{'name': '小張', 'age': 22, 'skill': 'Linux'}
這個例子里:
fields是固定字段,用元組保存。users是多條固定結(jié)構(gòu)的數(shù)據(jù),用嵌套元組保存。enumerate()負(fù)責(zé)生成序號。zip()負(fù)責(zé)把字段和值配對。dict()負(fù)責(zé)把配對結(jié)果轉(zhuǎn)成字典。
實際使用場景:
- 處理數(shù)據(jù)庫查詢結(jié)果。
- 處理接口返回的多條記錄。
- 把固定格式的數(shù)據(jù)批量轉(zhuǎn)成字典。
32. 知識點總結(jié)
這篇文章講了 Python 元組的基礎(chǔ)和高級用法,新手重點記住下面這些:
- 元組用來保存一組固定數(shù)據(jù),創(chuàng)建后不能直接修改元素。
- 單元素元組必須寫逗號,比如
("Python",)。 - 元組可以解包,比如
name, age = ("小王", 18)。 - 星號
*可以做不定長解包,比如first, *rest = data。 - 元組可以嵌套,適合保存簡單的結(jié)構(gòu)化數(shù)據(jù)。
- 元組可以和列表、字典、集合互相轉(zhuǎn)換,但要注意轉(zhuǎn)換后的數(shù)據(jù)特性。
- 元組可以拼接和重復(fù),但都會生成新元組,不會修改原元組。
- zip() 常用于批量配對數(shù)據(jù),返回的是一組組元組。
- enumerate() 常用于遍歷元組時同時拿序號和值。
- 元組不可變能防止誤改,適合配置常量、固定選項、只讀數(shù)據(jù)。
- 元組可以作為字典鍵,前提是里面的元素也都不可變。
- 函數(shù)返回多個值,本質(zhì)上就是返回元組。
- 函數(shù)里的
*args會把多個參數(shù)打包成元組。 - 調(diào)用函數(shù)時
*tuple可以把元組拆開傳參。 - 常用函數(shù)和方法包括
len()、max()、min()、sum()、count()、index()。
最后再用一句話收尾:
如果數(shù)據(jù)后面要改,用列表;如果數(shù)據(jù)固定、不希望被誤改、要作為組合鍵或函數(shù)返回多個值,用元組。
把這個判斷記住,Python 元組就不難了。
以上就是Python元組(Tuple)全部高級用法大全的詳細(xì)內(nèi)容,更多關(guān)于Python元組(Tuple)高級用法的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解Python 序列化Serialize 和 反序列化Deserialize
這篇文章主要介紹了詳解Python 序列化Serialize 和 反序列化Deserialize的相關(guān)資料,序列化是將對象狀態(tài)轉(zhuǎn)換為可保持或傳輸?shù)母袷降倪^程。與序列化相對的是反序列化,它將流轉(zhuǎn)換為對象。這兩個過程結(jié)合起來,可以輕松地存儲和傳輸數(shù)據(jù),需要的朋友可以參考下2017-08-08
用Django實現(xiàn)一個可運行的區(qū)塊鏈應(yīng)用
這篇文章主要介紹了用Django實現(xiàn)一個可運行的區(qū)塊鏈應(yīng)用,需要的朋友可以參考下2018-03-03
Python中內(nèi)置的數(shù)據(jù)結(jié)構(gòu)類型詳解(內(nèi)置數(shù)據(jù)容器)
在?Python?中,字典(dict)是一種非常常用的數(shù)據(jù)結(jié)構(gòu),用于存儲鍵值對,這篇文章給大家介紹Python中內(nèi)置的數(shù)據(jù)結(jié)構(gòu)類型詳解(內(nèi)置數(shù)據(jù)容器),感興趣的朋友一起看看吧2025-04-04
python中if的基礎(chǔ)用法(if?else和if?not)
if在Python中用作某個條件或值的判斷,下面這篇文章主要給大家介紹了關(guān)于python中if的基礎(chǔ)用法,主要包括if?else和if?not,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
Python 中 Selenium 的 getAttribute()
本文將解釋如何使用Selenium的getAttribute()方法,getAttribute() 方法可以檢索元素屬性,例如錨標(biāo)記的 href 屬性, 該函數(shù)最初將嘗試返回指定屬性的值,感興趣的朋友跟隨小編一起看看吧2023-11-11
Python:pycharm中虛擬環(huán)境venv的使用及說明
文章介紹了虛擬環(huán)境的必要性和實踐方法,虛擬環(huán)境可以幫助用戶管理不同項目所需的Python版本和第三方模塊,避免版本沖突和模塊沖突,文章詳細(xì)介紹了如何使用Python自帶的`venv`模塊創(chuàng)建和管理虛擬環(huán)境,并通過命令行和PyCharm兩種方式構(gòu)建虛擬環(huán)境2025-01-01

