python基础教程:元组
元组(元组)跟列表(名单)非常相似,二者之间的差异就是元组不可改变,列表是可以改变的。
创建元组(元组)
跟列表的中括号不同,元组用圆括号把所有项括起来,元素之间用逗号分隔:
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)
总结
元组跟列表非常相似,前者不能被修改,后者随便改。