Python 序列切片(Slicing)
·
📚 Python 序列切片(Slicing)完整笔记
切片(Slicing)是 Python 中从序列(如
list、tuple、str)中提取子序列的强大操作,语法简洁、功能强大,适用于所有有序序列类型。
一、切片基本语法
sequence[start : stop : step]
| 参数 | 说明 | 默认值 |
|---|---|---|
start | 起始索引(包含) | 0(正向) / -1(反向) |
stop | 结束索引(不包含) | 序列末尾(正向) / 序列开头(反向) |
step | 步长(可正可负) | 1 |
✅ 关键规则:
- 左闭右开:
[start, stop)- 负索引:
-1表示最后一个元素- 负步长:表示反向遍历
二、切片操作示例(基于你的代码)
1. 列表切片:[1:4]
my_list = [0, 1, 2, 3, 4, 5, 6]
result1 = my_list[1:4] # [1, 2, 3]
- 从索引
1(含)到4(不含),步长1
2. 元组切片:[:](完整复制)
my_tuple = (0, 1, 2, 3, 4, 5, 6)
result2 = my_tuple[:] # (0, 1, 2, 3, 4, 5, 6)
- 等价于
my_tuple[0:len(my_tuple):1] - 常用于浅拷贝
3. 字符串切片:[::2](隔一个取一个)
my_str = "0123456"
result3 = my_str[::2] # "0246"
- 从头到尾,步长
2
4. 字符串反转:[::-1]
my_str = "123456"
result4 = my_str[::-1] # "654321"
- 最简洁的字符串/列表反转方式
5. 反向切片:[3:1:-1]
my_list = [0, 1, 2, 3, 4, 5, 6]
result5 = my_list[3:1:-1] # [3, 2]
- 从索引
3开始,反向到索引1(不含) - 注意:
stop在反向时是“左边界”
6. 反向隔位取:[::-2]
my_tuple = (0, 1, 2, 3, 4, 5, 6)
result6 = my_tuple[::-2] # (6, 4, 2, 0)
- 从尾到头,每隔一个取一个
三、综合练习:提取“黑马程序员”
原始字符串:
my_str = "万过薪月,员序程马黑来,nohtyp学"
目标:“黑马程序员”
✅ 方法 1:直接定位反向切片
result7 = my_str[9:4:-1] # 从索引9到5(不含4),反向
# '黑'在9,'程'在8,'序'在7,'员'在6,'马'在5 → [9:4:-1] = [9,8,7,6,5]
✅ 方法 2:先反转,再正向切片
result8 = my_str[::-1][9:14] # 先反转,再取[9:14]
# 反转后:"学pyhton,来黑马程序,月薪过万"
# "黑马程序员" 在反转后的位置是 9~13
✅ 方法 3:先正向切片,再反转
result9 = my_str[5:10][::-1] # 先取[5:10]="员序程马黑",再反转
✅ 方法 4:结合字符串方法
result10 = my_str.split(",")[1].replace("来", "")[::-1]
# split → ["万过薪月", "员序程马黑来", "nohtyp学"]
# [1] → "员序程马黑来"
# replace("来","") → "员序程马黑"
# [::-1] → "黑马程序员"
💡 推荐方法:
my_str[5:10][::-1]—— 简洁、高效、易读!
四、切片的高级特性(拓展)
1. 越界安全
- 切片不会报索引越界错误!
[1,2,3][10:20] # [](空列表)
"abc"[-100:2] # "ab"
2. 步长为 0 会报错
s[::0] # ❌ ValueError: slice step cannot be zero
3. 切片赋值(仅限可变序列)
- 列表支持切片赋值(元组和字符串不行)
lst = [1, 2, 3, 4]
lst[1:3] = [10, 20, 30] # [1, 10, 20, 30, 4]
4. 切片删除
lst = [1, 2, 3, 4]
del lst[1:3] # [1, 4]
五、切片 vs 其他操作对比
| 需求 | 推荐方法 |
|---|---|
| 反转序列 | seq[::-1] |
| 复制序列 | seq[:] |
| 取前 N 个 | seq[:N] |
| 取后 N 个 | seq[-N:] |
| 每隔 K 个取 | seq[::K] |
| 倒序每隔 K 个取 | seq[::-K] |
六、常见误区
❌ 误区 1:认为 stop 是包含的
[0,1,2,3][1:3] # [1,2](不是 [1,2,3]!)
❌ 误区 2:负步长时 start < stop
[0,1,2,3][1:3:-1] # [](因为正向 start<stop,但步长为负,无法遍历)
# 正确:[3:1:-1] → [3,2]
❌ 误区 3:对字符串用切片“修改”
s = "hello"
s[0] = "H" # ❌ 报错
s = s[1:] # ✅ 生成新字符串 "ello"
✅ 总结口诀
“切片三参数,start stop step;
左闭右不包,步长可正负。
反转用 -1,复制用 [:];
越界也不怕,安全又强大!”
掌握切片,你就能像“切蛋糕”一样灵活处理任何序列数据!🍰
更多推荐


所有评论(0)