在什么情况下应该违反元组应具有已知长度的规则?
没有。
这是一个关于“含义”的问题。如果一个对象的含义基于固定数量的元素,则它是一个元组。(x,y)坐标,(c,m,y,k)颜色,(lat,lon)位置等等。
元组的元素数量是基于问题域和特定问题的具体情况而定的。
设计一个具有不确定数量元素的元组没有多少意义。我们何时从(x,y)转换为(x,y,z),然后再到(x,y,z,w)坐标?不能简单地将一个值连接起来,就像连接列表一样。如果我们正在从二维坐标移动到三维坐标,通常需要一些非常复杂的数学来映射坐标系统。不能通过将元素附加到列表来实现。
从(r,g,b)颜色移动到其他颜色意味着什么?rgb系统中的第四种颜色是什么?同样,在cmyk系统中的第五种颜色是什么?
元组的大小不会改变。
*args是元组,因为它是不可变的。是的,它有无限数量的参数,但它是已知定义大小的元组的罕见反例。
如何处理长度不确定的元组。这个反例非常深刻,我们有两个选择。
1.拒绝元组是固定长度的这个想法,并且受到问题的限制。 (x,y)坐标和(r,g,b)颜色的概念是完全毫无价值和错误的,因为有这个反例。 固定长度的元组?永远不要。
2.始终将所有*args转换为列表,以始终具有烦琐的不加思考的符合设计原则的级别。 转换为列表?总是。
我喜欢全有或全无的选择,因为它们使软件工程变得如此简单和不加思考。
也许在这些极端情况下,这里有一点“需要思考”的微小碎片。 一个微小的碎片。
是的,*args是一个元组。 是的,它具有不确定的长度。 是的,它是一个反例,其中“由问题域固定”被“简单地不可变”所取代。
这引导我们进入第三种情况,即序列由于其他原因而不可变。 您永远不会改变它,因此可以是具有不确定大小的元组。 在您将*args视为堆栈或队列并弹出值的更罕见的情况下,您可能需要将其转换为列表。 但我们不能预先解决所有可能的问题。
有时需要思考。
当你在进行设计时,你会有一个目的来设计元组。那就是为了对数据进行一种有意义的结构化处理。如果元素数量是固定的,那就使用元组;如果元素数量是可变的(即可修改的),那就使用列表。