📚 Python 序列切片(Slicing)完整笔记

切片(Slicing)是 Python 中从序列(如 listtuplestr)中提取子序列的强大操作,语法简洁、功能强大,适用于所有有序序列类型


一、切片基本语法

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,复制用 [:];
越界也不怕,安全又强大!”

掌握切片,你就能像“切蛋糕”一样灵活处理任何序列数据!🍰

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐