Python3 元组

Python3 元组

2026年9月15日·#编程学习/python学习笔记Python·3289 字 16 分钟
浏览量加载中...
AI 摘要- DeepSeek

Python3 元组的创建、访问、运算和内置函数

封面图
Python3 元组 - 封面图

Python 的元组与列表类似,不同之处在于元组的元素不能修改。

元组使用小括号 ( ),列表使用方括号 [ ]。

元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。

实例(Python 3.0+)#

>>> tup1 = ('Google', 'Runoob', 1997, 2000)
>>> tup2 = (1, 2, 3, 4, 5)
>>> tup3 = "a", "b", "c", "d" # 不需要括号也可以
>>> type(tup3)
<class 'tuple'>

创建空元组

tup1 = ()

元组中只包含一个元素时,需要在元素后面添加逗号, ,否则括号会被当作运算符使用:

实例(Python 3.0+)#

>>> tup1 = (50)
>>> type(tup1) # 不加逗号,类型为整型
<class 'int'>
>>> tup1 = (50,)
>>> type(tup1) # 加上逗号,类型为元组
<class 'tuple'>

元组与字符串类似,下标索引从 0 开始,可以进行截取,组合等。


访问元组#

元组可以使用下标索引来访问元组中的值,如下实例:

实例(Python 3.0+)#

tup1 = ('Google', 'Runoob', 1997, 2000)
tup2 = (1, 2, 3, 4, 5, 6, 7)
print("tup1[0]: ", tup1[0])
print("tup2[1:5]: ", tup2[1:5])

以上实例输出结果:

tup1[0]: Google
tup2[1:5]: (2, 3, 4, 5)

修改元组#

元组中的元素值是不允许修改的,但我们可以对元组进行连接组合,如下实例:

实例(Python 3.0+)#

tup1 = (12, 34.56)
tup2 = ('abc', 'xyz')
tup3 = tup1 + tup2
print(tup3)

以上实例输出结果:

(12, 34.56, 'abc', 'xyz')

删除元组#

元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组,如下实例:

实例(Python 3.0+)#

tup = ('Google', 'Runoob', 1997, 2000)
print(tup)
del tup
print("删除后的元组 tup: ")
print(tup)

以上实例元组被删除后,输出变量会有异常信息,输出如下所示:

删除后的元组 tup :
Traceback (most recent call last):
File "test.py", line 8, in <module>
print (tup)
NameError: name 'tup' is not defined

元组运算符#

与字符串一样,元组之间可以使用 +、+=和 * 号进行运算。这就意味着他们可以组合和复制,运算后会生成一个新的元组。

Python 表达式结果描述
len((1, 2, 3))3计算元素个数
>>> a = (1, 2, 3) >>> b = (4, 5, 6) >>> c = a+b >>> c (1, 2, 3, 4, 5, 6)(1, 2, 3, 4, 5, 6)连接,c 就是一个新的元组,它包含了 a 和 b 中的所有元素。
>>> a = (1, 2, 3) >>> b = (4, 5, 6) >>> a += b >>> a (1, 2, 3, 4, 5, 6)(1, 2, 3, 4, 5, 6)连接,a 就变成了一个新的元组,它包含了 a 和 b 中的所有元素。
('Hi!',) * 4(‘Hi!’, ‘Hi!’, ‘Hi!’, ‘Hi!’)复制
3 in (1, 2, 3)True元素是否存在
for x in (1, 2, 3): print (x, end=" ")1 2 3迭代

元组索引,截取#

因为元组也是一个序列,所以我们可以访问元组中的指定位置的元素,也可以截取索引中的一段元素,如下所示:

元组:

tup = ('Google', 'Runoob', 'Taobao', 'Wiki', 'Weibo','Weixin')

Python 表达式结果描述
tup[1]‘Runoob’读取第二个元素
tup[-2]‘Weibo’反向读取,读取倒数第二个元素
tup[1:](‘Runoob’, ‘Taobao’, ‘Wiki’, ‘Weibo’, ‘Weixin’)截取元素,从第二个开始后的所有元素。
tup[1:4](‘Runoob’, ‘Taobao’, ‘Wiki’)截取元素,从第二个开始到第四个元素(索引为 3)。

运行实例如下:

实例#

>>> tup = ('Google', 'Runoob', 'Taobao', 'Wiki', 'Weibo', 'Weixin')
>>> tup[1]
'Runoob'
>>> tup[-2]
'Weibo'
>>> tup[1:]
('Runoob', 'Taobao', 'Wiki', 'Weibo', 'Weixin')
>>> tup[1:4]
('Runoob', 'Taobao', 'Wiki')
>>>

元组内置函数#

Python元组包含了以下内置函数

序号方法及描述实例
1len(tuple) 计算元组元素个数。>>> tuple1 = ('Google', 'Runoob', 'Taobao') >>> len(tuple1) 3 >>>
2max(tuple) 返回元组中元素最大值。>>> tuple2 = ('5', '4', '8') >>> max(tuple2) '8' >>>
3min(tuple) 返回元组中元素最小值。>>> tuple2 = ('5', '4', '8') >>> min(tuple2) '4' >>>
4tuple(iterable) 将可迭代系列转换为元组。>>> list1= ['Google', 'Taobao', 'Runoob', 'Baidu'] >>> tuple1=tuple(list1) >>> tuple1 ('Google', 'Taobao', 'Runoob', 'Baidu')

关于元组是不可变的#

所谓元组的不可变指的是元组所指向的内存中的内容不可变。

>>> tup = ('r', 'u', 'n', 'o', 'o', 'b')
>>> tup[0] = 'g' # 不支持修改元素
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> id(tup) # 查看内存地址
4440687904
>>> tup = (1, 2, 3)
>>> id(tup)
4441088800 # 内存地址不一样了

从以上实例可以看出,重新赋值的元组 tup,绑定到新的对象了,不是修改了原来的对象。


相关#

练习题#

一、知识回顾(读完直接做下面的实践题)#

  1. 创建元组:用小括号把逗号分隔的值括起来(tup1 = ('Google', 'Runoob', 1997, 2000));括号可以省略(tup3 = "a", "b", "c" 也是元组);空元组写 ()
  2. 只有一个元素的元组必须带逗号:(50,) 才是元组,(50) 会被当成整数 50
  3. 元组的元素不能修改、不能删除——t[0] = 'g' 会报 TypeError: 'tuple' object does not support item assignment;del 只能把整个元组删掉
  4. “元组不可变”指的是元组所指向的内存内容不可变;给变量重新赋值是让它绑定到了新对象(用 id() 看得出地址变了)
  5. 访问元素:下标从 0 开始,也可以从尾部数(tup[-2] 是倒数第二个);切片 tup[1:4] 含头不含尾
  6. 运算符:+ 连接两个元组(生成新元组)、+= 同样能拼接、* 复制重复、in 判断元素在不在、len() 数元素个数
  7. 遍历:for x in 元组: 逐个取出元素;想让输出挤在同一行,就把输出函数结尾的换行换成空格
  8. 内置函数:len(tuple) 元素个数、max(tuple) 最大值、min(tuple) 最小值、tuple(可迭代对象) 转成元组
  9. 与列表互转:list(元组) 转成列表(转完就能改了)、tuple(列表) 转成元组(转完就不能改了)
  10. 怎么选:元组适合存”固定不变的一小串记录”(防止误改、更安全),列表适合要频繁增删改的有序数据

二、裸写题#

  • 2-1 创建元组 创建文件 test_tuple.py,完成以下操作:

    • 创建元组 t1 = (1, 2, 3, 4, 5)
    • 创建元组 t2 = ("a", "b", "c")
    • 创建只有一个元素的元组 t3 = (10,)(注意逗号)
    • 打印每个元组及其类型

    批改(2026-09-28):⚠️ 三个元组都创建正确(含 t3 = (10,) 的单元素写法),但只打印了类型(输出三遍 <class 'tuple'>),漏了元组本身的值;参考写法是 print(f"t1: {t1}, 类型: {type(t1)}") 这样三行分别打印。

    提示(先自己想,实在想不出再点开)

    一级 · 思路:三个元组按题面写好(单元素那个别丢掉逗号),再一行一个地打印”元组本身 + 它的类型” 二级 · 方法:元组字面量 (元素1, 元素2, ...),只有一个元素时要写成 (元素,);类型用 type() 查 三级 · 骨架:print(f"t1: {t1}, 类型: {____(t1)}") / t3 = (10,____)

    参考答案(做完再点开)
    # 2-1
    t1 = (1, 2, 3, 4, 5)
    t2 = ("a", "b", "c")
    t3 = (10,)
    print(f"t1: {t1}, 类型: {type(t1)}")
    print(f"t2: {t2}, 类型: {type(t2)}")
    print(f"t3: {t3}, 类型: {type(t3)}")
  • 2-2 访问元组元素 创建文件 test_access.py,完成以下操作:

    • 创建元组 t = ("苹果", "香蕉", "橘子", "葡萄", "西瓜")
    • 打印第一个元素、最后一个元素
    • 打印索引 1 到 3 的切片

    批改(2026-09-28):✅ 正确(t[0] 得 苹果、t[-1] 得 西瓜,切片 t[1:3] 得 ('香蕉', '橘子'))。

    提示(先自己想,实在想不出再点开)

    一级 · 思路:和列表一样按下标取元素、按区间切一段,只是括号换成了小括号;最后一个元素从尾部数 二级 · 方法:t[0] 第一个、t[-1] 最后一个、t[开始:结束] 切片(含头不含尾) 三级 · 骨架:print(f"第一个: {t[____]}") / print(f"切片 [1:3]: {t[1:____]}")

    参考答案(做完再点开)
    # 2-2
    t = ("苹果", "香蕉", "橘子", "葡萄", "西瓜")
    print(f"第一个: {t[0]}") # 苹果
    print(f"最后一个: {t[-1]}") # 西瓜
    print(f"切片 [1:3]: {t[1:3]}") # ('香蕉', '橘子')
  • 2-3 元组拼接与重复 创建文件 test_concat.py,完成以下操作:

    • 创建元组 a = (1, 2, 3) 和 b = (4, 5, 6)
    • 用 + 拼接两个元组
    • 用 * 重复元组 3 次

    批改(2026-09-28):✅ 正确(拼接 (1, 2, 3, 4, 5, 6)、重复三次 (1, 2, 3, 1, 2, 3, 1, 2, 3),+ 和 * 都用对了)。

    提示(先自己想,实在想不出再点开)

    一级 · 思路:元组之间的拼接和重复跟字符串一样用加号和乘号;运算后拿到的是一个新元组,原来的没被改动 二级 · 方法:c = a + b 拼接、d = a * 3 重复 三级 · 骨架:c = a ____ b / d = a ____ 3

    参考答案(做完再点开)
    # 2-3
    a = (1, 2, 3)
    b = (4, 5, 6)
    c = a + b
    print(f"拼接: {c}") # (1, 2, 3, 4, 5, 6)
    d = a * 3
    print(f"重复: {d}") # (1, 2, 3, 1, 2, 3, 1, 2, 3)
  • 2-4 元组常用函数 创建文件 test_func.py,完成以下操作:

    • 创建元组 t = (3, 1, 4, 1, 5, 9, 2, 6)
    • 用 len() 计算长度
    • 用 max() 获取最大值
    • 用 min() 获取最小值

    批改(2026-09-28):✅ 正确(长度 8、最大值 9、最小值 1 都对)。

    提示(先自己想,实在想不出再点开)

    一级 · 思路:数个数、取最大、取最小都是内置函数,直接套在元组上 二级 · 方法:len(t) 长度、max(t) 最大值、min(t) 最小值 三级 · 骨架:print(f"长度: {____(t)}") / print(f"最大值: {____(t)}") / print(f"最小值: {____(t)}")

    参考答案(做完再点开)
    # 2-4
    t = (3, 1, 4, 1, 5, 9, 2, 6)
    print(f"长度: {len(t)}") # 8
    print(f"最大值: {max(t)}") # 9
    print(f"最小值: {min(t)}") # 1
  • 2-5 元组与列表转换 创建文件 test_convert.py,完成以下操作:

    • 创建列表 lst = [1, 2, 3, 4, 5]
    • 用 tuple() 将列表转换为元组
    • 创建元组 t = (6, 7, 8)
    • 用 list() 将元组转换为列表

    批改(2026-09-28):✅ 正确(列表转元组 (1, 2, 3, 4, 5)、元组转列表 [6, 7, 8] 都对;转换结果直接赋回 lst、t 两个变量,不影响结果)。

    提示(先自己想,实在想不出再点开)

    一级 · 思路:转换用与目标类型同名的内置函数,把要转的对象当参数传进去就行 二级 · 方法:tuple(lst) 列表转元组、list(t) 元组转列表 三级 · 骨架:t = ____(lst) / lst2 = ____(t2)

    参考答案(做完再点开)
    # 2-5
    lst = [1, 2, 3, 4, 5]
    t = tuple(lst)
    print(f"列表转元组: {t}") # (1, 2, 3, 4, 5)
    t2 = (6, 7, 8)
    lst2 = list(t2)
    print(f"元组转列表: {lst2}") # [6, 7, 8]
  • 2-6 元组遍历与删除 创建文件 test_iter.py,完成以下操作:

    • 创建元组 t = (10, 20, 30, 40, 50)
    • 用 for 循环遍历打印每个元素
    • 用 in 判断 30 是否在元组中
    • 用 del 删除整个元组,观察结果

    批改(2026-09-28):✅ 正确(for 循环逐个打印 10~50、30 in t 输出 True、del t 已执行);你是一行一个数字,参考答案用 print(x, end=" ") 挤在同一行,题面只要求”遍历打印每个元素”。

    提示(先自己想,实在想不出再点开)

    一级 · 思路:遍历就是用循环把元素一个个取出来打印;判断在不在用成员运算符;元组里的元素删不掉,但可以整个把元组删掉(删完再访问就会报错) 二级 · 方法:for x in t: 逐个遍历;30 in t 判断在不在;del t 删除整个元组 三级 · 骨架:for x in ____: / print(f"30是否在元组中: {30 ____ t}") / ____ t

    参考答案(做完再点开)
    # 2-6
    t = (10, 20, 30, 40, 50)
    # for 循环遍历
    for x in t:
    print(x, end=" ") # 10 20 30 40 50
    print()
    # in 判断
    print(f"30是否在元组中: {30 in t}") # True
    # del 删除
    del t
    # print(t) # 报错:NameError: name 't' is not defined
  • 2-7 元组不可变性验证 创建文件 test_immut.py,完成以下操作:

    • 创建元组 t = (1, 2, 3)
    • 尝试修改 t[0] = 10,观察报错信息
    • 用 id() 查看修改前后元组的内存地址

    批改(2026-09-28):⚠️ t = (1, 2, 3) 和两次 id() 都对(实测地址 2630688678976 → 2630688670400,重新赋值后确实是新对象),但修改那行 # t[0]=10 是注释掉的,没有实际跑过、也没记下报错信息;把注释去掉会得到 TypeError: 'tuple' object does not support item assignment。

    提示(先自己想,实在想不出再点开)

    一级 · 思路:元组的元素不能改,那一行真的跑起来会直接报错,把报错信息记下来;想制造”改动后”的样子只能整个重新赋值,再用内存地址验证它已经是另一个对象 二级 · 方法:t[0] = 10 会抛 TypeError: 'tuple' object does not support item assignment;看内存地址用 id(t) 三级 · 骨架:# t[0] = 10(去掉注释运行看报错)/ print(f"修改前地址: {____(t)}") / t = (10, 2, 3)(整个重新赋值)

    参考答案(做完再点开)
    # 2-7
    t = (1, 2, 3)
    print(f"修改前: {t}")
    print(f"修改前地址: {id(t)}")
    # 尝试修改会报错:TypeError: 'tuple' object does not support item assignment
    # t[0] = 10
    t = (10, 2, 3) # 重新赋值
    print(f"重新赋值后: {t}")
    print(f"重新赋值后地址: {id(t)}") # 地址不同,是新对象

评论区

[ 标签 ]
# AI37# AI 编程2# AI工具1# AI绘图1# AI辅助开发2# Ajax7# Apifox1# AstrBot3# Astro2# CC Switch1# CDN2# Claude Code1# claudecode2# ClaudeCode1# Cloudflare2# CloudFlare2# CloudFlare-ImgBed3# coc4# CSS10# DeepSeek6# deepseek2# DELETE1# Docker5# EdgeOne3# Gist1# git1# GitHub1# hexo-circle-of-friends1# HTML9# HTTP10# ImageManager1# Java23# java13# JavaScript11# JavaWeb113# JDBC7# JSON2# JUnit1# LangChain25# Linux4# Logback1# Maven17# Muse Spark1# Mybatis1# MyBatis18# MySQL45# MySql1# NapCat1# Node.js1# obsidian2# Obsidian5# OpenCode4# ORM1# PathVariable1# PicGo1# PyCharm1# Python70# RequestBody1# RequestMapping1# RESTful风格1# skills1# Slf4j1# SpringBoot37# SpringMVC5# SQL2# Streamlit5# Svelte2# TailwindCSS1# Telegram3# Tlias2# Vercel1# vscode2# Vue20# Waline3# Web3# WebDAV1# Web基础6# Web开发6# WinSCP1# YAML1# 三层架构1# 中二宣言1# 书籍1# 使用文档10# 写作1# 函数2# 刷步数1# 前端52# 动态1# 动漫1# 包1# 单词2# 博客8# 博客工作流1# 博客开发2# 参数接收1# 友链1# 反思2# 后端48# 图床6# 地图1# 备份2# 大模型1# 奇思妙想1# 存储1# 学习方法6# 学校1# 宝塔面板3# 宝宝10# 实战4# 对象1# 导航栏1# 工具2# 布局2# 开发1# 开发工具1# 开发规范1# 开心1# 异常处理1# 影视2# 微信1# 性能优化2# 总结1# 想法15# 感受1# 感悟11# 指南1# 提示词工程2# 插件5# 故障排除1# 效率工具2# 教程10# 数据分析9# 数据库27# 数据结构1# 文件操作2# 斩神1# 日常95# 日志框架1# 朋友圈1# 朱元璋1# 模块1# 模板1# 正则表达式2# 测试3# 游戏2# 爬虫7# 生活迁移1# 电影2# 电脑1# 碎碎念1# 视觉识别1# 类1# 类型注解1# 网络基础2# 网络教室1# 羊毛2# 脚本2# 脚本工具1# 自动化2# 蓝奏云1# 表单1# 订阅推荐2# 记录2# 评论系统1# 词根1# 词缀1# 说说1# 足迹1# 跑步2# 路径参数1# 转载2# 运动1# 部署11# 部落冲突1# 配置1# 随机图1# 面向对象5# 音乐3# 音标1# 项目实战11# 饮食1# 驼峰命名1# 高德地图1
[ 公告 ]

如果你喜欢,那么欢迎来到我的世界!

了解更多
[ 音乐 ]
封面

音乐

暂未播放

0:000:00
暂无歌词
找不到相关结果。
[ contents ]
[ 全部文章 ]