Pythonland中的Rubyist:元组的真实世界示例是什么?

时间:2012-08-10 20:28:38

标签: python ruby tuples

  

可能重复:
  Why do we need tuples in Python (or any immutable data type)?

我正在学习Python并拥有Ruby的背景知识。从来没有过元组,我无法想象为什么我会需要它们或者为什么Python会如此依赖它们。

3 个答案:

答案 0 :(得分:4)

棋盘上正方形的坐标是很好地利用元组的一个例子。我通常使用由tuple索引的Python dict来实现多维数组,而不是list-of-lists或numpy或array模块:

board = {}
board[ 3, 6 ] = "black queen"
board[ 0, 0 ] = "white king"

你不能使用mutable(如列表)作为字典键,所以你需要一个元组。

有时您会发现自己想要从函数中返回多个值 - 一个布尔值表示成功或失败,另外还有一个描述失败模式的字符串,例如:

if trickyOperationSucceeds():
    return True,"Success!"
return False,"The tricky thing failed!"

这不是一种可以使用很多的模式,但有时它会让你摆脱困境。你也可以在这里使用一个列表;按照惯例,你通常会使用元组。

在考虑如何表示必须一起传递的独立值时,元组,dicts和类之间几乎存在连续性。考虑表示复合回报的三种方式:

(False, "The tricky thing failed!")
{ "status": False, "message": "The tricky thing failed!" }
ResultObject( status=False, message="The tricky thing failed!" )

如果你的代码中只有一个地方你正在这样做,那么元组的简洁性很有吸引力。如果您经常使用此模式,并在不同模块之间来回传递这些结果对,则可以“升级”到dict,其中元素具有有意义的键。如果这些结果成为软件设计的主要部分,您可以再次将它们升级为对象类的实例。这是形式和易用性之间的平衡。

答案 1 :(得分:3)

元组只是一个不可变的序列,因此您无法分配元组的各个项目。一个示例可能是一组x-y坐标,如(5, 10), (-3, 20), (0, 0)。如果你需要更新其中一些坐标,你可以重新创建像

这样的元组
coord = (5, 10)
# Our thing moves
newCoord = (coord[0] + dx, coord[1] + dy)

答案 2 :(得分:1)

元组应该用于异构数据;它是C语言的struct或Pascal的record。将元素附加到这种类型没有意义,因此不需要它是可变的。与列表对比,列表用于同质数据:

people = [(u'Bob', 24), (u'Sally', 27)]
polygon = [(1, 1), (2, 3), (0, 0)]