Python中的元组(tuple)属于不可变数据类型,即定义后不能修改,包括新增元素,删除元素或修改元素的值。
tuple中的每一项使用英文半角的逗号进行分隔,并且所有元素值放在一对英文半角的圆括号中“()”,tuple中每一项的数据类型可以不同。
>>> t1 = (1, 2, 3, 1)
>>> print(t1)
(1, 2, 3, 1)
>>>
从上面的例子中,我们还可以知道,tuple中的元素值可以相同,如上面的例子 t1中有两个 1.
tuple类型也可以像下面这种方式进行定义:
>>> t2 = 1, 2, 3, None, "Python"
>>> print(t2)
(1, 2, 3, None, 'Python')
>>>
也就是说,在省略圆括号时,Python也把具有逗号分隔的多个值视为tuple类型,同时,None 也可以是tuple的元素。
这个例子也向我们说明了,Python中的tuple可以具有不同数据类型的数据,如上面的数值类型,字符串类型和None类型。
>>> t3 =(('001', '张涛'), ('002', '刘红', 23))
>>> print(t3)
(('001', '张涛'), ('002', '刘红', 23))
>>>
Python中的tuple类型可以为空,即没有任何元素:
>>> t4 = ()
>>> print(t4)
()
>>>
但是在定义tuple类型时,只有一个元素且没有逗号时,Python将会把该数据解释成简单的数据类型,如:
>>> t5 = (10)
>>> print(t5)
10
>>> print(type(t5))
<class 'int'>
>>>
也就是说,并没有像用户期待的输出(10),同时,通过使用type来判断t5的类型发现,t5 是int类型的,这与直接使用 t5 = 10的效果相同。
对于其它类型也有相同的效果,下面给出了几个例子:
>>> t6 = (12.3)
>>> print(t6, type(t6))
12.3 <class 'float'>
>>> t7 = ("Hello")
>>> print(t7, type(t7))
Hello <class 'str'>
>>>
如果tuple中确只有一个元素值,可以使用在其值后加逗号的方式来定义:
>>> t8 = (12.3,)
>>> print(t8, type(t8))
(12.3, ) <class 'tuple'>
>>> t9 = ('Hello', )
>>> print(t9, type(t9))
('Hello', ) <class 'tuple'>
>>>
我们可以使用tuple元素的索引来访问元素值,其索引从0开始到tuple的长度-1(即元素个数-1)。访问的语法格式如下:
tuple_name[索引值]
在使用时索引值不能越界,即当以正数索引访问时,索引的最大值为:元素个数 - 1,超过此值将会引发 IndexError的错误;当以负数索引进行访问时,索引的最小值是: -元素个数,比此值再小时也会引发 IndexError 错误。
t10 = (1, 2, 3, 4, 5)
print(t10[0]) # 输出 1
print(t10[2]) # 输出 3
print(t10[4]) # 输出 5
print(t10[5]) # 索引越界,引发异常
print(t10[-1]) # 输出 5
print(t10[-4]) # 输出 2
print(t10[-5]) #输出 1
print(t10[-6]) #索引越界,引发异常
以上在Python3.8.2中的输出如下:
从以上可以看出,索引不在有效范围内时将引发:IndexError 异常,告知:tuple index out of range(元组索引超出范围)。
下面再介绍一下嵌套元组的访问方法:
>>> t11 = (1, 2, (3, 4), (5, 6, 7))
>>> t11[0]
1
>>> t11[2][0]
3
>>> t11[3][2]
7
>>> t11[-2][1]
4
>>> t11[-2][-2]
3
>>> t11[3][-2]
6
>>>
从以上各例可以看出,我们可以灵活使用正数索引和负数索引来访问元组中不同的元素值。
我们可以使用切边功能创建一个子元组,即通过切片获取元组中的部分值。切片的基本语法格式为:
tuple_name[ start : end : step ]
根据实际操作情况,三个索引都可以有选择的使用。
下面使用具体的例子来介绍具体使用方法:
>>> t = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
>>> t1 = t[2 : ] # 截取从索引2开始到最后的所有元素值
>>> print(t1)
(3, 4, 5, 6, 7, 8, 9, 10)
>>> t2 = t[ :7] #从开头到索引7停止,注意不含 索引7处的值
>>> print(t2)
(1, 2, 3, 4, 5, 6, 7)
>>> t3 = t[2 : 8] # 从索引2开始到索引8停止,不含8处的值
>>> print(t3)
(3, 4, 5, 6, 7, 8)
>>> t4 = t[ 3 : 9 : 2] # 从索引3到索引9 每2个取1个值
>>> print(t4)
(4, 6, 8)
>>> t5 = t[-5: ] # 从后端进行索引
>>> print(t5)
(6, 7, 8, 9, 10)
>>> t6 = t[ : -5] # 截止到索引-5,不含-5
>>> print(t6)
(1, 2, 3, 4, 5)
>>> t7 = t[ -8 : -3 ] # 从索引 -8 截取到 -3
>>> print(t7)
(3, 4, 5, 6, 7)
>>> t8 = t[-8 : -3 : 2] # 从索引 -8 截取到 -3,每2个取1个
>>> print(t8)
(3, 5, 7)
>>> t9 = t[-3 : -8 : -2] # 从索引-3 开始到索引-8,从后往前每2截取1
>>> print(t9)
(8, 6, 4)
>>> t10 = t[9 : 2 : -2] # 从索引9到索引2,从后往前每2截1
>>> print(t10)
(10, 8, 6, 4)
>>>
以上各例演示了实际中可能用到的切片方式,特别需要注意:
(1)start 处的值包含在截取结果中,end 指定的是截止位置,end 处的值不含在截取结果中;
(2)在不指定 step 时,start 指定的索引只有在逻辑上处于end的左侧或与end相等时才会截取到值;
(2)step指定的截取步,可以理解为 每 step 个截取1个,不能理解为每隔 step 进行截取;
(3)step为正值时是从左往右进行截取,start逻辑上必须在end的左侧才会截取到结果;
(4)step为负值时是从右往左截取,start逻辑上必须在end的右侧才会截取到结果,如例子中的 t9和t10.
(5)start ,end 和 step 的值都可以省略,省略时,start = 0, end = len(t) - 1, step = 1,但是冒号不能省,
如下几个例子:
>>> t11 = t[ : ]
>>> print(t11)
(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
>>> t11 = t[ : : ]
>>> print(t11)
(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
>>> t11 = t[] # 企图连冒号都要省
SyntaxError: invalid syntax
>>>
当把冒号都省略时会出现语法错误:无效的语法格式
以上各例在Python3.8.2中的运行情况如下图所示:
关于Python中索引的使用方式,大家可以参照这篇文章《Python中创建列表、访问列表、删除列表等操作方法》里关于索引的示意图与说明。Python中关于序列类型的索引方法是一致的。
因为元组tuple属于不可变类型,其值无法像列表那样进行增加、修改或删除。
>>> t = (1, 2, 3, 4)
>>> t[1] = 10 # 企图修改索引1处的值
Traceback (most recent call last):
File "<pyshell#30>", line 1, in <module>
t[1] = 10
TypeError: 'tuple' object does not support item assignment
>>>
从上例可以看出,企图修改元组的值是不允许的,给出 TypeError 错误。
但是如果元组中的元素是可变类型的话,我们仍可以修改这个元素的值,如下例:
>>> t = (1, 2, ['apple', 'orange', 'banana'], 3)
>>> t
(1, 2, ['apple', 'orange', 'banana'], 3)
>>> t[2][1] = 'berry'
>>> t
(1, 2, ['apple', 'berry', 'banana'], 3)
>>> t[2].remove('banana')
>>> t
(1, 2, ['apple', 'berry'], 3)
>>>
使用 del 命令可以删除元组的定义。
>>> t = (1, 2, 3)
>>> print(t)
(1, 2, 3)
>>> del t
>>> print(t)
Traceback (most recent call last):
File "pyshell#40", line 1, in <module>
t
NameError: name 't' is not defined
>>>
从上例可以看出,使用 del 命令删除元组 t 的定义后,企图再次使用时,将会产生 NameError 错误,即名称 't' 未定义。
1、元组的连接
使用 + 运算符可以把 2 个或多个元组连接成一个新的元组。
>>> t1 = (1, 2, 3)
>>> t2 = (4, 5, 6, 7)
>>> t = t1 + t2
>>> print(t)
(1, 2, 3, 4, 5, 6, 7)
>>>
2、元组的重复运算
使用 * 可以把元组重复若干次后生成一个新的元组。
>>> t = (1, 2, 'apple', 3)
>>> t1 = t * 3
>>> print(t1)
(1, 2, 'apple', 3, 1, 2, 'apple', 3, 1, 2, 'apple', 3)
>>>
3、成员检测运算
使用 "in" 运算符可以检测一个元组中是否包含某个元素值,也可以使用 "not in" 运算符检测某个元素值是否不在一个元组中。
>>> t = ('python', 'C#', 'HTML', 'CSS', 'Java', 'R')
>>> print('python' in t)
True
>>> print('HTML' not in t)
False
>>> print('PHP' in t)
False
>>>
我们可以使用for循环迭代输出元组中的每个值。
langs = ("Python", "R", "PHP", "Java")
for e in langs:
print(e)
for v in reversed(langs):
print(v)
第1个for循环正常顺序输出每个元组中的值,第2个for循环使用了reversed函数,把元组反转后输出。
输出结果:
Python
R
PHP
Java
Java
PHP
R
Python
1、len()函数
len()函数可以获取元组的长度,即元组中值的个数。
>>> t1 = (1, 2, "python")
>>> print(len(t1))
3
>>> t2 = (1, 2, ["python", "R", "C#"], 'apple')
>>> print(len(t2))
4
>>>
2、count()函数
count()函数可以统计元组中某元素的个数。
>>> t = ("A", "B", "A", "C", "D", "A")
>>> icnt = t.count("A")
>>> print(icnt)
3
>>>
3、index()函数
index()函数返回元组中某个范围内某元素第一次出现的位置索引。
index()函数的语法格式如下:
tup_name.index( x, start, end)
>>> t = (1, 2, 3, 1, 3, 4, 5)
>>> t.index(3)
2
>>> t.index(3, 3)
4
>>> t.index(3, 3, 5)
4
>>> t.index(3, -3)
4
>>>
我们可以只用tuple()函数来创建一个元组。可以把列表,字符串等作为其参数来创建元组。
>>> lst1 = [1, 2, 3] # 列表
>>> t1 = tuple(lst1) # 使用列表来创建元组
>>> print(t1)
(1, 2, 3)
>>> s = "Python" # 字符串
>>> t2 = tuple(s) # 使用字符串来创建元组
>>> print(t2)
('P', 'y', 't', 'h', 'o', 'n')
>>> r = range(1, 5) # 生成范围值
>>> t3 = tuple(r) # 使用范围值来创建元组
>>> print(t3)
(1, 2, 3, 4, 5)
>>>
以上是关于tuple类型的全部内容,如有什么疑问请留言评论。
新闻热点
疑难解答