一、元组
1、元组的定义
在Python中,元组由内置的tuple类型定义。
创建元组,需要将所有的元组放在圆括号( )内,以逗号分隔。
构造只有一个元素的元组时,括号内只包含一个元素是不够的,需要在其后面加上一个逗号
t=(1) # 改变优先级 int/str/float ;
t=(1,) # 元组类型;
元组中的元素可以有任意多个,并且可以是不同类型的(例如:数字、字符串、列表等):
>>> t = () # 空元组
>>>
>>> t = ('P', 'y') # 字符串类型元组
>>>
>>> t = (1, 5.5, 'Python') # 混合类型元组
>>>
>>> t = (6, 'Hello', ('P', 'y')) # 嵌套元组
>>>
>>> t = 1, 5.5, 'Python' # 元组可以没有括号,称为元组包装
>>> t
(1, 5.5, 'Python')
>>>
>>> a, b, c = t # 元的多元赋值(解包)
>>> a
1
>>> b
5.5
>>> c
'Python'
加法和乘法仍然是可以;
t2 =(2,)
t2+t2 | (2, 2)
t2*3 | (2, 2, 2)
2、更改元组
元组是不可变的,也就是说,元组中的元素在被赋值后不能改变。
但是,如果元素本身是一个可变数据类型(例如列表和字典),那么其嵌套项可以被改变,但是id不发生变化
socres = (72, 88, 76, 92, 90, [80,98])
print(id(socres))
socres[5][1] = 99 # 可变元素内部可以改变,但是不能修改不可变元素
print(id(socres))
print(socres)
140423660050256
140423660050256
(72, 88, 76, 92, 90, [80, 99])
3、删除元组
如上所述,不能更改元组中的元素,这也意味着无法删除元组中的元素。
但如果元素本身是一个可变数据类型,那么其嵌套项是可以被删除的,而且使用关键字 del 可以删除整个元组:
socres = (72, 88, 76, 92, 90, [80,98])
# del socres[2] # 不能删除元素
#TypeError: 'tuple' object doesn't support item deletion
del socres[5][1] # 可变元素的嵌套项可以被删除
print(socres) #(72, 88, 76, 92, 90, [80])
del socres # 删除整个元组
print(socres) # NameError: name 'socres' is not defined
4、列表和元组之间的转换
列表和元组之间可以相互转换,分别使用 tuple() 和 list() 来实现
>>> l = ['H', 'e', 'l', 'l', 'o']
>>> tx = tuple(l) # 列表转元组
>>> tx
('H', 'e', 'l', 'l', 'o')
>>>
>>> t = ('P', 'y')
>>> lx = list(t) # 元组转列表
>>> lx
['P', 'y']
二、命名元组
1.顾名思义,就是带有名字的元组,这是什么意思呢?就是取值时不再需要通过下标索引的方式来获取了,可以直接通过字段名来获取值。
定义方式:
collections.namedtuple(typename, field_names)
typename:类名称
field_names: 元组中元素的名称
field_names可以是空白符或逗号分隔的字段的字符串,可以是字段的列表
from collections import namedtuple
# 定义namedtuple类
User = namedtuple("User", 'name gender height weight')
# 或者
# User = namedtuple("User", ['name', 'gender', 'height', 'weight'])
# 初始化namedtuple实例对象
user = User(name="jack", gender="female", height=170, weight=120)
user.name #'jack'
user.gender #'female'
定义 namedtuple 时,**第一个参数就是元组的名字,**这里很像我们自定义类中的类名,第二个参数是用空格隔开的字符串(也可以是字符串组成的列表),代表元组中的4个字段,相当于类中的4个属性。
namedtuple其实是继承 tuple 的一个子类,它保留了 tuple 的特性,比如通过索引获取元素,切片功能,同样地,字段不能重新赋值。