Python入门(2-2):元组

目录

1  元组简介

2  元组

2.1  创建元组

元组特性

2.2  元组操作

访问元素

元组拼接

重复元组

比较元组

 zip函数与元组

2.3  元组的方法

1  count

2  index

2.4  元组和列表对比

2.5  元组解包

基本解包

扩展解包(Python 3+)

函数返回多值

2.6  元组与不可变性

不可变性的含义

不可变性的优势

2.7  元组推导式

2.8  实际应用场景

1. 函数返回多个值(返回值用逗号隔开,返回的是一个元组)

2. 字典键

3. 格式化字符串

4. 数据保护

3  元组使用常见问题与解决方案

问题1:修改元组

问题2:单元素元组

问题3:性能误区

4  元组内部实现原理

5  元组与函数式编程


1  元组简介

        与列表一样,元组也是序列,唯一的差别在于元组是不能修改的,另外,字符串也是不能修改的​。

        与列表相比,除创建和访问其元素外,可对元组执行的操作不多。元组的创建及其元素的访问方式与其他序列相同。

为何要熟悉元组呢❓原因有以下两个。

  • 它们用作映射(就是字典{key: value}的形式)中的键(以及集合的成员)​,而列表不行。
  • 有些内置函数和方法返回元组,这意味着必须跟它们打交道。只要不尝试修改元组,与元组“打交道”通常意味着像处理列表一样处理它们(需要使用元组没有的index和count等方法时例外)​。

2  元组

2.1  创建元组

# 空元组
t1 = ()
t2 = tuple()

# 单元素元组(注意逗号)
t3 = (42,)  # 必须加逗号
t4 = 42,    # 括号可选,逗号必需

# 多元素元组
t5 = (1, 2, 3)
t6 = 1, 2, 3  # 括号可选
t7 = tuple([1, 2, 3])  # 从可迭代对象创建

# 元组解包
a, b, c = (1, 2, 3)  # a=1, b=2, c=3

元组特性

  • 不可变性:创建后不能修改

  • 有序性:元素保持插入顺序

  • 异构性:可以包含不同类型的元素

  • 可哈希性:可作为字典的键(当所有元素都可哈希时)

2.2  元组操作

访问元素

t = ('a', 'b', 'c', 'd', 'e')

# 索引访问
print(t[0])   # 'a'
print(t[-1])  # 'e'(负索引从末尾开始)

# 切片操作
print(t[1:3])  # ('b', 'c')
print(t[::2])  # ('a', 'c', 'e')(步长2)

元组拼接

t1 = (1, 2)
t2 = (3, 4)
combined = t1 + t2  # (1, 2, 3, 4)

重复元组

t = ('a', 'b')
repeated = t * 3  # ('a', 'b', 'a', 'b', 'a', 'b')

比较元组

# 按元素顺序比较
(1, 2) < (1, 3)  # True
(1, 2, 3) < (1, 2)  # False(前者更长)

 zip函数与元组

names = ['Alice', 'Bob']
scores = [85, 92]
paired = list(zip(names, scores))  # [('Alice', 85), ('Bob', 92)]

2.3  元组的方法

由于不可变性,元组只有两个内置方法:

1  count

功能:返回元素来元组中出现的次数

参数:1个。

  • element:待计数的元素

返回值:一个整数。其值为待计数元素的个数

2  index

功能:返回元素第一次出现的索引

参数:1个。

  • element:待查找的元素

返回值:一个整数。其值为待查找元素的索引下标

2.4  元组和列表对比

特性元组列表
可变性不可变可变
语法圆括号(可选)方括号
性能更快(创建和访问)稍慢
内存更节省内存占用更多内存
用途固定数据、字典键动态数据
方法只有count()和index()多种方法

2.5  元组解包

基本解包

point = (10, 20)
x, y = point  # x=10, y=20

扩展解包(Python 3+)

values = (1, 2, 3, 4, 5)
a, b, *rest = values  # a=1, b=2, rest=[3,4,5]
first, *middle, last = values  # first=1, middle=[2,3,4], last=5

函数返回多值

def get_stats(numbers):
    return min(numbers), max(numbers), len(numbers)

minimum, maximum, length = get_stats([1, 2, 3])

2.6  元组与不可变性

不可变性的含义

  • 元组一旦创建,不能添加、删除或修改元素

  • 但若元素本身是可变对象(如列表),其内容可修改

t = (1, [2, 3], 4)
t[1].append(5)  # 合法:t变为 (1, [2, 3, 5], 4)
# t[0] = 10     # 非法:TypeError

不可变性的优势

  1. 线程安全

  2. 可哈希(可作为字典键)

  3. 保护数据不被意外修改

  4. 性能优化(Python 会缓存小元组)

2.7  元组推导式

Python 没有真正的"元组推导式",但可以使用生成器表达式:

# 生成器表达式转元组
t = tuple(x**2 for x in range(5))  # (0, 1, 4, 9, 16)

# 类似列表推导式语法(实际是生成器表达式)
t = (x for x in range(5))  # 这是一个生成器对象,不是元组

2.8  实际应用场景

1. 函数返回多个值(返回值用逗号隔开,返回的是一个元组)

def get_user_info(user_id):
    # 从数据库获取数据
    return name, age, email  # 作为元组返回

2. 字典键

locations = {
    (35.6895, 139.6917): "Tokyo",
    (40.7128, -74.0060): "New York"
}

3. 格式化字符串

person = ('Alice', 25)
print("%s is %d years old" % person)  # 旧式格式化
print(f"{person[0]} is {person[1]} years old")  # f-string

4. 数据保护

def process_data(data):
    # 确保输入数据不被修改
    data = tuple(data)
    # 处理数据...

3  元组使用常见问题与解决方案

问题1:修改元组

t = (1, 2, 3)
# t[0] = 10  # 错误

# 解决方案:创建新元组
t = (10,) + t[1:]

问题2:单元素元组

not_a_tuple = (42)    # 这是一个整数
is_a_tuple = (42,)    # 这才是单元素元组

问题3:性能误区

# 频繁拼接元组效率低(每次拼接都创建新对象)
t = ()
for i in range(1000):
    t += (i,)  # 低效

# 更高效的做法
items = []
for i in range(1000):
    items.append(i)
t = tuple(items)

4  元组内部实现原理

Python 的元组实现特点:

  • 固定大小的数组存储元素

  • 小整数范围内的元组会被缓存(如 (1,2,3) 可能被复用)

  • 比列表少一个过度分配的机制(因为不可变)


5  元组与函数式编程

元组常用于函数式编程模式:

# 不可变数据结构
point = (2, 3)
moved_point = (point[0]+1, point[1]+2)  # (3, 5)

# 高阶函数中使用
coordinates = [(1,2), (3,4), (5,6)]
sum_x = sum(x for x, y in coordinates)

如果您觉得本文章对您有帮助,别忘了点赞、收藏加关注,更多干货内容将持续发布,您的支持就是作者更新最大的动力。本专栏将持续更新,有任何问题都可以在评论区讨论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

满怀1015

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值