元组不可变!不可变!不可变!
元组是有序且不可变的对象的集合。 元组是与列表类似,主要区别在于不变性。 在 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!
公众号: 夸克编程