理论部分
练习部分
「元组」定义语法为: (元素1, 元素2, …, 元素n)
元组(tuple)与列表类似,也是有序序列容器,但元组创建之后就无法被修改。
可以使用()
或者直接用,
隔开来创建元组(为了程序的可读性,使用``()`)。
t1 = (1, 10.31, 'python')
t2 = 1, 10.31, 'python'
print(t1, type(t1))
# (1, 10.31, 'python')
print(t2, type(t2))
# (1, 10.31, 'python')
注意:当元组只有一个元素时,需要在元素后面加一个逗号,否则会作为运算符处理。(例:(0))
a = (0)
print(type(a))
#
a = (0,)
print(type(a))
#
*
也可用于元组的重复,与列表类似,元组也可具有多维。
x = 3 * (1,2,3)
print(x)
# (1, 2, 3, 1, 2, 3, 1, 2, 3)
x = 3 * ((1,2,3),)
print(x)
# ((1, 2, 3), (1, 2, 3), (1, 2, 3))
补充:比较一下容器数据类型的创建。
容器数据类型 | 创建空容器 | 创建含有元素的容器 |
---|---|---|
列表 | x = [] |
x = [1,2,3] |
元组 | x = () |
x = (1,2,3) |
字典 | x = {} |
x = {1:a,2:b,3:c} |
集合 | x = set() |
x.add(obj) |
字符串 | x = '' |
x = "123" |
由于集合也为大括号{}
,所以在空集合创建时与空字典相同,为了区别就是用set()
l来表示空集合。
元组与列表相似,也可通过索引(获得单个元素)和切片(获得子元组)访问。
x = 3 * ((1,2,3),)
print(x) # ((1, 2, 3), (1, 2, 3), (1, 2, 3))
print(x[0]) # (1, 2, 3)
print(x[0][1]) # 2
print(x[1][0:2]) # (1, 2)
注意:虽然各种容器的创建时所采用的括号类型不同,但是在访问容器时都是采用中括号[]
进行访问。
概念:元组具有不可更改(immutable)的性质,这里的不可更改是指无法通过赋值语句更改元组内的元素。但倘若元组内的元素是可更改的(如列表),那就可以更改元组中的元素。
x = (1, 2, 3, [4, 5, 6])
print(t1) # (1, 2, 3, [4, 5, 6])
t1[3][0] = 9
print(t1) # (1, 2, 3, [9, 5, 6])
# ---------------------------错误示范
t1[0] = 9 # 元组无法使用赋值语句
t1[3]是一个列表,将列表的第一项改为9是可行的。
另外,可以通过整体更改来对元组重新更新。=
的右边整体构成一个新元组,赋值给week变量。
week = ('Monday', 'Tuesday', 'Thursday', 'Friday')
week = week[:2] + ('Wednesday',) + week[2:]
print(week) # ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday')
+
*
in
、not in
tuple.count(obj)
是记录在元组中该元素出现几次。tuple.index(obj)
是找到该元素在元组的第一个索引。t = 8 * (1,2,3)
print(t) # (1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3)
print(t.index(1)) # 0
print(t.count(1)) # 8
解压元组的标准就是左边结构需要与元组相同。
解压(unpack)一维元组(有几个元素左边括号定义几个变量)。
t = (1, 10.31, 'python')
(a, b, c) = t
print(a, b, c)
# 1 10.31 python
解压二维元组也一样,需要左边结构与元组结构相同。
t = (1, 10.31, ('OK', 'python'))
(a, b, (c, d)) = t
print(a, b, c, d)
通配符「*」,英文叫 wildcard,在计算机语言中代表一个或多个元素。
如果只取出元组其中几个元素,可以将把不需要的元素丢给了 rest
变量, *rest
代表占了多个位置,以列表形式储存 。
t = 1, 2, 3, 4, 5
a, b, *rest, c = t
print(a, b, c) # 1 2 5
print(rest) # [3, 4]
如果你根本不在乎 rest 变量,那么就用通配符*
加上下划线_
,下划线代表一个变量。
a, b, *_ = t
print(a, b) # 1 2
1、元组概念
写出下面代码的执行结果和最终结果的类型。
(1, 2)*2 # (1, 2, 1, 2)
(1, )*2 # (1, 1)
(1)*2 # 2
分析为什么会出现这样的结果。
*
对于元组来说是重复操作符,所以1,2行的结果为元组。
(1)的括号是作为运算符,类型为int,1*2 = 2。
2、拆包过程是什么?
a, b = 1, 2
上述过程属于拆包吗?可迭代对象拆包时,怎么赋值给占位符?
拆包过程是指利用一句赋值语句按顺序将元组中的各元素赋值给=左边的各个变量。
上述过程属于拆包,1, 2
已经定义了一个元组,与左边结构相对应,可以算作解压元组。
在可迭代对象拆包时,使用_
(单个元素),*_
(连续多个元素)进行占位。