玩转python元组

介绍

元组是python的一个基本数据类型。元组和列表相似,可以存放任意数据类型。

只不过元组一旦被定义,其内部元素不支持修改和删除操作。故元组又被称为只读列表。

注意:元组本身不可变,如果元组中还包含其他可变元素,这些可变元素可以改变。

定义元组

# 方式一:括号+逗号(推荐)
size = (480, 230)

# 方式二:逗号
size = 480, 230

# 方式三:tuple(可迭代类型变量)
>>> size = tuple((230, 480))	# size = (480, 230)
>>> size = tuple([480, 230])	# size = (480, 230)
>>> size = tuple('123')			# size = ('1', '2', '3')

补充:元组的特征在于 , 而不是 ()

>>> a = 230,
>>> type(a)
<class 'tuple'>

# 如果单纯的 a = (230),此处的括号只是数学上的运算符而已,所包围的元素构不成一个元组。

索引访问元组

通过索引值访问元组中的元素,但是不允许通过索引值修改元组,否则报错。

>>> user = ('jack', 'cindy', 'frank')
>>> user[1]
'cindy'
>>> user[1]='egon'
Traceback (most recent call last):
  File "<pyshell#25>", line 1, in <module>
    user[1]='egon'
TypeError: 'tuple' object does not support item assignment

补充:当元组的元素是一个可变数据类型时,允许修改该元素的元素

>>> a = (1,2,3,[11,22,33],4)
>>> a[3][2]=44
>>> a
(1, 2, 3, [11, 22, 44], 4)

# 这是因为元组存放的是[11,22,44]这个列表的内存地址,这个列表内存地址是不变的存在元组中不允许被修改;但是该列表是可变,这个列表包含的元素的内存地址是存在另外一块空间里的,是可变的。

in not in 判断元素是否在元组中,返回布尔值

查看元组长度len()

>>> size = (480, 230)
>>> len(size)
2

删除元组 del

元组一旦定义,内部元素不允许被删除。但是可以通过 del 删除整个元组

>>> size = (480,320)
>>> del size
>>> size
Traceback (most recent call last):
  File "<pyshell#28>", line 1, in <module>
    size
NameError: name 'size' is not defined

切片

切片:从一个大的元组中copy出来一个子元组,原元组不变。同列表、字符串的切片用法一样。

# 切片总结:a[start:end:step]
# start :起始位置下标
# end :终止位置下标
# step :步长,正数表示从左往右;负数表示从右往左
# 总体原则:顾头不顾尾

内置方法

count(value) 返回数字

# count用于统计元组中value存在的个数;和列表的count()方法相同。

>>> size = (480, 320)
>>> size.count(320)
1
>>> size.count(1)
0

index(value, start, end) 返回索引

# index返回value在元组的最小索引值,可选参数start和end限定查找的范围。
# 当value不在查找的范围内,则报错。
# 该方法与列表、字符串的index方法完全一致。

补充

具名元组

具名元组(namedtuple)是元组(tuple)的一个兄弟。它和tuple类似,一旦被定义不能被修改。

但是namedtuple比tuple功能更丰富,支持类似字典的"键值对"形式的数据访问。

并且,namedtuple兼容tuple的语法使用。

定义:使用namedtuple 需要从collections模块中引入 namedtuple

>>> from collections import namedtuple
>>> Point = namedtuple('Point', 'x, y')	# 定义nametuple类Point,两个参数名:x,y
>>> p = Point(11, 22)	# 实例化p, 名字x代表11, 名字y代表22
>>> p
Point(x=11, y=22)
>>> p[1]			# 与tuple兼容,可通过索引访问元素
22
>>> p[1]=33			# 也不支持修改元素值
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    p[1]=33
TypeError: 'Point' object does not support item assignment
>>> p.x				# 支持通过名字访问元素,更简洁
11
>>> type(p.x)
<class 'int'>
>>> p._asdict()		# 将namedtuple转化为有序字典
OrderedDict([('x', 11), ('y', 22)])
>>> d = p._asdict()
>>> Point._make(**d)		# 可以通难过字典创建namedtuple
Point(x=11, y=22)
>>> p._replace(x=120)	# _replace与字符串replace()方法一样,返回一个替换新元素的namedtuple
Point(x=120, y=22)

# 总结:
# 1:先定义namedtuple类再使用这个类实例化一个namedtuple对象;
# 2:namedtuple对象有 定义时的属性名,直接通过(.属性名)的方式访问数据。
# 3:namedtuple对象还有 _asdict(),_replace()方法使用
# 4:namedtuple类有 _make()方法使用
posted @ 2020-02-26 22:30  the3times  阅读(361)  评论(0编辑  收藏  举报