首页Python【Python内置函数】s...

【Python内置函数】slice()函数

Python 提供了许多内置函数,这些函数是Python语言的一部分,可以直接在Python程序中使用而无需导入任何模块。

本系列将会陆续整理分享一些的Python内置函数。

文章配套代码获取有以下两种途径:
  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/11x9_wCZ3yiYOe5nVcRk2CQ?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/Python_built-in_functions





01
简介

slice()函数用于创建一个切片对象(slice对象)。Python中的slice对象用于表示由range(start, stop, step)指定的一组索引。它通常用于对序列(如列表、元组和字符串)进行切片操作。slice对象可以通过slice()函数创建,也可以直接通过切片语法(例如a[start:stop:step])生成。
但是,需要注意的是,range(start, stop, step)生成的是一个数字序列,而slice(start, stop, step)创建的是一个用于索引的切片对象。

slice()函数的基本语法如下:

slice(stop)slice(start, stop, step=None)
  • 参数说明:
  • start:切片的起始索引(包含);
  • stop:切片的结束索引(不包含),必须指定;
  • step:步长,表示每次跳过的元素数量。
  • 返回值:

slice()函数返回一个slice对象,该对象可以用于对序列进行切片操作。

  • 只读属性:

slice对象具有startstopstep三个只读属性,这些属性仅返回传递给slice()函数或从切片语法中推导出的值。

# 创建一个 slice 对象
s = slice(2, 7, 2)

# 访问属性
print(s.start)  # 输出:2
print(s.stop)   # 输出:7
print(s.step)   # 输出:2
  • 扩展索引语法
当使用扩展索引语法(例如 a[start:stop:step] )时,Python会自动生成一个slice对象。这在多维数组(例如NumPy数组)中特别有用。对于多维数组(如NumPy),逗号分隔的切片会生成包含多个 slice对象的元组。
import numpy as np
arr = np.arange(20).reshape(4, 5)
print(arr[1:3, 2:4])  # 等价于 arr[(slice(1,3), slice(2,4))]
# 输出:[[ 7  8]
#      [12 13]]
  • Python 3.12 的变化
Python 3.12开始,如果切片对象的startstopstep属性是可哈希的(例如整数),则切片对象本身也是可哈希的。这意味着可以将切片对象用作字典的键或集合的元素等。
# 创建一个具有可哈希属性的 slice 对象
s1 = slice(1, 5, 2)

# 将 slice 对象用作字典的键
my_dict = {s1: "示例切片"}

# 访问字典
print(my_dict[s1])  # 输出:示例切片
  • 与itertools.islice的比较
虽然slice对象用于表示索引范围,但是itertools.islice是一个迭代器,用于从可迭代对象中返回选定的元素。与slice不同,itertools.islice不会创建一个新的序列,而是按需生成元素,这使得它在处理大型序列时更加节省内存。
import itertools

my_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 创建一个迭代器
my_iter = itertools.islice(my_list, 2, 7, 2)

# 遍历元素
for item in my_iter:
    print(item)  # 输出:2, 4, 6

02
使用

下面是一些使用 slice() 函数的示例:

  • 示例 1:基本使用

slice对象可以直接用于对序列进行切片操作。

# 创建一个列表
my_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 使用 slice() 创建切片对象
s1 = slice(2, 7, 2)

# 使用切片对象对列表进行切片
result = my_list[s1]
print(result)  # 输出:[2, 4, 6]

# 等同于直接进行切片操作
print(my_list[2:7:2])  # 输出: [2, 4, 6]
# 省略 start 和 step 参数
s2 = slice(7)  # 相当于 slice(0, 7, 1)

# 使用切片对象对字符串进行切片
result = my_list[s2]
print(result)  # 输出:[0, 1, 2, 3, 4, 5, 6]
# 使用负索引和负步长
s3 = slice(-1, -8, -2)  # 从倒数第1个元素开始,到倒数第8个元素结束(不包含),步长为-2

# 使用切片对象对元组进行切片
result = my_list[s3]
print(result)  # 输出:[9, 7, 5, 3]


  • 示例 2:自定义类支持切片

如果想让自定义类支持切片操作,需要在类中实现__getitem__方法。__getitem__方法通过索引或切片语法访问对象的元素。通过实现该方法来定义类的行为,使其能够处理切片操作。

class CustomList:
    def __init__(self, data):
        self.data = data
    
    # 在类中实现 __getitem__方法时,需处理slice对象以支持切片操作
    def __getitem__(self, index):
        if isinstance(index, slice):
            start, stop, step = index.indices(len(self.data))
            return [self.data[i] for i in range(start, stop, step)]
        else:
            return self.data[index]

cl = CustomList(list(range(10)))
print(cl[slice(-1, -8, -2)])  # 输出 [9, 7, 5, 3]
print(cl[2:7:2])  # 输出 [2, 4, 6]


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments