python数据类型-3-容器类型-元组 元组真的不可变么?

python数据类型-2-容器类型-元组

一.说明

在python数据类型系列文章中已经介绍了 基础数据类型,容器类型 列表,这篇文章我们来介绍容器类型中的另一类型

元组(tuple)

二.tuple(元组)

1.定义

1.元组是一个有序的、不可变的集合;

2.元组可以包含不同类型的元素;

3.元组可以包含重复元素;

2.元组使用圆括号 () 定义,元素之间用逗号 , 分隔。

2.特性

1.有序性:元组中的元素按插入顺序排列,索引从 0 开始。

2.不可变性:元组一旦创建后不能修改,即不能添加、删除或更改其元素。虽然元组本身不可变,但如果其中的元素是可变的(如列表),则这些可变元素可以被修改。

3.允许重复:元组可以包含重复的元素。

3.创建元组
# 创建一个包含多个元素的元组
my_tuple = (1, 2, 3, 'a', 'b')
#创建单个元素的元组时,需要在元素后面加上逗号,
single_element_tuple = (1,)  # 这是一个元组
not_a_tuple = (1)            # 这是一个整数
#使用 tuple() 函数 从其他可迭代对象(如列表、字符串、集合等)创建元组
my_tuple1=tuple(range(0,10))
my_tuple2=tuple([1,2,3])

print(my_tuple1)
print(my_tuple2)

string_example = "hello   World!"
my_tuple_from_string = tuple(string_example)
print(my_tuple_from_string)  #('h', 'e', 'l', 'l', 'o', ' ', ' ', ' ', 'W', 'o', 'r', 'l', 'd', '!')
#嵌套元组
nested_tuple = ((1, 2), (3, 4), (5, 6))
print(nested_tuple)  # 输出: ((1, 2), (3, 4), (5, 6))
print(nested_tuple[1])  # 输出: (3, 4)
print(nested_tuple[1][0])  # 输出: 3
#切片
my_tuple3 = (1, 2, 3, 4, 5)
sub_tuple = my_tuple3[1:4]  # 获取索引 1 到 3 的元素
print(sub_tuple)  # 输出: (2, 3, 4)
#创建多个元组
tuples = tuple((x, x**2) for x in range(5))
print(tuples)  # 输出: ((0, 0), (1, 1), (2, 4), (3, 9), (4, 16))
#使用元组进行解包
my_tuple = (1, 2, 3)
a, b, c = my_tuple
print(a, b, c) 

这里有几个隐藏概念,我来一一说明清楚?

1.元组一旦创建就不可改变?真的这样么?

元组的特性中可以包含不同类型的元素,那么包含可变元素呢?如对象?

那么元组这种不可变性是针对什么?

因为这种不可变是针对 元素的内存引用,你不能改变内存引用指向

my_tuple = (1, 2, [3, 4])
my_tuple[2][0] = 99  # 修改元组中的可变元素
my_tuple[2].append("这个是不是改变了?")
print(my_tuple)  # 输出: (1, 2, [99, 4, '这个是不是改变了?'])
2.定义单个元素的元组为什么要 在元素后面加“,”?

很简单:not_a_tuple = (1) 如果不加 如何区别这是一个整数1 ?

4.获取元组元素
my_tuple = (1, 2, 3, 'a', 'b')
print(my_tuple[0])  # 输出: 1
print(my_tuple[3])  # 输出: 'a'
print(my_tuple[-1])  # 输出: 'b'
print(my_tuple[1:4]) # 输出:(2, 3, 'a')
5.常用的操作和方法
#连接
tuple1 = (1, 2)
tuple2 = (3, 4)
combined = tuple1 + tuple2  # (1, 2, 3, 4)

#重复
repeated = (1, 2) * 3  # (1, 2, 1, 2, 1, 2)

#切片
my_tuple = (1, 2, 3, 'a', 'b','a','2')
print(my_tuple[1:4]) # 输出:(2, 3, 'a')

#计数和索引
count_a = my_tuple.count('a')  # 统计 'a' 出现的次数
print(count_a)
index_a = my_tuple.index('a')  # 获取 'a' 的索引
print(index_a)

print('a' in my_tuple) #True
print('z' in my_tuple) #False
# index_z = my_tuple.index('z')  # 报错

#删除元组
del my_tuple
print(my_tuple) #报错

#迭代器 函数enumerate()
my_list = [1, 2, 3, 'a', 'b','a','2']
a = enumerate(my_list)

# print(list(a)) #[(0, 1), (1, 2), (2, 3), (3, 'a'), (4, 'b'), (5, 'a'), (6, '2')]
# print(tuple(a)) #()

print(tuple(a)) #((0, 1), (1, 2), (2, 3), (3, 'a'), (4, 'b'), (5, 'a'), (6, '2'))
print(list(a)) #[]

元组因为涉及的特殊性,要讨论的不是操作和方法?而是用途?

但这里有一个细节,就是迭代器enumerate() 一旦被调用 其元素就被消耗,之后无法使用!

#迭代器 函数enumerate()
my_list = [1, 2, 3, 'a', 'b','a','2']
a = enumerate(my_list)

#print(list(a)) #[(0, 1), (1, 2), (2, 3), (3, 'a'), (4, 'b'), (5, 'a'), (6, '2')]
#print(tuple(a)) #()  一但被调用a就被消耗,再次调用已没有元素

print(tuple(a)) #((0, 1), (1, 2), (2, 3), (3, 'a'), (4, 'b'), (5, 'a'), (6, '2'))
print(list(a)) #[] 一但被调用a就被消耗,再次调用已没有元素
6.元组的用途 或者说使用场景 这一概念才是元组的核心

1.解包

#使用元组进行解包
my_tuple = (1, 2, 3)
a, b, c = my_tuple
print(a, b, c) 

2.函数返回多个值

def min_max(numbers):
    return (min(numbers), max(numbers))

result = min_max([3, 5, 1, 4, 2])
print(result)  # 输出: (1, 5)

3.函数参数

def add(a, b):
    return a + b

params = (3, 5)
result = add(*params)  # 解包元组
print(result)  # 输出: 8

4.数据库操作

query = "INSERT INTO users (name, age) VALUES (%s, %s)"
data = ("Alice", 30)
cursor.execute(query, data)

5.数据结构 特别是3位场景 会大量用到(x,y,z)

# 表示一个点的坐标
point = (10, 20)

# 表示一个颜色 (红, 绿, 蓝)
color = (255, 0, 0)  # 红色

6.作为字典的键

locations = {}
locations[(10, 20)] = 'Point A'
locations[(30, 40)] = 'Point B'
print(locations)  # 输出: {(10, 20): 'Point A', (30, 40): 'Point B'}

7.矩阵或表格数据

matrix = (
    (1, 2, 3),
    (4, 5, 6),
    (7, 8, 9)
)
print(matrix[1][2])  # 输出: 6

8.遍历和枚举

data = [(1, 'Alice'), (2, 'Bob'), (3, 'Charlie')]
for id, name in data:
    print(f'ID: {id}, Name: {name}')

9.确保数据结构的内容不会被意外修改

三.总结

因为元组的特性,即不可变性,所以我们对元组这一概念的学习重点应该放在使用场景中这就是为什么我会对元组的使用场景进行详细介绍,所以针对元组,我们就讲到这,有讲的不足地方,欢迎大家补充,我来更新!

创作不易,喜欢的话点点关注 点点赞,再次_感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SEEONTIME

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

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

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

打赏作者

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

抵扣说明:

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

余额充值