ZetCode

Python slice 函数

上次修改时间:2025 年 4 月 11 日

本综合指南探讨了 Python 的 slice 函数,该函数创建切片对象以进行序列操作。我们将介绍基本用法、高级技巧和序列切片的实际示例。

基本定义

slice 函数返回一个表示索引范围的切片对象。 它用于提取序列(如字符串、列表和元组)的一部分。 该函数最多接受三个参数:start(开始)、stop(停止)和 step(步长)。

主要特点:创建可重用的切片对象、支持负索引并处理省略的参数。 切片对象与方括号表示法一起使用以进行序列访问。

基本序列切片

以下是使用不同序列类型的简单用法,展示了 slice 如何提取字符串、列表和元组的一部分。

basic_slice.py
# With strings
text = "Hello, World!"
s = slice(7, 12)
print(text[s])  # 'World'

# With lists
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
s = slice(2, 8, 2)
print(numbers[s])  # [2, 4, 6]

# With tuples
colors = ('red', 'green', 'blue', 'yellow')
s = slice(1, 3)
print(colors[s])  # ('green', 'blue')

此示例显示了 slice 与不同序列类型一起使用。 切片对象被创建一次并被重用,使代码更简洁高效。

步长参数(第三个参数)允许跳过元素。 负索引从序列的末尾开始计数。

负索引和省略的参数

切片对象支持负索引并优雅地处理省略的参数。 此示例演示了这些功能。

negative_slice.py
data = [10, 20, 30, 40, 50, 60, 70, 80, 90]

# Negative indices
s1 = slice(-5, -1)
print(data[s1])  # [50, 60, 70, 80]

# Omitted start
s2 = slice(None, 4)
print(data[s2])  # [10, 20, 30, 40]

# Omitted stop
s3 = slice(6, None)
print(data[s3])  # [70, 80, 90]

# Only step
s4 = slice(None, None, 3)
print(data[s4])  # [10, 40, 70]

负索引从序列的末尾开始计数。 省略的参数 (None) 默认为序列边界。 这使得切片对象非常灵活。

步长参数可以单独使用,以从整个序列中选择每第 n 个元素。

重用切片对象

切片对象可以存储并与不同的序列重用,使其成为一致的数据提取模式的强大工具。

reuse_slice.py
# Create a slice object for middle three elements
middle_three = slice(1, 4)

# Reuse with different sequences
names = ['Alice', 'Bob', 'Charlie', 'Dave', 'Eve']
print(names[middle_three])  # ['Bob', 'Charlie', 'Dave']

temperatures = (32.5, 34.1, 29.8, 27.3, 25.9)
print(temperatures[middle_three])  # (34.1, 29.8, 27.3)

hex_values = '0123456789ABCDEF'
print(hex_values[middle_three])  # '123'

这演示了如何将单个切片对象应用于多个序列。 相同的提取模式在不同类型之间保持一致。

当您需要将相同的提取逻辑应用于程序中的许多序列时,此技术特别有用。

切片对象属性

切片对象具有三个可读属性:start(开始)、stop(停止)和 step(步长)。 可以检查或修改这些属性以实现动态切片行为。

slice_attrs.py
s = slice(2, 10, 2)

print(s.start)  # 2
print(s.stop)   # 10
print(s.step)   # 2

# Modify slice dynamically
data = list(range(20))
s = slice(None, None, None)

for step in range(1, 4):
    s = slice(s.start, s.stop, step)
    print(f"Step {step}: {data[s]}")

这些属性提供对切片参数的访问。 它们可用于创建新切片或以编程方式检查现有切片。

切片对象的动态修改可以实现灵活的序列处理模式,以适应运行时条件。

高级切片技巧

切片对象可以与其他 Python 功能结合使用,以实现强大的序列操作。 此示例显示了高级用法。

advanced_slicing.py
# Slice assignment
data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
s = slice(2, 6)
data[s] = ['a', 'b', 'c', 'd']
print(data)  # [0, 1, 'a', 'b', 'c', 'd', 6, 7, 8, 9]

# Multidimensional slicing
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
row_slice = slice(0, 2)
col_slice = slice(1, 3)
print([row[col_slice] for row in matrix[row_slice]])  # [[2, 3], [5, 6]]

# Slice in function arguments
def process_slice(sequence, slc):
    return sequence[slc]

s = slice(1, None, 2)
print(process_slice('abcdefgh', s))  # 'bdfh'

切片赋值修改可变序列的部分。 多维切片提取子矩阵。 将切片对象传递给函数可以使它们更加灵活。

这些技术展示了 Python 切片功能与其它语言特性结合使用的全部威力。

最佳实践

资料来源

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。 我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程