python进阶系列-02 元组

107 阅读4分钟

元组不可变!不可变!不可变!

元组是有序且不可变的对象的集合。 元组是与列表类似,主要区别在于不变性。 在 Python 元组中 用圆括号和逗号分隔值编写。例如:

my_tuple = ("Max", 28, "New York")

使用元组而不是列表的原因

  • 一般用于相关性的对象。
  • 对异构(不同)数据类型使用元组,对同质(相似)数据类型使用列表。
  • 由于 tuple 是不可变的,所以遍历 tuple 比使用 list 稍快。
  • 具有不可变元素的元组可以用作字典的键。 这对于列表是不可能的。
  • 如果有不变的数据,将其实现为元组可以写保护,不被轻易污染。

创建

元组可以使用圆括号和逗号分隔值。 也可以使用内建的元组函数。

代码:

tuple_1 = ("Max", 28, "New York")
tuple_2 = "Linda", 25, "Miami"
# 括号可以省略
# 特殊情况:只有一个元素的元组需要有逗号结尾,否则它不会被认为是元组
tuple_3 = (25,)
print(tuple_1)
print(tuple_2)
print(tuple_3)
# 或者使用内建的元组函数将可迭代对象转换为元组
tuple_4 = tuple([1, 2, 3])
print(tuple_4)

结果:

('Max', 28, 'New York')
('Linda', 25, 'Miami')
(25,)
(1, 2, 3)

获取元素

你可以通过索引来获取元组中的元素。 请注意,索引号从 0 开始。

代码:

tuple_1 = ("Max", 28, "New York")
item = tuple_1[0]
print(item)
# 你也可以使用负数索引,例如 -1 指向最后一个元素
item = tuple_1[-1]
print(item)

结果:

Max
New York

增加或者改变

尝试改变元组将会引发 TypeError

代码:

tuple_1 = ("Max", 28, "New York")
tuple_1[2] = "Boston"

结果:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-5-c391d8981369> in <module>
----> 1 tuple_1[2] = "Boston"
TypeError: 'tuple' object does not support item assignment

删除

代码:

tuple_2 = "Linda", 25, "Miami"
del tuple_2

迭代

代码:

tuple_1 = ("Max", 28, "New York")
for i in tuple_1:
    print(i)

结果:

Max
28
New York

是否包含某个元素

代码:

tuple_1 = ("Max", 28, "New York")
if "New York" in tuple_1:
    print("yes")
else:
    print("no")

结果:

yes

常用方法

代码:

my_tuple = ('a', 'p', 'p', 'l', 'e',)
# len(): 返回元组中元素的个数
print(len(my_tuple))

# count(x): 返回值等于 x 的元素的个数
print(my_tuple.count('p'))

# index(x): 返回值等于 x 的元素的第一个索引
print(my_tuple.index('l'))

# 重复
my_tuple = ('a', 'b') * 5
print(my_tuple)

# 元组可以使用 + 操作符进行连接
my_tuple = (1, 2, 3) + (4, 5, 6)
print(my_tuple)

# 将列表转换为元组
my_list = ['a', 'b', 'c', 'd']
list_to_tuple = tuple(my_list)
print(list_to_tuple)

tuple_to_list = list(list_to_tuple)
print(tuple_to_list)

# 将字符串转换为元组
string_to_tuple = tuple('Hello')
print(string_to_tuple)

结果:

5
2
3
('a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b')
(1, 2, 3, 4, 5, 6)
('a', 'b', 'c', 'd')
['a', 'b', 'c', 'd']
('H', 'e', 'l', 'l', 'o')

切片

获取元组中的一部分元素,可以使用切片操作符(:)。

代码:

# 语法:a[start:stop:step] 其中 start 和 stop 是整数,step 是正整数
a = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
b = a[1:3]  # 取索引为 1,2 的元素
print(b)

b = a[2:]  # 取索引为 2 和之后的元素
print(b)

b = a[:3]  # 取索引为 0,1,2 的元素
print(b)

b = a[::2]  # 取索引为 0,2,4,6,8 的元素
print(b)

b = a[::-1]  # 取索引为 10,9,8,7,6,5,4,3,2,1 的元素
print(b)

结果:

(2, 3)
(3, 4, 5, 6, 7, 8, 9, 10)
(1, 2, 3)
(1, 3, 5, 7, 9)
(10, 9, 8, 7, 6, 5, 4, 3, 2, 1)

元组解包

代码:

# 变量个数必须与元组元素个数匹配
tuple_1 = ("Max", 28, "New York")
name, age, city = tuple_1
print(name)
print(age)
print(city)

# 使用 * 可以将元组解包为列表
my_tuple = (0, 1, 2, 3, 4, 5)
item_first, *items_between, item_last = my_tuple
print(item_first)
print(items_between)
print(item_last)

结果:

Max
28
New York
0
[1, 2, 3, 4]
5

嵌套元组

元组中可以包含其他元组(或其他容器类型)。

代码:

a = ((0, 1), ('age', 'height'))
print(a)
print(a[0])

结果:

((0, 1), ('age', 'height'))
(0, 1)

比较元组和列表

元组的不变性使 Python 能够进行内部优化。 因此,在处理大数据时,元组可以更有效。

代码:

# 比较元组和列表的占用内存
import sys

my_list = [0, 1, 2, "hello", True]
my_tuple = (0, 1, 2, "hello", True)
print(sys.getsizeof(my_list), "bytes")
print(sys.getsizeof(my_tuple), "bytes")

# 比较列表和元组的创建时间
import timeit

print(timeit.timeit(stmt="[0, 1, 2, 3, 4, 5]", number=1000000))
print(timeit.timeit(stmt="(0, 1, 2, 3, 4, 5)", number=1000000))

结果:

104 bytes
88 bytes
0.12474981700000853
0.014836141000017733

小节

上面分享了元组tuple的主要特性,希望对你有所帮助。

最后,请大家记住元组不可变不可变不可变

欢迎大家点赞、收藏,支持!

pythontip 出品,Happy Coding!

公众号: 夸克编程