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]