Python 基础语法教学Part 2
序列型别
1. 范围
Range这个型别可用来创建并储存特定范围内的整数,故得名Range。
必须特别注意的是,一旦Range被创建了,里面的内容是不可修改的
在Python中,我们有几个方法可以创造Range。
- 范围(停止)
- stop:停止点
- 范围(开始、停止)
- start:起始点
- stop:停止点
- 范围(开始、停止、步长)
- start:起始点
- stop:停止点
- step:间隔
话不多说,让我们来看看程式:
r1 = range(10)
r2 = range(5, 50, 5)
print(type(r1))
print(r1)
print(r2)
执行上述范例后,我们可以得知几件事情:
- 若没有给起始值,将预设为0
- 若没有给间隔,将预设为1
- 遇到停止点后,创造的过程就会终止,因此Range中的数字将不会包含停止点
2.元组
Tuple可用来存放一组资料。
这组资料的个数不限,型别也不须相同。
同Range,一旦被创造,将无法修改内容。
值与值之间,要以,
隔开。
简单范例:
t1 = 10, 20
# it can hold different types of data
t2 = 10, 'hello world'
print(type(t1))
print(t1)
print(t2)
3. 清单
List即为Python中的阵列(Array)。
如果你不知道什么阵列也没关系,让哥来解释给你听。
阵列是一种容器,可用来储存众多资料。与Tuple最大的不同处在于,针对一个以创建的阵列,你可以随时增加或减少其内部资料的个数,也可以修改里面的内容。
范例程式:
arr1 = [1, 2, 3]
arr2 = [10, 'hello world', 8.7]
arr1[0] = [1, 2, 3]
print(type(arr1))
print(arr1)
print(arr2)
要点:
- 宣告阵列可用
[]
- 阵列内的资料型别不必相同
- 对于任何序列型别来说,我们可用
[index]
的语法来存取其中的元素。那这个index要带多少才能拿到想要的元素呢? 简单来说,大部分的程式语言,容器的index都是从0起算的。因此假设今天有个阵列有三个元素,他们对应的index就为0, 1, 2。
4. String (字串)
其实我们一开始介绍过的基本型别String,也是一种序列型别喔。
一个比较好理解的方式为,其实String就像是一堆字元排在一起组合而成的(字元指的为一个字)。
需要注意的是,字串的内容也是不能修改的。
范例:
str1 = 'hello python'
str2 = str1
# str2[0] = 'y'
# a = a + b could be written as a += b
str2 += ' journey'
print(str2 is str1)
print(str1)
result = str2.split(' ')
print(result)
result_back = '***'.join(result)
print(result_back)
要点:
- 如果今天想要用两个字串,组合成一个新的字串,我们可用
+
来做到这件事 - 假设今天我们想判断两个变数是否共享记忆体位置(判断两者是否为同一个人),可用
is
来做到 - 两个很重要String方法一定要知道,split & join
- split可将一个字串用指定的方式(字串)拆散为阵列。以上述的例子来说,我们将
'hello python journy'
,以空白' '
隔开成阵列,于是他便成了['hello', 'python', 'journey']
- join可将一个阵列,用指定的方式(字串)组合成字串。以上述的例子来说,我们
['hello', 'python', 'journey']
用'***'
组合,就成了hello***python***journey
序列型别的操作
1. 取出部分的内容
若是想从一个序列容器中取出一部份的内容来使用,我们可以用seq[start:stop:step]
这样的语法来达成(是不是有点眼熟啊!)
必需要注意的是,上面的start, stop, step
要填入的是元素的index。
范例:
str1 = 'hello world'
arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# mind the stop
arr2 = arr1[0:5]
# -1 represent the last element
arr3 = arr1[0:-1:2]
# you can ignore the args...
arr4 = arr1[:]
print(arr2)
print(arr3)
print(arr4)
print(arr4 is arr1)
print(str1[5:])
# print(arr1[:-1])
要点:
- step不给预设为1
- 遇到stop则停止取出,所以index为stop的元素不会被取出
- 可用-1代表最后一个元素的index
- start不给则预设为0
- stop不给则会将start之后的元素都取出
seq[start:stop:step]
会制造新的容器,因此他们不共享记忆体位置- 猜猜看,最后一行会印出什么,拿掉注解再执行,你猜对了吗?
2. 常见的序列容器操作方法
操作 | 描述 |
---|---|
x in s | 检查X是否存在于S这个容器之中 |
x not in s | 检查X是否不存在于S这个容器之中 |
s + t | 容器S与容器T的内容相加 |
s * n | 三个容器S =>s + s + s |
len(s) | 取得容器的长度(里面有几个元素的意思) |
min(s) | 取得容器内的最小值(前提是里面的元素要能比大小啊!) |
max(s) | 取得容器内的最大值 |
s.index(x[,i[,j]]) | X元素在S容器的索引值,如果有给i, j 就只会在index为i~j 的范围找 |
s.count(x) | X这个元素在S这个容器内出现几次 |
2. 修改序列容器的内容
操作 | 描述 |
---|---|
s[i] = x | index为i 的元素的内容置换为X |
s[i:j] = t | index从i 到j 的元素内容置换为X |
s[i:j:k] = t | index从i 到j 的元素,step 以为k的方式,将内容置换为X |
del s[i:j] | 把index从i 到j 的元素删除 |
del s[i:j:k] | index从i 到j 的元素,step 以为k的方式删除元素 |
s.append(x) | 将X塞到S容器的最后面 |
s.clear() | 将S容器的内容全部删除(same as del s[:]) |
s.copy() | 复制S容器(same as s[:]) |
s.extend(t) | 同s = s + t |
s.insert(i,x) | 在S容器index为i 的位置将X插入,原有的元素(们)将会往后移 |
s.pop([i]) | 将index为i 的元素取出,并将其移出容器 |
s.remove(x) | 删除第一个找到的X |
s.reverse() | 让容器的内容顺序颠倒 |
小结
今天我们介绍了序列容器,这个东西不论在什么语言都是非常重要的。因为大部分的情况下,我们都要同时处理很多笔资料,因此序列容器的操作都必须非常熟悉才行。以机器学习来说,通常会取得很多数据给程式来学习,这时候要怎么操作储存这些资料的容器,就是一大重点呢!