Python中切片详细讲解

1、Python中切片的索引方式分为两种:

  1. 正索引
  2. 负索引
    Python切片索引方式

2、切片操作的表达方式

object[start_index:end_index:step]

step:可以表示切片的步长,当为1时表示顺序存取。步长的正负可以表示取值的方向。当为正时,表示从左向右取值,当为负数时,表示从右向左取值。
start_index:表示起始索引(包含索引本身),可以确定切片的起始位置,当为空时,表示取到端点位置,具体是“起始端点”还是“结束端点”要看step的值,当为正时,表示左边为起始端点,从左向右取;当为负数时,表示右边为起始端点,从右向左取。
end_index:表示终止索引(不包含索引本身),可以确定索引的结束为止。当为空时表示取到“终点”,具体终点是在左边还是右边,要看step的值是正数还是负数。

3、切片操作详解

以列表a =[0,1,2,3,4,5,6,7,8,9]为例

>>>a=[0,1,2,3,4,5,6,7,8,9]

3.1· 取单个值

>>>a[5]
>>>5
>>>a[-4]
>>>6

3.2· 切取整个值

>>>a[:]#从左往右切取整个对象,此处的step = 1是省略的
>>>[0,1,2,3,4,5,6,7,8,9]
>>>a[::-1]#step的值控制输出的方向,负数为从右向左
>>>[9,8,7,6,5,4,3,2,1]

3.3·start_index 和end_index都是正(+)的情况

>>>a[1:6:1]
>>>[1,2,3,4,5]
step为1,默认从左往右开始取值,start位置为0,end位置为5,step方向和索引方向一致,输出[1,2,3,4,
Python 中,**切片(Slice)** 是一种非常强大且常用的语法特性,用于从序列类型(如字符串、列表、元组等)中提取一部分元素。切片操作不会修改原对象,而是返回一个新的对象。 --- ### 一、基本语法 Python 切片的基本语法为: ```python sequence[start:stop:step] ``` - `start`:起始索引(包含),默认为 `0` - `stop`:结束索引(不包含),默认为序列长度 - `step`:步长,可以为正或负,表示方向和间隔,默认为 `1` > 注意:索引支持负数,负数表示从末尾开始计数(例如 `-1` 表示最后一个元素) --- ### 二、详细使用示例 #### 示例数据 ```python lst = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] s = "HelloWorld" tup = (10, 20, 30, 40, 50) ``` --- #### 1. 基本切片:`[start:stop]` ```python print(lst[2:6]) # 输出: [2, 3, 4, 5] print(s[1:5]) # 输出: 'ello' print(tup[1:4]) # 输出: (20, 30, 40) ``` > 提取从索引 2 开始到索引 6(不含)之间的元素。 --- #### 2. 省略 start 或 stop ```python print(lst[:5]) # 从开头到索引5(不含) -> [0, 1, 2, 3, 4] print(lst[5:]) # 从索引5到结尾 -> [5, 6, 7, 8, 9] print(s[:3]) # 'Hel' print(s[7:]) # 'rld' ``` --- #### 3. 使用 step 步长 ```python print(lst[::2]) # 每隔一个取一个 -> [0, 2, 4, 6, 8] print(lst[1::2]) # 从索引1开始,每隔一个 -> [1, 3, 5, 7, 9] print(s[::3]) # 'HlWl' —— 每三个字符取一个 ``` --- #### 4. 负索引的使用 ```python print(lst[-3:]) # 最后三个元素 -> [7, 8, 9] print(lst[:-2]) # 除了最后两个 -> [0,1,2,3,4,5,6,7] print(s[-5:]) # 'World' print(s[:-3]) # 'HelloWo' ``` --- #### 5. 反向切片(倒序) 通过负的 `step` 实现反转: ```python print(lst[::-1]) # 整个列表反转 -> [9,8,7,6,5,4,3,2,1,0] print(s[::-1]) # 字符串反转 -> 'dlroWolleH' print(lst[::-2]) # 逆序每隔一个 -> [9,7,5,3,1] print(lst[8:2:-1]) # 从索引8到3(含),逆序 -> [8,7,6,5,4,3] ``` --- #### 6. 超出范围的索引不会报错 ```python print(lst[100:]) # 空列表 [] print(lst[:100]) # 全部元素 [0..9] ``` > 切片是“安全”的,即使索引越界也不会抛出异常。 --- #### 7. 修改列表中的切片(仅适用于可变对象如 list) ```python lst = [1, 2, 3, 4, 5] lst[1:4] = ['a', 'b'] # 替换 [2,3,4] 为 ['a','b'] print(lst) # [1, 'a', 'b', 5] # 插入元素(长度不同也可以) lst[1:1] = ['x', 'y'] print(lst) # [1, 'x', 'y', 'a', 'b', 5] ``` > 注意:只有列表这种可变序列才支持赋值操作。 --- #### 8. 删除切片元素 ```python del lst[1:3] print(lst) # 删除 'x','y' -> [1, 'a', 'b', 5] ``` --- ### 三、常见用途 | 用途 | 示例 | |------|------| | 复制整个序列 | `lst[:]` 或 `lst[::]` | | 反转字符串/列表 | `s[::-1]` | | 获取前N个元素 | `lst[:n]` | | 获取后N个元素 | `lst[-n:]` | | 每隔k个取一个 | `lst[::k]` | | 去掉首尾元素 | `lst[1:-1]` | --- ### 四、内部原理简述 Python切片底层由 `slice` 对象实现。你可以手动创建 slice 对象: ```python sl = slice(1, 6, 2) print(lst[sl]) # 等价于 lst[1:6:2] -> [1, 3, 5] # 还可以用于多维索引(比如 NumPy 数组) ``` --- ### 五、注意事项 1. **不可变对象不能被赋值切片** 如字符串和元组不能执行 `s[1:3] = 'ab'`,会报错。 2. **切片是浅拷贝** 对于嵌套列表,切片复制的是引用: ```python nested = [[1,2], [3,4]] copy = nested[:] copy[0][0] = 99 print(nested) # [[99, 2], [3, 4]] —— 原列表也被改了! ``` 3. **性能提示** 切片会产生新对象,大数据量时注意内存开销。若只需遍历,可用 `itertools.islice()` 避免复制。 --- ### 六、高级技巧 #### 使用 `itertools.islice` 处理大序列或迭代器 ```python import itertools # islice 不支持负数索引,但适合处理无限或大型迭代器 gen = (x**2 for x in range(10)) result = list(itertools.islice(gen, 2, 6)) # 取第2~5个 print(result) # [4, 9, 16, 25] ``` --- ### 总结 切片Python 中优雅而高效的工具,掌握它能极大提升代码简洁性和可读性。其核心在于理解三参数 `(start, stop, step)` 的行为,尤其是负步长与负索引的组合用法。 ---
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值