元组(Tuple)

在 Python 中,元组与列表似,区别在于元组一旦创建就不可更改(即不可变)。具有可哈希元素的元组是可哈希的,因此可以作为字典的键或集合的成员。

概述

Python 中元组的基本用法:

tup1 = (1, 'a')
tup2 = 1, 'a  # 不需要括号
tup3 = (1,)  # 单元素元组
tup4 = 1,    # 不带括号的单元素元组
tup5 = ()     # 空元组
list1 = [1, 'a']
it1, it2 = tup1  # 解包,按值分配
print(tup1 == tup2)  # True
print(tup1 is tup2)  # False
print(tup1 == list1)  # False
print(tup1 == tuple(list1))  # True
print(list(tup1) == list1)  # True
print(tup1[0])  # 第一个元素
for item in tup1:
    print(item)  # 迭代
print((1, 2) + (3, 4))  # (1, 2, 3, 4)
print(tup1 * 2)  # (1, 'a', 1, 'a')
tup1 += (3,)  # 元组和字符串连接的方式相似
print(tup1)  # (1, 'a', 3), 尽管是不可变的

# * 从文档中引用: "对于不可变目标(如字符串、数字和元组),更新后的值会计算出来,但不会赋值回输入变量。"

print(len(tup1))  # 元素数量
print(3 in tup1)  # 成员测试 - True
tup6 = ([1, 2],)
tup6[0][0] = 3
print(tup6)  # 元组中的列表是可变的
set1 = set((1, 2))  # 可以放入集合
#set1 = set(([1, 2], 2))  # 错误:列表使其变为不可哈希
def foo():
    return 6, 9  # 返回多个值,作为一个元组
r1, r2 = foo()  # 接收多个值
print(f'r1 is {r1}, r2 is {r2}')

元组的语法

元组可以直接创建或从列表转换。通常,元组使用圆括号括起来。

l = [1, 'a', [6, 3.14]]
t = (1, 'a', [6, 3.14])
print(t)
(1, 'a', [6, 3.14])

tuple(l)
(1, 'a', [6, 3.14])

t == tuple(l)
True

t == l
False

单元素元组

单元素元组通过元素后加逗号并用括号包围来创建:

t = ('A single item tuple',)
print(t)
('A single item tuple',)

打包和解包

你可以使用元组进行多重赋值:

article, noun, verb, adjective, direct_object = ('A', 'tuple', 'needs', 'no', 'parens')
print(noun)  # 输出 'tuple'

"元组解包" 就是将元组解开并将其值分配给左边的变量。相反的操作是 "元组打包",即 t = article, noun, verb, adjective, direct_object

元组操作

元组操作与列表似,但不允许给索引或切片赋值,并且没有 "append" 操作符。

a = (1, 2)
b = (3, 4)
print(a + b)  # (1, 2, 3, 4)
print(a)  # (1, 2)
print(b)  # (3, 4)

# 尝试 append 操作会报错
a.append(3)  # 报错:'tuple' object has no attribute 'append'

# 不能修改元组中的元素
a[0] = 0  # 报错:object does not support item assignment
print(a)  # (1, 2)

对于列表来说,以上代码可以正常运行。

元组的属性

元组的长度可以使用 len() 方法来获取:

print(len((1, 2, 3)))  # 3
a = (1, 2, 3, 4)
print(len(a))  # 4

型转换

将列表转换为元组:

l = [4, 5, 6]
print(tuple(l))  # (4, 5, 6)

将元组转换为列表:

t = (4, 5, 6)
print(list(t))  # [4, 5, 6]

字典也可以通过 items() 方法转换为元组的元组:

d = {'a': 1, 'b': 2}
print(tuple(d.items()))  # (('a', 1), ('b', 2))

元组的用途

元组可以代替列表使用,尤其是在项的数量已知且较少的情况下,例如当从函数返回多个值时。许多其他编程语言需要创建一个对象或容器来返回多个值,但在 Python 中,通过元组赋值,多个返回值变得非常简单:

def func(x, y):
    # 计算 x 和 y
    return x, y

x, y = func(1, 2)

使用列表推导式处理元组元素

有时需要在元组中操作其值并创建一个新元组。例如,如果我们想将元组中的所有值都乘以 2,可以结合使用列表推导式和元组操作:

def double(T):
    'double() - 返回一个包含每个元组元素乘以 2 的元组。'
    return tuple([e * 2 for e in T])

练习

  1. 创建列表 ['a', 'b', 'c'],然后从该列表创建一个元组。
  2. 创建元组 ('a', 'b', 'c'),然后从该元组创建一个列表。
  3. 在一行代码中同时创建 a = 'a', b=2, c='gamma'
  4. 创建一个仅包含单个元素的元组,该元素是一个包含三个元素 'a', 'b' 和 'c' 的元组。通过使用 len() 函数验证该元组的长度是否为 1。
Last modified: Thursday, 30 January 2025, 11:37 PM