我正在学习 Python,并且有 Ruby 的背景。从来没有元组,我无法想象为什么我需要它们,或者为什么 Python 如此依赖它们。
3 回答
棋盘上一个正方形的坐标是很好地使用元组的一个例子。我通常使用由元组索引的 Python dict 来实现多维数组,而不是 list-of-lists 或 numpy 或数组模块:
board = {}
board[ 3, 6 ] = "black queen"
board[ 0, 0 ] = "white king"
您不能将可变(如列表)用作字典键,因此您需要一个元组。
有时你会发现自己想要从一个函数返回多个值——一个表示成功或失败的布尔值加上一个描述失败模式的字符串,例如:
if trickyOperationSucceeds():
return True,"Success!"
return False,"The tricky thing failed!"
这不是一个经常使用的模式,但有时它会让你摆脱麻烦。您也可以在此处使用列表;只是按照惯例,您通常会改用元组。
在考虑如何表示必须一起传递的独立值时,元组、字典和类之间几乎是一个连续统一体。考虑三种表示复合回报的方式:
(False, "The tricky thing failed!")
{ "status": False, "message": "The tricky thing failed!" }
ResultObject( status=False, message="The tricky thing failed!" )
如果您的代码中只有一个地方执行此操作,则元组因其简洁而具有吸引力。如果您经常使用这种模式,并在不同模块之间来回传递这些结果对,您可能会“升级”到 dict,其中元素具有有意义的键。如果这些结果成为您软件设计的主要部分,您可能会再次将它们升级为对象类的实例。这是形式和易用性之间的平衡。
元组只是一个不可变的序列,因此您不能分配给元组的各个项目。一个示例可能是一组 xy 坐标,例如(5, 10), (-3, 20), (0, 0)
. 如果您需要更新其中一些坐标,您可以重新创建元组,例如
coord = (5, 10)
# Our thing moves
newCoord = (coord[0] + dx, coord[1] + dy)
元组应该用于异构数据;它是 Cstruct
或 Pascal 的Python 等价物record
。将元素附加到这种类型没有意义,因此不需要它是可变的。与用于同质数据的列表对比:
people = [(u'Bob', 24), (u'Sally', 27)]
polygon = [(1, 1), (2, 3), (0, 0)]