|
1 | | -# 基本数据类型 |
| 1 | +# 常用数据类型 |
| 2 | + |
| 3 | +在介绍 Python 的常用数据类型之前,我们先看看 Python 最基本的数据结构 - **序列(sequence)**。 |
| 4 | + |
| 5 | +**序列**的一个特点就是根据索引(index,即元素的位置)来获取序列中的元素,第一个索引是 0,第二个索引是 1,以此类推。 |
| 6 | + |
| 7 | +所有序列类型都可以进行某些通用的操作,比如: |
| 8 | + |
| 9 | +- 索引(indexing) |
| 10 | +- 分片(sliceing) |
| 11 | +- 迭代(iteration) |
| 12 | +- 加(adding) |
| 13 | +- 乘(multiplying) |
| 14 | + |
| 15 | +除了上面这些,我们还可以检查某个元素是否属于序列的成员,计算序列的长度等等。 |
| 16 | + |
| 17 | +说完序列,我们接下来看看 Python 中常用的数据类型,如下: |
| 18 | + |
| 19 | +- [列表(list)](./list.md) |
| 20 | +- [元组(tuple)](./tuple.md) |
| 21 | +- [字符串(string)](./string.md) |
| 22 | +- [字典(dict)](./dict.md) |
| 23 | +- [集合(set)](./set.md) |
| 24 | + |
| 25 | +其中,**列表、元组和字符串都属于序列类型,它们可以进行某些通用的操作**,比如索引、分片等;字典属于**映射**类型,每个元素由键(key)和值(value)构成;集合是一种特殊的类型,它所包含的元素是不重复的。 |
| 26 | + |
| 27 | +# 通用的序列操作 |
| 28 | + |
| 29 | +## 索引 |
| 30 | + |
| 31 | +序列中的元素可以通过索引获取,索引从 0 开始。看看下面的例子: |
| 32 | + |
| 33 | +``` |
| 34 | +>>> nums = [1, 2, 3, 4, 5] # 列表 |
| 35 | +>>> nums[0] |
| 36 | +1 |
| 37 | +>>> nums[1] |
| 38 | +2 |
| 39 | +>>> nums[-1] # 索引 -1 表示最后一个元素 |
| 40 | +5 |
| 41 | +>>> s = 'abcdef' # 字符串 |
| 42 | +>>> s[0] |
| 43 | +'a' |
| 44 | +>>> s[1] |
| 45 | +'b' |
| 46 | +>>> |
| 47 | +>>> a = (1, 2, 3) # 元组 |
| 48 | +>>> a[0] |
| 49 | +1 |
| 50 | +>>> a[1] |
| 51 | +2 |
| 52 | +``` |
| 53 | + |
| 54 | +注意到,-1 则代表序列的最后一个元素,-2 代表倒数第二个元素,以此类推。 |
| 55 | + |
| 56 | +## 分片 |
| 57 | + |
| 58 | +**索引**用于获取序列中的单个元素,而**分片**则用于获取序列的部分元素。分片操作需要提供两个索引作为边界,中间用冒号相隔,比如: |
| 59 | + |
| 60 | +```python |
| 61 | +>>> numbers = [1, 2, 3, 4, 5, 6] |
| 62 | +>>> numbers[0:2] # 列表分片 |
| 63 | +[1, 2] |
| 64 | +>>> numbers[2:5] |
| 65 | +[3, 4, 5] |
| 66 | +>>> s = 'hello, world' # 字符串分片 |
| 67 | +>>> s[0:5] |
| 68 | +'hello' |
| 69 | +>>> a = (2, 4, 6, 8, 10) # 元组分片 |
| 70 | +>>> a[2:4] |
| 71 | +(6, 8) |
| 72 | +``` |
| 73 | + |
| 74 | +**这里需要特别注意的是,分片有两个索引,第 1 个索引的元素是包含在内的,而第 2 个元素的索引则不包含在内**,也就是说,numbers[2:5] 获取的是 numbers[2], numbers[3], numbers[4],没有包括 numbers[5]。 |
| 75 | + |
| 76 | +下面列举使用分片的一些技巧。 |
| 77 | + |
| 78 | +- 访问最后几个元素 |
| 79 | + |
| 80 | +假设需要访问序列的最后 3 个元素,我们当然可以像下面这样做: |
| 81 | + |
| 82 | +```python |
| 83 | +>>> numbers = [1, 2, 3, 4, 5, 6] |
| 84 | +>>> numbers[3:6] |
| 85 | +[4, 5, 6] |
| 86 | +``` |
| 87 | + |
| 88 | +有没有更简洁的方法呢?想到可以使用负数形式的索引,你可能会尝试这样做: |
| 89 | + |
| 90 | +```python |
| 91 | +>>> numbers = [1, 2, 3, 4, 5, 6] |
| 92 | +>>> numbers[-3:-1] # 实际取出的是 numbers[-3], numbers[-2] |
| 93 | +[4, 5] |
| 94 | +>>> numbers[-3:0] # 左边索引的元素比右边索引出现得晚,返回空序列 |
| 95 | +[] |
| 96 | +``` |
| 97 | + |
| 98 | +上面的两种使用方式并不能正确获取序列的最后 3 个元素,Python 提供了一个捷径: |
| 99 | + |
| 100 | +```python |
| 101 | +>>> numbers = [1, 2, 3, 4, 5, 6, 7, 8] |
| 102 | +>>> numbers[-3:] |
| 103 | +[6, 7, 8] |
| 104 | +>>> numbers[5:] |
| 105 | +[6, 7, 8] |
| 106 | +``` |
| 107 | + |
| 108 | +也就是说,如果希望分片包含最后一个元素,可将第 2 个索引置为空。 |
| 109 | + |
| 110 | +**如果要复制整个序列,可以将两个索引都置为空**: |
| 111 | + |
| 112 | +```python |
| 113 | +>>> numbers = [1, 2, 3, 4, 5, 6, 7, 8] |
| 114 | +>>> nums = numbers[:] |
| 115 | +>>> nums |
| 116 | +[1, 2, 3, 4, 5, 6, 7, 8] |
| 117 | +``` |
| 118 | + |
| 119 | +- 使用步长 |
| 120 | + |
| 121 | +使用分片的时候,步长默认是 1,即逐个访问,我们也可以自定义步长,比如: |
| 122 | + |
| 123 | +```python |
| 124 | +>>> numbers = [1, 2, 3, 4, 5, 6, 7, 8] |
| 125 | +>>> numbers[0:4] |
| 126 | +[1, 2, 3, 4] |
| 127 | +>>> numbers[0:4:1] # 步长为 1,不写也可以,默认为 1 |
| 128 | +[1, 2, 3, 4] |
| 129 | +>>> numbers[0:4:2] # 步长为 2,取出 numbers[0], numbers[2] |
| 130 | +[1, 3] |
| 131 | +>>> numbers[::3] # 等价于 numbers[0:8:3],取出索引为 0, 3, 6 的元素 |
| 132 | +[1, 4, 7] |
| 133 | +``` |
| 134 | + |
| 135 | +另外,步长也可以是负数,表示从右到左取元素: |
| 136 | + |
| 137 | +```python |
| 138 | +>>> numbers = [1, 2, 3, 4, 5, 6, 7, 8] |
| 139 | +>>> numbers[0:4:-1] |
| 140 | +[] |
| 141 | +>>> numbers[4:0:-1] # 取出索引为 4, 3, 2, 1 的元素 |
| 142 | +[5, 4, 3, 2] |
| 143 | +>>> numbers[4:0:-2] # 取出索引为 4, 2 的元素 |
| 144 | +[5, 3] |
| 145 | +>>> numbers[::-1] # 从右到左取出所有元素 |
| 146 | +[8, 7, 6, 5, 4, 3, 2, 1] |
| 147 | +>>> numbers[::-2] # 取出索引为 7, 5, 3, 1 的元素 |
| 148 | +[8, 6, 4, 2] |
| 149 | +>>> numbers[6::-2] # 取出索引为 6, 4, 2, 0 的元素 |
| 150 | +[7, 5, 3, 1] |
| 151 | +>>> numbers[:6:-2] # 取出索引为 7 的元素 |
| 152 | +[8] |
| 153 | +``` |
| 154 | + |
| 155 | +这里总结一下使用分片操作的一些方法,分片的使用形式是: |
| 156 | + |
| 157 | +```python |
| 158 | +# 左索引:右索引:步长 |
| 159 | +left_index:right_index:step |
| 160 | +``` |
| 161 | + |
| 162 | +要牢牢记住的是: |
| 163 | + |
| 164 | +- 左边索引的元素包括在结果之中,右边索引的元素不包括在结果之中; |
| 165 | +- 当使用一个负数作为步长时,必须让左边索引大于右边索引; |
| 166 | +- 对正数步长,从左向右取元素;对负数步长,从右向左取元素; |
| 167 | + |
| 168 | +## 加 |
| 169 | + |
| 170 | +序列可以进行「加法」操作,如下: |
| 171 | + |
| 172 | +```python |
| 173 | +>>> [1, 2, 3] + [4, 5, 6] # 「加法」效果其实就是连接在一起 |
| 174 | +[1, 2, 3, 4, 5, 6] |
| 175 | +>>> (1, 2, 3) + (4, 5, 6) |
| 176 | +(1, 2, 3, 4, 5, 6) |
| 177 | +>>> 'hello, ' + 'world!' |
| 178 | +'hello, world!' |
| 179 | +>>> [1, 2, 3] + 'abc' |
| 180 | +Traceback (most recent call last): |
| 181 | + File "<stdin>", line 1, in <module> |
| 182 | +TypeError: can only concatenate list (not "str") to list |
| 183 | +``` |
| 184 | + |
| 185 | +这里需要注意的是:两种相同类型的序列才能「加法」操作。 |
| 186 | + |
| 187 | +## 乘 |
| 188 | + |
| 189 | +序列可以进行「乘法」操作,比如: |
| 190 | + |
| 191 | +```python |
| 192 | +>>> 'abc' * 3 |
| 193 | +'abcabcabc' |
| 194 | +>>> [0] * 3 |
| 195 | +[0, 0, 0] |
| 196 | +>>> [1, 2, 3] * 3 |
| 197 | +[1, 2, 3, 1, 2, 3, 1, 2, 3] |
| 198 | +``` |
| 199 | + |
| 200 | +## in |
| 201 | + |
| 202 | +为了检查一个值是否在序列中,可以使用 `in` 运算符,比如: |
| 203 | + |
| 204 | +```python |
| 205 | +>>> 'he' in 'hello' |
| 206 | +True |
| 207 | +>>> 'hl' in 'hello' |
| 208 | +False |
| 209 | +>>> 10 in [6, 8, 10] |
| 210 | +True |
| 211 | +``` |
| 212 | + |
| 213 | +# 参考资料 |
| 214 | + |
| 215 | +- 《Python 基础教程》 |
| 216 | + |
2 | 217 |
|
0 commit comments