相同语言的 0 基和 1 基索引迭代?自定义切片规则?

0-base and 1-base indexed iterables in the same language? Custom slicing rules?

我正在学习 Python 今天的练习是关于在铺有瓷砖的房间里的位置。我必须检查一个位置是否在房间内(在 1x1 房间内,0.0 被认为是在里面,1.0 被认为是在外面)这一事实让我一直在思考 0 基索引迭代和切片。

阅读一些文章和讨论,每个 0-base 和 1-base 的一些优缺点,对切片的担忧,等等。但最终困扰我但没有找到答案的问题是:
为什么0基和1基索引不能同时存在于同一种语言中,为什么切片不能自定义?

查看图片:http://i.stack.imgur.com/FEb9C.png

如果我要为标尺标记、间隔、边界、点编制索引,从 0 开始是有意义的; rul=[0,1,2,3,4,5,6] 会索引我尺子上的每个标记,因此相应地 rul[0]=0, rul[5]=5.
如果我要索引蓝色圆圈、自然数、对象、跨度,从 1 开始是有意义的; cir= [1,2,3,4,5] 这样 cir[1]=1 和 cir[5]=5.

现在,很多讨论都与切片和索引有关,我不完全明白为什么。

a ≤ x < b 在处理对象时不是那么直观 ("I want balls 1 up to the the one before 3"),所以一方面,你把手指放在你想要的东西上,另一方面,放在你不需要的东西上想。但是这种方法确实有 属性 产生完美边界的相邻 select 离子的巧妙之处,如 [:a][a:b][b:c]。尽管顺序相反(-1),但结果可能出乎意料,因为它 returns 的值与对应的值相差一个; L=[0,1,2,3,4,5] 使得 L[1:3]=[1,2] 和 L[3:1:-1]=[3:2]。所以符合a≤x

a ≤ x ≤ b 是 select objets ("I want the balls 1 up to 3") 的自然方式,因此您可以将手指放在想要的东西上。如果你颠倒 order(-1) 它仍然很容易掌握你在挑选什么,因为无论你 select 它包含如下: L=[0,1,2,3,4,5] 这样 L[ 1:3]=[1,2,3] 和 L[3:1:-1]=[3,2,1]。但是,问题似乎来了,当尝试做邻居 selections 时,人们必须做 [:a][a+1:b][b+1:c] 才能使边界完美。这么可怕?

尽管可以看到 a ≤ x < b 更适合 0-base,而 a ≤ x ≤ b 更适合 1-base,但我的看法是,索引基和切片规则可能以某种方式独立。人们会以适合问题或数据的基本原理的方式进行索引和切片,因为即使对 a ≤ x < b 的 1 基索引数组进行切片,仍会产生预期的结果,如 cir=[1, 2,3,4,5] 使 cir[1:3]=[1,2] 或 cir[:3]=[1,2].
将 a ≤ x ≤ b 应用于 0 基索引数组,如在 rul[0,1,2,3,4,5] 中一样,因此 rul[:2]=[0,1,2] 或 rul[ 0:2]=[0,1,2].

鉴于python是人类友好代码语言的例子,强调可读性,不会有0和1基索引和自定义切片方法,改进编写和阅读代码时的思维过程,通过使它们更好地适应特定的环境或数据?
是否有某种语言提供两种语言或每种语言只选择一种?

干杯

在同一种语言中可能有不同的索引基础或切片约定,有些语言就是这样做的。例如,Ruby 对包含 b 的范围有 a..b,对不包括 b 的范围有 a...b,并且 Perl 允许您使用 $[。但是,支持此类功能会增加语言的复杂性,可能得不偿失。 Ruby 的语法因为有 ..... 而更复杂,Perl 不鼓励 $[ 因为它太混乱了。

来自PEP 20的Python的设计原则之一是

There should be one-- and preferably only one --obvious way to do it.

Python 试图让这样的事情变得标准和统一。做出 Ruby 或 Perl 做出的设计决定将违背该理念。