Rubyist in Pythonland: what is a real world example of a tuple?
Possible Duplicate:
Why do we need tuples in Python (or any immutable data type)?
号
我正在学习Python,并且有Ruby的背景。从来没有元组,我无法想象为什么我需要它们,或者为什么Python如此依赖它们。
棋盘上正方形的坐标就是很好地使用元组的一个例子。我通常使用由元组索引的python dict来实现多维数组,而不是列表列表或numpy或array模块:
1 2 3 | board = {} board[ 3, 6 ] ="black queen" board[ 0, 0 ] ="white king" |
不能使用可变的(如列表)作为字典键,因此需要一个元组。
有时,您会发现自己希望从一个函数返回多个值-一个布尔值表示成功或失败,再加上一个描述失败模式的字符串,例如:
1 2 3 | if trickyOperationSucceeds(): return True,"Success!" return False,"The tricky thing failed!" |
。
这不是一个经常使用的模式,但有时它会让你摆脱麻烦。您也可以在这里使用一个列表;只有按照惯例,您通常才使用tuple。
当考虑如何表示必须一起传递的独立值时,元组、dict和类之间几乎是连续的。考虑三种表示复合收益的方法:
1 2 3 | (False,"The tricky thing failed!") {"status": False,"message":"The tricky thing failed!" } ResultObject( status=False, message="The tricky thing failed!" ) |
如果您的代码中只有一个地方可以执行此操作,那么元组就具有简洁的吸引力。如果您经常使用这个模式,并且在不同的模块之间来回传递这些结果对,那么您可以"升级"到dict,其中元素具有有意义的键。如果这些结果成为软件设计的主要部分,您可以将它们再次升级为对象类的实例。它在形式和易用性之间取得了平衡。
元组只是一个不可变的序列,因此不能分配给一个元组的各个项。一个例子可能是一组x-y坐标,比如
1 2 3 | coord = (5, 10) # Our thing moves newCoord = (coord[0] + dx, coord[1] + dy) |
tuple应该用于异构数据;它是C的
1 2 | people = [(u'Bob', 24), (u'Sally', 27)] polygon = [(1, 1), (2, 3), (0, 0)] |
号