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

时间:2015-03-22 04:58:26

标签: python indexing slice iterable

我正在学习Python,今天的练习是关于平铺房间的位置。事实上,我必须检查一个位置是否在房间内(在一个1x1房间,0.0被认为是,而1.0被认为是出局)让我想到了0-base索引迭代和切片。

阅读一些文章和讨论,每个0基础和1基础的一些利弊,关于切片的担忧等等。但最终被卡在我身上并且没有找到答案的问题是:
为什么同一种语言不能同时存在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处理物体时不是那么直观(“我想要球1到3之前的那个”),所以在一边,你把手指放在你想要的东西上,另一边,你不想要的东西上。但是这种方法确实具有产生完美边界的邻居选择的整洁特性,如[:a] [a:b] [b:c]。虽然按逆序(-1),但结果可能是意外的,因为它从对应物中逐个返回值,如; L = [0,1,2,3,4,5]使得L [1:3] = [1,2]并且L [3:1:-1] = [3:2]。因此,它符合规则a≤x< b,抓住下限项,但是如果不按逆序生成相同的选项,就会感到奇怪。

a≤x≤b是选择对象的自然方式(“我希望球1到3”),所以你要把手指放在你想要的东西上。如果你反转顺序(-1),你仍然很容易掌握你在挑选什么,因为无论你选择它包括如下:L = [0,1,2,3,4,5]所以L [1:3] = [1,2,3]和L [3:1:-1] = [3,2,1]。然而,当试图做邻居选择时,问题似乎到了,人们必须做[:a] [a + 1:b] [b + 1:c]才能完美地完成边界。那可怕吗?

即使人们可以看到≤x< b更擅长0-base,而a≤x≤b更适合1-base,我认为,索引库和切片规则可能在某种程度上是独立的。并且可以索引和切片它将适合问题或数据的基本原理的方式,因为即使切割具有≤x<1的1基索引数组也是如此。 b,仍然会产生预期的结果,如cir = [1,2,3,4,5]所以cir [1:3] = [1,2]或cir [:3] = [1,2] 。
同样的事情将≤x≤b应用于0基索引数组,如rul [0,1,2,3,4,5]所以rul [:2] = [0,1,2]或rul [ 0:2] = [0,1,2]

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

干杯

1 个答案:

答案 0 :(得分:2)

可以在同一种语言中使用不同的索引库或切片约定,有些语言可以这样做。例如,对于包含a..bb的范围,Ruby的a...b范围包含b,而{2}允许您使用$[更改数组索引基数。但是,支持这些功能会增加一种可能不值得获益的语言的复杂性。对于.....,Ruby的语法更复杂,Perl不鼓励$[,因为它太混乱了。

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

  

应该有一个 - 最好只有一个 - 显而易见的方法。

Python尝试制作像这个标准和统一的东西。做出Ruby或Perl做出的设计决定将违背这一理念。