最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python元組(Tuple)全部高級用法大全

 更新時間:2026年05月28日 09:26:26   作者:yuanpan  
這段文章詳細(xì)講解了Python元組的用法,從基礎(chǔ)到高級技巧,涵蓋創(chuàng)建、解包、嵌套、與列表字典集合的轉(zhuǎn)換等,還強調(diào)了元組在表示固定數(shù)據(jù)、防止誤改、作為字典鍵等方面的優(yōu)勢,適合Python新手理解和掌握,需要的朋友可以參考下

很多 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ǔ)和高級用法,新手重點記住下面這些:

  1. 元組用來保存一組固定數(shù)據(jù),創(chuàng)建后不能直接修改元素。
  2. 單元素元組必須寫逗號,比如 ("Python",)。
  3. 元組可以解包,比如 name, age = ("小王", 18)。
  4. 星號 * 可以做不定長解包,比如 first, *rest = data。
  5. 元組可以嵌套,適合保存簡單的結(jié)構(gòu)化數(shù)據(jù)。
  6. 元組可以和列表、字典、集合互相轉(zhuǎn)換,但要注意轉(zhuǎn)換后的數(shù)據(jù)特性。
  7. 元組可以拼接和重復(fù),但都會生成新元組,不會修改原元組。
  8. zip() 常用于批量配對數(shù)據(jù),返回的是一組組元組。
  9. enumerate() 常用于遍歷元組時同時拿序號和值。
  10. 元組不可變能防止誤改,適合配置常量、固定選項、只讀數(shù)據(jù)。
  11. 元組可以作為字典鍵,前提是里面的元素也都不可變。
  12. 函數(shù)返回多個值,本質(zhì)上就是返回元組。
  13. 函數(shù)里的 *args 會把多個參數(shù)打包成元組。
  14. 調(diào)用函數(shù)時 *tuple 可以把元組拆開傳參
  15. 常用函數(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

    這篇文章主要介紹了詳解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)用

    這篇文章主要介紹了用Django實現(xiàn)一個可運行的區(qū)塊鏈應(yīng)用,需要的朋友可以參考下
    2018-03-03
  • python 讀取目錄下csv文件并繪制曲線v111的方法

    python 讀取目錄下csv文件并繪制曲線v111的方法

    今天小編就為大家分享一篇python 讀取目錄下csv文件并繪制曲線v111的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Python 如何保存json文件并格式化

    Python 如何保存json文件并格式化

    這篇文章主要介紹了Python 如何保存json文件并格式化,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Python中內(nèi)置的數(shù)據(jù)結(jié)構(gòu)類型詳解(內(nèi)置數(shù)據(jù)容器)

    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中l(wèi)ist.copy方法用法詳解

    python中l(wèi)ist.copy方法用法詳解

    這篇文章主要給大家介紹了關(guān)于python中l(wèi)ist.copy方法使用的相關(guān)資料,文中還介紹了python?list.copy()?和?copy.deepcopy()區(qū)別,需要的朋友可以參考下
    2023-02-02
  • python中if的基礎(chǔ)用法(if?else和if?not)

    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() 函數(shù)詳解

    Python 中 Selenium 的 getAttribute() 

    本文將解釋如何使用Selenium的getAttribute()方法,getAttribute() 方法可以檢索元素屬性,例如錨標(biāo)記的 href 屬性, 該函數(shù)最初將嘗試返回指定屬性的值,感興趣的朋友跟隨小編一起看看吧
    2023-11-11
  • 如何在Python中隱藏和加密密碼示例詳解

    如何在Python中隱藏和加密密碼示例詳解

    Maskpass是一個類似getpass的Python庫,但是具有一些高級功能,比如掩蔽和顯示,下面這篇文章主要給大家介紹了關(guān)于如何在Python中隱藏和加密密碼的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • Python:pycharm中虛擬環(huán)境venv的使用及說明

    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

最新評論

绥德县| 旺苍县| 河源市| 高州市| 水城县| 昭苏县| 泰宁县| 开鲁县| 沙坪坝区| 温宿县| 吴堡县| 凌云县| 绍兴市| 永靖县| 修文县| 花莲市| 临洮县| 新邵县| 西青区| 扬州市| 弥勒县| 乌拉特中旗| 洛南县| 元江| 吉安县| 濮阳市| 阳西县| 中山市| 湘潭市| 隆昌县| 清远市| 远安县| 内黄县| 南城县| 黄石市| 太和县| 闽侯县| 庐江县| 宁晋县| 柳林县| 江孜县|