Python slice() 函数

Python slice() 语法

slice() 是 Python 的一个内置函数,它用于对以下 2 种类型的对象进行切片操作,然后返回包含指定范围的切片对象。

  • 序列类型:包括列表、元组、字符串、range 等。
  • 自定义对象:实现 __getitem__()__len__() 这两个方法的对象。

语法:

slice(stop)

slice(start, stop, step=1)

说明:

slice() 函数接收 3 个参数。

  • start(可选,默认值为:0):表示开始值(包含)。
  • stop(必选):表示结束值(不包含)。
  • step(可选,默认值为:1):表示步长,即每两个数的间隔。

简单来说,slice() 函数有以下 3 种取值情况。

  • 当 slice() 有 1 个参数时,表示 slice() 只有结束值,此时截取范围是从 0 开始的。
  • 当 slice() 有 2 个参数时,表示 slice() 只有开始值和结束值,此时截取范围是从 “开始值” 开始的。
  • 当 slice() 有 3 个参数时,表示 slice() 有开始值、结束值和步长。所谓的步长,也叫 “间隔”,指的是用于确定切片的每个索引之间的增量。

slice() 函数会返回一个 slice 对象,该对象可以传递给任何序列(包括列表、元组、字符串等)的切片操作符 “[]”。

提示:

  • slice() 和 range() 这两个函数的语法是几乎一样的,小伙伴们可以对比理解一下。
  • 切片对象本身不是序列,它只是定义了如何从序列中提取元素的规则。我们需要将这个切片对象应用于一个序列(通过方括号 “[]” )才能得到实际的切片结果。
  • 切片操作返回的是原序列的浅拷贝,而不是对原序列的引用。

Python slice() 摘要

使用频率
时间复杂度 O(1)
官方文档 查看
相关函数 range()len()

Python slice() 示例

我们都知道,序列都有切片操作(比如列表切片字符串切片等)。这些切片操作都是通过 “[]” 的方式实现的。实际上,使用 Python slice() 函数同样可以实现它们的切片操作。

示例 1:slice() 对列表切片

colors = ['红', '橙', '黄', '绿', '青', '蓝', '紫']
s1 = slice(3)
s2 = slice(1, 5, 2)

print(colors[s1])
print(colors[s2])

运行结果如下。

['红', '橙', '黄']
['橙', '绿']

分析:

slice() 函数返回的是一个切片对象,该切片对象是放到 “[]” 中使用的。事实上,site[slice(4)] 等价于 site[0:4],而 site[slice(1, 6, 2)] 等价于 site[1:6:2],这样理解就简单多了。

示例 2:slice() 对元组切片

animals = ('ant', 'bee', 'cat', 'dog', 'ewe')
s1 = slice(2)
s2 = slice(1, 3)

print(animals[s1])
print(animals[s2])

运行结果如下。

('ant', 'bee')
('bee', 'cat')

示例 3:slice() 对字符串切片

site = 'lvyenet'
s1 = slice(4)
s2 = slice(1, 6, 2)

print(site[s1])
print(site[s2])

运行结果如下。

lvye
vee

示例 4:负索引与步长

nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
s = slice(-3, None, -2)

print(nums[s])

运行结果如下。

[7, 5, 3, 1]

分析:

slice(-3, None, -2) 表示从倒数第 3 个到开头,反向步长为 2。

示例 5:自定义对象切片

class MySequence:
    def __init__(self, data):
        self.data = data
    
    def __getitem__(self, key):
        if isinstance(key, slice):
            return self.data[key]
    
    def __len__(self):
        return len(self.data)

seq = MySequence([10, 20, 30, 40, 50])
s = slice(1, 4, 2)
print(seq[s])

运行结果如下。

[20, 40]

分析:

上面代码定义了一个支持切片操作的自定义序列类 MySequence,然后我们通过实现 __getitem__() 方法来处理 slice 对象并返回子序列。最后,seq[s] 提取了 [20, 40] 作为结果。

slice() 与 range() 的区别

slice() 和 range() 这 2 个函数的语法十分相似(如下所示):

# slice()
slice(start, stop, step)

# range()
range(start, stop, step)

但两者的功能却是完全不同的,它们之间的区别如下:

  • slice():用于从序列中提取子序列,它返回一个切片对象。
  • range():用于生成整数序列,可以直接用于循环或转换为列表,它返回一个 range 对象。

示例 6:slice() vs range()

# 使用 slice() 提取子序列
nums = [0, 1, 2, 3, 4, 5, 6]
s = slice(1, 5, 2)
print(nums[s])

# 使用 range() 生成整数序列
r = range(1, 5, 2)
print(list(r))

运行结果如下。

[1, 3]
[1, 3]

上一篇: len()

下一篇: reversed()

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号