分片
分片操作是从序列A中获取一个子序列B。序列A可以称为父序列。从A中获取B,需要制定B在A中的开始索引和结束索引,因此,分片操作需要制定两个索引。
首先我们先举个例子,如:
word = 'Hello Python!'
print(word[1:4]) //ell
学过数组,我们都知道,元素的索引是从0开始的,所以上面的例子开始位置从元素e开始,接着在o处结束,但是我们会发现,为什么输出的结果里面没有元素o呢,这是因为这里实行的是左闭右开的策略,就好比for循环里面的range一样,取不到最后一个元素,还有就是,分片的连个元素之间要用冒号(:)隔开。
我们再举些例子加深下印象吧
num = [1,2,3,4,5,6,7,8,9]
print(num[0:9]) //[1, 2, 3, 4, 5, 6, 7, 8, 9]
print(num[0:]) //[1, 2, 3, 4, 5, 6, 7, 8, 9]
print(num[:9]) //[1, 2, 3, 4, 5, 6, 7, 8, 9]
print(num[:]) //[1, 2, 3, 4, 5, 6, 7, 8, 9]
print(num[3:5]) //[4, 5]
print(num[0:-5]) //[1, 2, 3, 4]
print(num[-3:-1]) //[7, 8]
从上面我们又可以看到,输出所有元素有三种方式。开始索引和结束索引也可以是负数,表示从列表的最后一个元素开始索引。
print(num[-1:-3]) //[]
python语言规定,如果结束索引比开始索引出现晚,那么就会返回空序列。在这里索引-3比索引-1出现晚。
设置步长
在对序列分片时,默认的步长为1,也就是说获取的子序列的元素都是相邻的,如果想要获取不相邻的元素,就要指定步长。
num = [1,2,3,4,5,6,7,8,9]
print(num[::]) //[1, 2, 3, 4, 5, 6, 7, 8, 9]
print(num[0:9:2]) //[1, 3, 5, 7, 9]
print(num[::2]) //[1, 3, 5, 7, 9]
print(num[1:9:2]) //[2, 4, 6, 8]
print(num[1::2]) //[2, 4, 6, 8]
print(num[::-1]) //[9, 8, 7, 6, 5, 4, 3, 2, 1]
开始索引、结束索引和步长都是可以省略的。
步长不能为0,但可以是负数。如果步长为0,就会抛出异常;如果步长是负数,分片会从序列的右侧开始,这是开始索引要大于结束索引。