slice()

作者: import_hello | 来源:发表于2018-12-13 22:40 被阅读0次

转载须注明出处:简书@Orca_J35 | GitHub@orca-j35,所有笔记均托管于 python_notes 仓库

相关笔记:『Subscriptions & Slicings.md』

如果需要生成迭代器版本的切片,则可使用 itertools.islice() 方法。

🔨 class slice(stop)

🔨 class slice(start, stop[, step])

该函数用于创建切片(slice)对象,切片对象表示由 range(start, stop,step) 指定的索引的集合。

start, stop, step 可以是任意类型的值,其中 startstep 的默认值是 None

slice(6,b'a','b') #> slice(6, b'a', 'b')
slice(6) #> slice(None, 6, None)

在使用扩展索引语法时,会自动生成切片对象。例如 a[start:stop:step] 将被翻译为 a[slice(start,stop,step)] ,并使用 None 填充切片中缺少的项,然后将结果传递给 __getitem__ 方法。因此,在使用扩展索引语法时,也可直接使用切片对象。

class Cls:
    def __getitem__(self,key):
        return key
# 使用扩展索引语法时,会自动生成切片对象,还会使用None填充空缺项
Cls()[0:1] #> slice(0, 1, None)

a = [1,2,3,4,5,6,7,8,9]
a[0:7:2] #> [1, 3, 5, 7]
# 与直接使用切片对象等效
a[slice(0,7,2)] #> [1, 3, 5, 7]

示例 - 为自定义类实现 subscription 和 slicing:

# 该示例没有实现负索引,也没有对切片的step进行处理
class Fib(object):
    def __getitem__(self, n):
        # 需要手动判断实参类型,从而区分subscription和slicing
        if isinstance(n, int): # n是索引
            a, b = 1, 1
            for x in range(n):
                a, b = b, a + b
            return a
        if isinstance(n, slice): # n是切片
            # 展示如何利用切片对象完成切片操作
            start = n.start # 获取切片的下界
            stop = n.stop # 获取切片的上界
            if start is None:
                start = 0
            a, b = 1, 1
            L = []
            for x in range(stop):
                if x >= start:
                    L.append(a)
                a, b = b, a + b
            return L
Fib()[:5] #> [1, 1, 2, 3, 5]
# 可直接使用 slice 对象
Fib()[slice(10)] #> [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

Slice objects

本节涵盖了 The standard type hierarchy -> Slice objects 中的内容。

切片对象用于表示 __getitem__() 方法获得的切片,也可通过内置函数 slice() 创建切片对象。

切片对象拥有三个特殊只读属性:

  • start is the lower bound;
  • stop is the upper bound;
  • stepis the step value;

以上三个属性可以是任意类型的值,并且没有其他功能,但是 Numerical Python 和其它第三方扩展会使用这三个属性。如果在创建切片对象时,省略了上述某个属性,则会将其设置为 None

class Cls:
    def __getitem__(self,key):
        return key
Cls()[0,b'orca':'_']
#> (0, slice(b'orca', '_', None))

在使用扩展索引语法时,会自动生成切片对象。例如 a[start:stop:step] 将被翻译为 a[slice(start,stop,step)] ,并使用 None 填充切片中缺少的项。在使用扩展索引语法时,也可直接使用切片对象。

class Cls:
    def __getitem__(self,key):
        return key
# 使用扩展索引语法时,会自动生成切片对象,还会使用None填充空缺项
Cls()[0:1] #> slice(0, 1, None)

a = [1,2,3,4,5,6,7,8,9]
a[0:7:2] #> [1, 3, 5, 7]
# 直接使用切片对象
a[slice(0,7,2)] #> [1, 3, 5, 7]

切片对象支持一种方法:

  • slice.indices(self, length)

    This method takes a single integer argument length and computes information about the slice that the slice object would describe if applied to a sequence of length items. It returns a tuple of three integers; respectively these are the start and stop indices and the step or stride length of the slice. Missing or out-of-bounds indices are handled in a manner consistent with regular slices.

    # S.indices(len) -> (start, stop, stride)
    # 该方法用于计算,将长度为length的序列按照slice对象执行切片时,
    # 子序列在原序列中的(start, stop, step)
    slice(3).indices(4) #> (0, 3, 1)
    slice(3).indices(2) #> (0, 2, 1)
    

因为 slice.__hash__ 等于 None,所以当试图获取 slice 类的实例的哈希值时会抛出异常。

相关文章

网友评论

    本文标题:slice()

    本文链接:https://www.haomeiwen.com/subject/ciuihqtx.html