09 容器型数据类型------元组
认识元组
- 元组(tuple)
- 元组是容器型数据类型,将
() 作为容器的标志,里面多个元素用逗号隔开:(元素1,元素2,元素3,…) - 元组不可变(不支持增删改操作)
- 元组有序(支持下标操作)
注意:可以把元组看成不可变的列表。列表中除了元素的增删改外,其他的操作元组几乎都适用
- 只有一个元素的元组
() 表示空的元组,但是因为() 本身的特殊性导致如果一个元组只有一个元素,必须在这个唯一的元素后面添加逗号:(元素, )
定义和使用元组
定义元组通常使用() 字面量语法,元组类型支持的运算符跟列表是一样的。
"""
example01 - 元组
元组是不可变的
Author: yucui
Date: 2021/7/27
"""
fruit = ('apple',)
fruits = ('apple', 'bananas', 'grape', 'watermelon')
print(fruits * 2)
print(fruits)
print('apple' in fruits)
print('grape' not in fruits)
fruits2 = ('litchi', 'strawberry')
fruits3 = fruits + fruits2
print(fruits3)
fruits += ('pear',)
print(fruits)
print(fruits3[3])
print(fruits3[-1])
print(fruits3[1:4])
print(fruits[::-1])
print(fruits3[1:4:2])
print(fruits3.index('watermelon'))
print(fruits3.count('apple'))
元组的应用场景
例1:打包和解包操作
当我们把多个用逗号分隔的值赋给一个变量时,多个值会打包成一个元组类型;当我们把一个元组赋值给多个变量时,元组会解包成多个值然后分别赋给对应的变量,如下面的代码所示。
a = 1, 10, 100
print(type(a), a)
i, j, k = a
print(i, j, k)
在解包时,如果解包出来的元素个数和变量个数不对应,会引发ValueError 异常,错误信息为:too many values to unpack (解包的值太多)或not enough values to unpack (解包的值不足)。
a = 1, 10, 100, 1000
有一种解决变量个数少于元素的个数方法,就是使用星号表达式,我们之前讲函数的可变参数时使用过星号表达式。有了星号表达式,我们就可以让一个变量接收多个值,代码如下所示。需要注意的是,用星号表达式修饰的变量会变成一个列表,列表中有0个或多个元素。还有在解包语法中,星号表达式只能出现一次。
"""
example02 - 元组的应用
Author: yucui
Date: 2021/7/27
"""
a, b, *c = 5, 10, 15, 20, 25
print(a)
print(b)
print(c)
a, *b, c = 5, 10, 15, 20, 25
print(a)
print(b)
print(c)
*a, b, c = 5, 10, 15, 20, 25
print(a)
print(b)
print(c)
a, b = b, a
print(a)
print(b)
a, b, c = b, c, a
需要说明一点,解包语法对所有的序列都成立,这就意味着对字符串、列表以及我们之前讲到的range 函数返回的范围序列都可以使用解包语法。
例2:交换两个变量的值
交换两个变量的值是编程语言中的一个经典案例,在很多编程语言中,交换两个变量的值都需要借助一个中间变量才能做到,如果不用中间变量就需要使用比较晦涩的位运算来实现。在Python中,交换两个变量a 和b 的值只需要使用如下所示的代码。
a, b = b, a
同理,交换三个变量的值用以下代码:
a, b, c = b, c, a
需要说明的是,上面并没有用到打包和解包语法,Python的字节码指令中有ROT_TWO 和ROT_THREE 这样的指令可以实现这个操作,效率是非常高的。但是如果有多于三个变量的值要依次互换,这个时候没有直接可用的字节码指令,执行的原理就是我们上面讲解的打包和解包操作。
|