5.1简介
在计算机程序中会有很多数据,这些数据也需要一个容器将他们管理起来,这就是数据结构。常见的数据结构:数组(Array)、集合(Set)、列表(List)、队列(Queue)、链表(Linkedlist)、树(Tree)、堆(Heap)、栈(Stack)和字典(Dictionary)等结构。
Python中数据容器主要有:序列、集合和字典。
注:Python中并没有数组结构,因为数组要求元素类型是一致的。而Python作为动态类型语言,不强制声明变量的数据类型,也不能强制检查元素的数据类型。所以Python中没有数组结构
5.2序列
序列(sequence)是一种可迭代的,元素是有序的,可以重复出现的数据结构。序列可以通过索引访问元素。
序列包括的结构有:列表(list)、字符串(str)、元组(tuple)、范围(range)、和字节序列(bytes)。序列可进行的操作有:索引、分片、加和乘。
5.2.1序列操作
5.2.1.1索引操作
序列中第一个元素的索引是0,其他元素的索引是第一个元素的偏移量。可以有正偏移量,称为正值索引;也可以有负偏移量,称为负值索引。正值索引最后一个元素索引是“序列长度-1”,负值索引最后一个元素索引是“-1”
注:关于负索引略有不同
s = 'Genius'
print('长度为'+str(len(s)))
print(type(s[0]))
print(s[0])
print(s[-1])
print(max(s)) #最后一个值
print(min(s)) #第一个值
#输出
长度为6
<class 'str'>
G
s
u
G
[Finished in 0.2s]
5.2.1.2序列的加和乘
前面介绍过了,不说了
5.2.1.3序列分片
序列的分片(Slicing)就是从序列中切分出小的子序列。分片使用分片运算符,分片运算符有两种形式:
- [start:end]。start是开始索引,end是结束索引。
- [start:end:step]。start是开始索引,end是结束索引,step是步长,步长是在分片时获取元素的间隔。步长可以为正整数,也可为负整数。
注:切下的分片包括start位置元素,但不包括end位置元素,start和end都可以省略。
s = 'Genius'
print('长度为'+str(len(s)))
print(s[0:6]) #s索引为0-5 即为[start,end)
print(s[:6])
print(s[0:-1])
print(s[0:])
print(s[0:6:2])
print('-------------------------')
print(s[0:-1:-2]) #显然不存在
print('-------------------------')
print(s[0:-1:2])
print(s[::-1])
#输出
长度为6
Genius
Genius
Geniu
Genius
Gnu
-------------------------
-------------------------
Gnu
suineG
[Finished in 1.2s]
可能仍有所不解,确实正负夹杂确实也把问题扯复杂了,可以看看这篇Python中切片的理解
5.2.2元组
元组(tuple)是一种序列(sequence)结构。
5.2.2.1创建元组
元组(tuple)是一种不可变序列,一旦创建就不能修改。创建元组可以使用tuple([iterable])函数或者直接用逗号(,)将元素分隔。
s1 = 21,22,23,24
print(type(s1))
# 创建元组时使用小括号把元素包裹起来不是必须的
print(s1)
print('------------------')
s2 = (21,22,23,24)
print(type(s2))
# 使用括号将元素包裹起来,这只是为了提高程序的可读性
print(s2)
print('------------------')
s3 =('abc',123,s1,'sub',s2,123,'Genius')
# 可迭代
print(type(s3))
print(s3)
print('------------------')
s4 =tuple([1,2,3,4])
# 元组还有通过tuple([iterable])函数创建,参数iterable是任何可迭代对象。
# 使用tuple()函数创建元组对象,实参是一个列表,列表是可迭代对象
print(type(s4))
print(s4)
print('------------------')
# 输出
<class 'tuple'>
(21, 22, 23, 24)
------------------
<class 'tuple'>
(21, 22, 23, 24)
------------------
<class 'tuple'>
('abc', 123, (21, 22, 23, 24), 'sub', (21, 22, 23, 24), 123, 'Genius')
------------------
<class 'tuple'>
(1, 2, 3, 4)
------------------
[Finished in 0.2s]
注:如果一个元组只有一个元素时,后面的逗号不能省略,即(21,)表示的是只有一个元素的元组,而(21)表示的是一个整数。另外,()可以创建空元组。
s1 = ()
print(type(s1))
print(s1)
print('-----------------')
s2 = (21)
print(type(s2))
print(s2)
print('-----------------')
s3 = (21,)
print(type(s3))
print(s3)
#输出
<class 'tuple'>
()
-----------------
<class 'int'>
21
-----------------
<class 'tuple'>
(21,)
[Finished in 0.3s]
5.2.2.2访问元组
元组做为序列可以通过下标索引访问元素,也可以对其进行分片。
s1 = 21,22,23,24
s2 = (21,22,23,24)
s3 =('abc',123,s1,'sub',s2,123,'Genius')
print(s3[1:3])
#输出
(123, (21, 22, 23, 24))
[Finished in 0.2s]
元组还可以进行拆包(Unpack)操作,就是将元组的元素取出赋值给不同变量。
s1 = 21,22,23,24
s2 = (21,22,23,24)
s3 =('abc',123,s1,