Skip to content

Commit be3854d

Browse files
committed
update README
1 parent b5fbd4f commit be3854d

1 file changed

Lines changed: 216 additions & 1 deletion

File tree

Datatypes/README.md

Lines changed: 216 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,217 @@
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+
2217

0 commit comments

Comments
 (0)