Python 1-17 元组
class tuple([iterable])
tuple 是一个不可变的序列类型。
>>> s = 'abc'
>>> l = [1,2]
>>> t = 1,2
>>> d = dict(a=1,b=2)
>>> set = {'a','b'}
1、元组创建
>>> tup = () # 创建空元组
>>> tup1 = (1, 2, 3, 4, 5 )
>>> tup2 = "a", "b", "c", "d" # 不需要括号也可以
>>> type(tup2) <class 'tuple'>
>>> list1 = ['Google', 'Taobao', 'Python', 'Baidu']
>>> tuple1 = tuple(list1) # 实例化 tuple 类。
>>> tuple1 # ('Google', 'Taobao', 'Python', 'Baidu')
元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用:
这是一种特殊情况,在实际操作中经常忘记添加逗号,尤其在传参的时候经常发生。
>>>tup1 = (50)
>>> type(tup1) # 不加逗号,类型为整型 <class 'int'>
>>> tup1 = (50,)
>>> type(tup1) # 加上逗号,类型为元组 <class 'tuple'>
2、删除元组
元组中的元素值是不允许删除的,但我们可以使用 del 语句来删除整个元组,如下实例:
tup = ('a', 'b')
del tup
3、元组运算符
与字符串一样,元组之间可以使用 + 号和 * 号进行运算。可以组合和复制,运算后会生成一个新的元组。
(1, 2, 3) + (4, 5, 6) # 连接
('Hi!',) * 4 # 复制
3 in (1, 2, 3) # 元素是否存在
for x in (1, 2, 3): print (x) # 迭代
4、元组索引,截取
因为元组也是一个序列,所以可以访问元组中的指定位置的元素,也可以截取索引中的一段元素,如下所示:
>>> L = ('a', 'b', 'c')
>>> L[2]
'c'
>>> L[-2]
'b'
>>> L[1:]
('b', 'c')
5、Python 内置函数
len(tuple) # 计算元组元素个数。
max(tuple) # 返回元组中元素最大值。
min(tuple) # 返回元组中元素最小值。
6、装包与解包
a, b, c = 1, 2, 3
t = 1, 2, 3 # 装包
print(type(t)) # <class 'tuple'>
a, b, c = t # 解包
print(t,a,b,c) # (1, 2, 3) 1 2 3
a,b = input().split() # 需求输入以空格分割
l=list('123456')
print(l)
for i in l:
print(i,type(i)) # '1' ...
for i in range(len(l)):
print(i,l[i])
if l[i]=='3':y=i
for x in enumerate(l):
print(x)
for x,y in enumerate(l):
print(x,y)
7、元组是不可变的对象
>>> tup = ('p', 'y', 't', 'h', 'o', 'n')
>>> tup[0] = 'g' # 不支持修改元素
TypeError: 'tuple' object does not support item assignment
>>> id(tup) # 查看内存地址
4440687904
>>> tup = (1,2,3)
>>> id(tup)
4441088800 # 内存地址不一样了
重新赋值的元组 tup,绑定到新的地址,而不是原地修改。
适合用元组,比如主机地址和端口(ip,port),(“192.168.1.1”, 80),两者捆绑在一起,不允许修改。
因为 tuple 不可变,所以代码更安全,尽可能用 tuple 代替 list。
元组只保证它的一级子元素不可变,对于嵌套的元素内部,不保证不可变!
>>> tup = ('a', 'b', ['A', 'B'])
>>> tup[2][0] = 'X'
>>> tup[2][1] = 'Y'
>>> tup
('a', 'b', ['X', 'Y'])
这个 tuple 定义的时候有3个元素,分别是 ‘a’,‘b’ 和一个 list。不是说 tuple 一旦定义后就不可变了吗?
当我们把 list 的元素 ‘A’ 和 ‘B’ 修改为 ‘X’ 和 ‘Y’ 后,tuple 变为:(‘a’, ‘b’, [‘X’, ‘Y’])。
表面上看,tuple 的元素确实变了,但其实变的不是 tuple 的元素,而是 list 的元素。tuple 一开始指向的 list 并没有改成别的 list,所以,tuple 所谓的“不变”是说,tuple 的每个元素,指向永远不变。即指向 ‘a’,就不能改成指向 ‘b’,指向一个 list,就不能改成指向其他对象,但指向的这个 list 本身是可变的!
理解了“指向不变”后,要创建一个内容也不变的 tuple 怎么做?那就必须保证 tuple 的每一个元素本身也不能变。
在使用元组的时候,请尽量使用数字、字符串和元组这种不可变的数据类型作为元组的元素,这样就能确保元组不发生变化。