前言
在我们使用Python的时候,经常会听到“切片”这个词!那什么是切片呢?切片是对序列数据(列表、元组、字符串),根据下标索引,对一定范围内数据的获取。
简单来说就是,通过下标索引获取一定范围内的元素。
基本索引
什么叫基本索引呢?
在Python中,对序列数据(列表、元组、字符串等),使用单个整数获取数据的方式,叫基本索引。
例如:
# coding:utf-8a = []for i in range(10): a.append(i)print(a)# 基本索引print("第0个元素为", a[0])
Python中有语法糖:可以使用负数进行索引。
例如:
# coding:utf-8a = []for i in range(10): a.append(i)print(a)# 基本索引print("第0个元素为", a[0])# 使用负数索引print("第-2个元素为", a[-2])
下面,我们用一张表展示a的索引范围。非负下标索引和负数下标索引共同构成了Python索引的有效范围。
在基本索引中,索引超出有效范围时会报IndexError!!!
# coding:utf-8a = []for i in range(10): a.append(i)print(a)# 基本索引print("第0个元素为", a[0])# 使用负数索引print("第-2个元素为", a[-2])# 索引超出有效索引范围print(a[100])
基本切片
基本语法:
a[start : end],使用该语法之后,会获得a列表中左闭右开的一系列元素。当start和end为负数时,当作是负数索引进行切片即可。
# coding:utf-8a = []for i in range(10): a.append(i)print(a)# 基本索引print("第0个元素为", a[0])# 使用负数索引print("第-2个元素为", a[-2])# 索引超出有效索引范围# print(a[100])# 基本切片print(a[2:8])print(a[-5:-2])print(a[2:-1])
超出有效范围
使用基本索引的话,超出有效范围,就会报错。
而在切片中,如果超出有效范围是不会报错的。但是会进行截断,就是仍然按范围进行左闭右开的获取,但是超出序列数据范围的部分,全部假想成空值,最终对获取到的空值进行忽略即可。
例如:
# coding:utf-8a = []for i in range(10): a.append(i)print(a)# 基本索引print("第0个元素为", a[0])# 使用负数索引print("第-2个元素为", a[-2])# 索引超出有效索引范围# print(a[100])# 基本切片print(a[2:8])print(a[-5:-2])print(a[2:-1])# 超出有效范围print("-" * 50)print(a[-100:100])print(a[3:55])
start在end的右边
当索引start在end的右边时,会发生什么呢?
不会报错。因为切不出元素,所以会返回一个空序列。
# coding:utf-8a = []for i in range(10): a.append(i)print(a)# 基本索引print("第0个元素为", a[0])# 使用负数索引print("第-2个元素为", a[-2])# 索引超出有效索引范围# print(a[100])# 基本切片print(a[2:8])print(a[-5:-2])print(a[2:-1])# 超出有效范围print("-" * 50)print(a[-100:100])print(a[3:55])# 当start在end的右边print("-" * 50)print(a[8:2])
start或end为缺省时
start和end是可以为缺省的,当start和end为缺省时,Python是尽可能取最大区间的。
例如:
# coding:utf-8a = []for i in range(10): a.append(i)print(a)# 基本索引print("第0个元素为", a[0])# 使用负数索引print("第-2个元素为", a[-2])# 索引超出有效索引范围# print(a[100])# 基本切片print(a[2:8])print(a[-5:-2])print(a[2:-1])# 超出有效范围print("-" * 50)print(a[-100:100])print(a[3:55])# 当start在end的右边print("-" * 50)print(a[8:2])# 缺省print("-" * 50)print(a[:5])print(a[2:])
可以调整步长的切片
语法是:a[start : end :step],表示从start开始,每step取一个值,直到跨越了end(不包含end),step可正可负,不为0.
其实咋们平时用的基本切片就是step为1的切片!
step为正
# coding:utf-8a = []for i in range(10): a.append(i)print(a)# 基本索引print("第0个元素为", a[0])# 使用负数索引print("第-2个元素为", a[-2])# 索引超出有效索引范围# print(a[100])# 基本切片print(a[2:8])print(a[-5:-2])print(a[2:-1])# 超出有效范围print("-" * 50)print(a[-100:100])print(a[3:55])# 当start在end的右边print("-" * 50)print(a[8:2])# 缺省print("-" * 50)print(a[:5])print(a[2:])# 带有步长的切片# 步长为正print("*" * 50)print(a[0:7:2])print(a[::2])print(a[:-3:2])print(a[-100:-4:3])
step为负
当step为负时,会进行逆序切片。因为当缺省时,python尽可能使获取到的区间尽可能大,那么缺省时,start会趋近无穷大,end会趋近无穷小。
# coding:utf-8a = []for i in range(10): a.append(i)print(a)# 基本索引print("第0个元素为", a[0])# 使用负数索引print("第-2个元素为", a[-2])# 索引超出有效索引范围# print(a[100])# 基本切片print(a[2:8])print(a[-5:-2])print(a[2:-1])# 超出有效范围print("-" * 50)print(a[-100:100])print(a[3:55])# 当start在end的右边print("-" * 50)print(a[8:2])# 缺省print("-" * 50)print(a[:5])print(a[2:])# 带有步长的切片# 步长为正print("*" * 50)print(a[0:7:2])print(a[::2])print(a[:-3:2])print(a[-100:-4:3])# 步长为负时print("@" * 50)print(a[::-1])# 为了保证取到的区间尽可能大,所以end趋向无穷小,所以会切到索引0print(a[6::-1])# 因为逆序切,为了保证取到的区间尽可能大,所以start会趋向于无穷大,一直切到索引4(不包含4)print(a[:4:-2])