首页 > 代码库 > python基础教程_学习笔记3:元组
python基础教程_学习笔记3:元组
元组
元组不能修改;(可能你已经注意到了:字符串也不能修改。)
创建元组的语法很简单:如果用逗号分隔了一些值,那么你就自动创建了元组。
>>> 1,3,‘ab‘
(1, 3, ‘ab‘)
元组也是(大部分时候是)通过圆括号括起来的。
>>> (1,3,‘13‘)
(1, 3, ‘13‘)
空元组可以用没有内容的两个圆括号来表示。
如何实现包括一个值的元组呢?
>>> (5)
5
>>> (‘ab‘)
‘ab‘
>>> ([5])
[5]
这样做满足不了需求。
实现方法有些奇特——必须加个逗号,即使只有一个值:
>>> (5,)
(5,)
>>> (‘ab‘,)
(‘ab‘,)
>>> ([5],)
([5],)
看来,上一节中存在的疑问部分提到的问题,我找到答案了。
其中,逗号是很重要的,只添加圆括号也是没用的:
>>> 3*(5+2)
21
>>> 3*(5+2,)
(7, 7, 7)
tuple函数
同list函数一样,一一个序列作为参数并把它转换为元组。如果参数就是元组,那么该参数就会被原样返回:
字符串
>>> tuple1=tuple(‘tuple‘)
>>> tuple1
(‘t‘, ‘u‘, ‘p‘, ‘l‘, ‘e‘)
列表
>>> tuple1=tuple([1234,‘abc‘])
>>> tuple1
(1234, ‘abc‘)
单字符字符串
>>> tuple1=tuple(‘1‘)
>>> tuple1
(‘1‘,)
单元素列表
>>> tuple1=tuple([1234])
>>> tuple1
(1234,)
元组
>>> tuple1=tuple((‘tup‘,‘le‘))
>>> tuple1
(‘tup‘, ‘le‘)
基本元组操作
元组并不复杂——除了创建元组和访问元组元素外,没用太多其它操作。可以参照其它类型的序列来实现。
元组的分片还是元组,就如同列表的分片还是列表一样。
元组的序列操作
创建元组:
>>> tuple1=tuple(‘today‘)
>>> tuple1
(‘t‘, ‘o‘, ‘d‘, ‘a‘, ‘y‘)
利用索引访问元素:
>>> tuple1[3]
‘a‘
分片获取元素
>>> tuple1[2:]
(‘d‘, ‘a‘, ‘y‘)
>>> tuple1[:3]
(‘t‘, ‘o‘, ‘d‘)
>>> tuple1[0:4:2]
(‘t‘, ‘d‘)
获取元组最大值、长度、最小值:
>>> max(tuple1)
‘y‘
>>> len(tuple1)
5
>>> min(tuple1)
‘a‘
赋值:
>>> tuple1[0]=‘d‘
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: ‘tuple‘ object does not support item assignment
因为元组是不能被修改的,所以也就不能被赋值。
元组方法
>>> tuple1=tuple(‘method‘)
>>> tuple1
(‘m‘, ‘e‘, ‘t‘, ‘h‘, ‘o‘, ‘d‘)
上一节提到列表有九个方法,那么元组是否支持这些方法呢?
append
>>> tuple1.append(‘a‘)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: ‘tuple‘ object has no attribute ‘append‘
count
>>> tuple1.count(‘a‘)
0
>>> tuple1.count(‘o‘)
1
extend
>>> tuple1.extend(‘a‘)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: ‘tuple‘ object has no attribute ‘extend‘
index
>>> tuple1.index(‘o‘)
4
同列表一样,当指定的字符不存在时返回错误:
>>> tuple1.index(‘z‘)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: tuple.index(x): x not in list
insert
>>> tuple1.insert(2,‘ab‘)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: ‘tuple‘ object has no attribute ‘insert‘
pop
>>> tuple1.pop()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: ‘tuple‘ object has no attribute ‘pop‘
remove
>>> tuple1.remove(‘z‘)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: ‘tuple‘ object has no attribute ‘remove‘
reverse
>>> tuple1.reverse()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: ‘tuple‘ object has no attribute ‘reverse‘
sort
>>> tuple1.sort()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: ‘tuple‘ object has no attribute ‘sort‘
通过上述方法的使用可知,凡是可以修改序列的方法元组均不支持,这也正和元组不能修改是一致的。
元组的重要性
有两个重要的原因,使得元组不可替代:
1)元组可以在映射中当做键使用,而列表则不行;
2)元组作为很多内建函数和方法的返回值存在;
一般来说,列表可能更能满足对序列的所有需求。
疑问解答
在列表小节中遇到了几个问题,以下解答一下:
1序列相乘后得到的序列类型不变,但单元素的元组进行乘法后得到的不是元组;
>>> (‘string‘)*5
‘stringstringstringstringstring‘
>>> (5)*5
25
解答:单元素元组应用逗号隔开。
>>> (‘string‘,)*5
(‘string‘, ‘string‘, ‘string‘, ‘string‘, ‘string‘)
>>> (5,)*5
(5, 5, 5, 5, 5)
2 对元组进行成员资格检查,得到的结果与预想不一致;
>>> (2,3,9) in (1,2,3,9,19)
False
解答:in是成员操作符,只有当左值是右值中的成员时才会返回True。以下是True的例子:
>>> (2,3,9) in (1,(2,3,9),19)
True
>>> (2,) in (1,(2,),19)
True
>>> 2 in (2,3,4)
True