元组(元组)跟列表(名单)非常相似,二者之间的差异就是元组不可改变,列表是可以改变的。
创建元组(元组)
跟列表的中括号不同,元组用圆括号把所有项括起来,元素之间用逗号分隔:
In [15]: mytuple = ('a', 'b', 3, 8.9, [1,2])
In [16]: mytuple
Out[16]: ('a', 'b', 3, 8.9, [1, 2])
In [17]: x = ('a',) # 只有一个元素的元组
In [18]: y = () # 空元组
元组(元组)的索引(索引)
元组的索引机制跟列表完全一样,看下面的示例:
In [22]: mytuple[0]
Out[22]: 'a'
In [23]: mytuple[1]
Out[23]: 'b'
In [24]: mytuple[3]
Out[24]: 8.9
同样,元组也有负索引:
In [25]: mytuple[-1]
Out[25]: [1, 2]
In [26]: mytuple[-2]
Out[26]: 8.9
Python 的元组的索引可以是正索引(从头到尾),也可以是负索引(从尾到头),总结为下面的关系:
元组: ('a', 'b', 'c', 'd', 'e')
| | | | |
正索引: 0 1 2 3 4
负索引: -5 -4 -3 -2 -1
因为元组是不可修改的,我们通过索引企图修改元素时,就会报错:
In [116]: x = ('a', 1, [1,2])
In [117]: x[1] = 2
--------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-117-fe7b4192b649> in <module>
----> 1 x[1] = 2
TypeError: 'tuple' object does not support item assignment
In [118]: x[2][1] = 3 #修改的不是元组,而是 list
In [119]: x
Out[119]: ('a', 1, [1, 3])
In [121]: x[2] = ['a', 'b'] # 此处企图修改第三个元素,报错!--------------------------------
TypeError Traceback (most recent call last)
<ipython-input-121-339ad61923f7> in <module>
----> 1 x[2] = ['a', 'b']
TypeError: 'tuple' object does not support item assignment
但是,我们修改元组中的列表时却成功了。元组 x 的前两个元素 ’a’,1 都是不可变的,而第三个元素是 list,这个列表是可以改变的,但不能把第三个元素赋值为其它列表(上面示例中最后一个操作)或其它任何类型的数据。
元组(元组)的切片(切片)
元组的切片跟列表也是一样的
In [27]: mytuple[1:3]
Out[27]: ['b', 3]
In [28]: mytuple[:3]
Out[28]: ['a', 'b', 3]
In [29]: mytuple[1:]
Out[29]: ['b', 3, 8.9, [1, 2]]
In [30]: mytuple[:]
Out[30]: ['a', 'b', 3, 8.9, [1, 2]]
上面例子中,切片范围的起止索引可以是缺失的,左边缺失就是从头(0
)开始,右边缺失就是后面的全部。
元组(元组)运算符
元组的运算符跟列表也一样:
运算符 | 含义 | 表达式 | 结果 |
---|---|---|---|
+ |
合并在一起 | ('a', 'b', 'c') + (1, 2, 3) |
('a', 'b', 'c', 1, 2, 3) |
* |
重复 | ('a',) * 3 |
('a', 'a', 'a') |
in |
是否为元素 | 'a' in ('a', 'b') |
True |
从头到尾遍历(迭代)一个 tuple 的语法是for x in the-tuple
::
for x in (1, 2, 3):
print(x)
删除元组(元组)
(1)删除整个元组
In [35]: mytuple = ['a', 'b', 3, 8.9, [1,2]]
In [36]: del mytuple
In [37]: mytuple
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-37-1dc2d082cc20> in <module>
----> 1 list_a
NameError: name 'list_a' is not defined
由于元组是不可改变的,我们就不能像列表那样,使用 del
来删除元型态组的元素。
In [127]: x = ('a', 1, [1,2])
In [128]: del x[0]
--------------------------------
TypeError Traceback (most recent call last)
<ipython-input-128-ec9e6e663ef5> in <module>
----> 1 del x[0]
TypeError: 'tuple' object doesn't support item deletion
元组相关的内置函数
(1)len()
计算元组的长度,即计算元组元素的个数)
In [55]: len([1,2,3])
Out[55]: 3
(2)max()
返回元组元素中的最大值,元组元素必须是同一类型且可比较,比如都是数字型的,或都是字符串,如果类型不统一就会报错:
In [57]: max(('a', 'b', 'c'))
Out[57]: 'c'
In [58]: max((1,2,'a'))
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-58-d6e404f692f3> in <module>
----> 1 max((1,2,'a'))
TypeError: '>' not supported between instances of 'str' and 'int'
(3)min()
返回元组元素中的最小值。元素类型要求跟 max()一样。
In [59]: min((1,2,3))
Out[59]: 1
In [60]: min(('a', 'b', 'c'))
Out[60]: 'a'
In [61]: min((1,2,'a'))
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-61-c2d30ec5fffc> in <module>
----> 1 min((1,2,'a'))
TypeError: '<' not supported between instances of 'str' and 'int'
(4)sum()
计算元组所有元素的和,其元素类型必须是数值型的(整数,浮点数)
In [63]: sum((1,2,3))
Out[63]: 6
In [64]: sum((1.2, 3.2, 4.3))
Out[64]: 8.7
In [65]: sum(('a', 'b', 'c'))
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-65-f2e6eb2051e3> in <module>
----> 1 sum(('a', 'b', 'c'))
TypeError: unsupported operand type(s) for +: 'int' and 'str'
(5)sorted()
返回一个排序的列表,但并不改变原元组。
In [66]: sorted((3, 9, 0, 5))
Out[66]: [0, 3, 5, 9]
In [68]: sorted(('python', 'yuanrenxue', 'good'))
Out[68]: ['good', 'python', 'yuanrenxue']
(6)tuple()
生成一个空元组,或把其它类型数据转换成元组。
In [69]: tuple()
Out[69]: ()
In [70]: tuple('python')
Out[70]: ('p', 'y', 't', 'h', 'o', 'n')
(7)any()
只要元组中有一个元素是 True 就返回 True。
In [72]: any((0, '','3'))
Out[72]: True
(8)all()
只有元组所有元素为 True 才返回 True。
In [73]: all((0, '','3'))
Out[73]: False
In [74]: all((3, 'a', True))
Out[74]: True
元组(元组)的内置方法
由于元组的不可改变,它的方法也比列表少了很多,只有两个:
index(v)返回第一个值为 v 的元素的索引;
count(v)返回值为 v 的元素的个数。
In [138]: x = (1,3,2,6,2,4)
In [139]: x.index(2)
Out[139]: 2
In [140]: x.count(2)
Out[140]: 2
元组的拆包(开箱)
Python 的中如果要初始化多个变量,可以用下面的方式:
In [141]: a,b,c,d = 1,2,3,4
In [142]: a,b,c,d
Out[142]: (1, 2, 3, 4)
以上代码给 A,B,C,d 分别赋值 1,2,3,4,这时候一个是 1,B 是 2,C 是 3,d 是 4
还有更绝的拆包方法,就是那星用号 *
来吸收多余的元素:
In [146]: x = (1,2,3,4,5)
In [147]: a, *b = x # x 有 5 个元素,左边变量只有两个,多余的都被带 * 的 b 吸收了
In [148]: a, b
Out[148]: (1, [2, 3, 4, 5])
In [149]: a, *b, c = x #多亏带 * 的 b
In [150]: a,b,c
Out[150]: (1, [2, 3, 4], 5)
In [151]: *a, b, c = x #多亏带 * 的 a
In [152]: a,b,c
Out[152]: ([1, 2, 3], 4, 5)
In [153]: a,b,c = x #没有带 * 的,x 的 5 个元素无法匹配 3 个变量
---------------------
ValueError Traceback (most recent call last)
<ipython-input-153-58e3b82a91cc> in <module>
----> 1 a,b,c = x
ValueError: too many values to unpack (expected 3)
总结
元组跟列表非常相似,前者不能被修改,后者随便改。