示例:slice(0,1,0.1)
在python 3.7.7中是可以的,但slice(0,1,0.1).indices(10)
引发了一个Type Error
。
我想知道这种行为的基本思想过程是什么。为什么可以构造浮点切片,但不能对其调用indices
方法?indices
的用例是什么?
上下文:我理解float切片的用例——我自己也有一个。我正在实现一个对象,该对象表示由有限的支撑点集定义的任意维度上的参数化、分段线性函数。
tl;drslice
对象是由解释器在方括号表示法中使用它们时生成的,允许它们是任意的可以让我们设计使用它们的代码。然而,由于内置列表依赖于indices()
才能正常运行,因此该方法必须返回与列表兼容的值(即整数(,如果不能返回,则会抛出错误。
进行时
my_obj[1:3:2]
解释器基本上将其翻译为
my_obj.__getitem__(slice(1, 3, 2))
这在使用列表时最为明显,列表在给定切片时具有特殊行为,但这种行为也是各种流行库中的其他数据类型(例如numpy.array
和pandas.Dataframe
(。这些类实现了自己的__getitem__()
方法,这些方法有自己的特殊方法来处理切片。
现在,内置列表大概使用slice.indices()
将整个切片分解为一组单独的索引,它可以访问这些索引,然后将其分组并返回。列表索引只能是整数,他们不希望此功能中断,因此最一致的方法是使slice.indices()
在无法生成整数列表时抛出错误。
不过,他们不能将slice
限制为只有这些值,因为它是其他用户定义类可能想要使用的解释器生成的对象。如果你设计这样的对象:
class myGenerator:
def __getitem__(self, s): # s is a slice
def gen():
i = s.start
while i < s.stop:
yield i
i += s.step
return list(gen())
h = myGenerator()
print(h[1:4:.25])
# [1, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75]
print(h[0:1:0.1])
# [0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6, 0.7, 0.7999999999999999, 0.8999999999999999, 0.9999999999999999]
然后它可以选择切片表示法来工作,这样我们就可以为它制定自定义行为。但如果我们将slice.indices()
改为使用它,那么它就会破坏内置的list
-因此,python不允许我们这样做。
*从技术上讲,对于许多内置程序,python解释器可能会采用快捷方式并执行硬编码例程,而不是实际将符号转换为函数调用并执行它们。但就我们的目的而言,这种类比足够好,因为它确实适用于用户生成的对象。