gpt4 book ai didi

python - 为什么在 python 中允许浮点切片 (slice(0,1,0.1)),但调用索引方法 (slice(0,1,0.1).indices) 会引发 TypeError?

转载 作者:行者123 更新时间:2023-12-03 19:15:11 30 4
gpt4 key购买 nike

示例:slice(0,1,0.1)在 python 3.7.7 中没问题,但是 slice(0,1,0.1).indices(10)引发 Type Error .

我想知道这种行为的潜在思维过程是什么。为什么构造浮点切片可以,但调用 indices 不行他们的方法? indices的用例是什么? ?

对于上下文:我了解 float 切片的用例 - 我自己有一个。我正在实现一个对象,该对象表示由一组有限支持点定义的任意维度的参数化分段线性函数。

最佳答案

tl;博士 slice当我们以方括号表示法使用它们时,对象是由解释器生成的,并且允许它们是任意的允许我们设计使用它们的代码。但是,因为内置列表依赖于indices()为了正确运行,该方法必须返回与列表兼容的值(即整数),如果不能,则抛出错误。

当你做

my_obj[1:3:2]

口译员基本上将其翻译*为
my_obj.__getitem__(slice(1, 3, 2))

这在使用列表时最为明显,列表在给定切片时具有特殊行为,但这种行为也是各种流行库中的其他数据类型(例如 numpy.arraypandas.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 解释器可能会走捷径并执行硬编码例程,而不是实际将符号转换为函数调用并执行它们。但就我们的目的而言,这个类比已经足够好用了,因为它确实适用于用户生成的对象。

关于python - 为什么在 python 中允许浮点切片 (slice(0,1,0.1)),但调用索引方法 (slice(0,1,0.1).indices) 会引发 TypeError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61017858/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com