我现在正在上Python课,我们刚学习了元组这种数据类型。我阅读了维基百科关于它的页面,但是我无法弄清楚在实践中这种数据类型何时会有用处。能否给一些例子呢?也许是在Python中,需要一个不可变的数字集合。那这与列表的区别在哪里?
当您需要将多个数据组合成键,并且不想为其创建类时,元组是很好的字典键。
a = {}
a[(1,2,"bob")] = "hello!"
a[("Hello","en-US")] = "Hi There!"
我主要使用这个功能创建一个键为网格顶点坐标的字典。然而,在我的特定情况下,所涉及的浮点数的精确比较正常工作,但这可能并不总是适用于您的目的(在这种情况下,我可能会将传入的浮点数转换为某种固定点整数)。
最好的理解方式是:
因此,您可以避免编写以下内容:
person = {"name": "Sam", "age": 42}
name, age = person["name"], person["age"]
或者更冗长的:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
person = Person("Sam", 42)
name, age = person.name, person.age
您可以只写:
person = ("Sam", 42)
name, age = person
type alias Person = (String, Int)
person : Person
person = ("Sam", 42)
这强调了一种特定类型的元组总是应该按照固定顺序具有固定数量的字段,每个字段始终应该是相同的类型。在这个例子中,一个人总是由两个字段的元组组成,一个是字符串,另一个是整数。
这与列表形成了鲜明的对比,列表应该是可变长度的(每个列表中的项目数通常不同,并编写函数来添加和删除项目),并且列表中的每个项目通常是相同的类型。例如,您会有一个人的列表和另一个地址的列表-您不会在同一个列表中混合人和地址。而在同一元组中混合不同类型的数据正是元组的全部意义所在。元组中的字段通常是不同类型的(但不总是-例如,您可以有一个(Float,Float,Float)
元组来表示x、y、z坐标)。
元组和列表经常嵌套。列表元组是很常见的。您可以像使用Person对象一样拥有Person元组列表。您还可以拥有一个值为列表的元组字段。例如,如果您有一个地址簿,其中一个人可以拥有多个地址,则可以具有类型为(Person,[String])
的元组。在函数式编程语言中,[String]
类型通常用于表示字符串列表。在Python中,您不需要编写类型,但您可以以完全相同的方式使用元组,将Person
对象放入元组的第一个字段中,并将字符串列表放入其第二个字段中。
from collections import namedtuple
Person = namedtuple("Person", "name age")
person = Person("Sam", 42)
name, age = person.name, person.age
元组和列表在一般情况下具有相同的用途。通常来说,不可变数据类型有很多好处,主要是关于并发问题。
因此,当您拥有不具有易变性质的列表,并且需要保证没有消费者对其进行更改时,您可以使用元组。
典型的例子是应用程序中的固定数据,例如公司部门、类别等。如果这些数据发生变化,通常只有一个生产者会重建元组。
元组是一系列的值,这些值可以是任何类型,并且它们由整数索引,所以元组不像列表。最重要的区别在于元组是不可变的。
元组是由逗号分隔的值列表:
t = 'p', 'q', 'r', 's', 't'
在IT技术中,将元组用括号括起来是一种良好的实践:
t = ('p', 'q', 'r', 's', 't')
如果您需要将两个或更多对象作为一个集合处理,那么它们非常有用。
使用元组
如果您的数据不需要或者不会被更改。
元组比列表更快。如果我们正在定义一组常量值,并且我们将始终通过迭代来处理它,则应该使用元组而不是列表。
如果我们需要一个元素数组作为字典键,则可以使用元组。由于列表是可变的,因此永远不能用作字典键。
此外,元组是不可变的,而列表是可变的。同样地,元组的大小是固定的,而列表是动态的。
a_tuple = tuple(range(1000))
a_list = list(range(1000))
a_tuple.__sizeof__() # 8024 bytes
a_list.__sizeof__() # 9088 bytes
就功能而言,列表总是可以替代元组(除了作为字典中的键)。但是,元组可以使事情更快。例如,在Java中使用不可变字符串时也是如此--您何时需要无法更改字符串?从来没有!
我刚刚阅读了一篇有关限制您所能做的内容以制作更好程序的讨论; 为什么函数式编程很重要
元组用于存储多个值。正如您所指出的,元组就像一个不可变的列表 - 例如,一旦创建,您无法添加/删除/交换元素。
不可变的一个好处是,由于元组是固定大小的,它允许运行时执行某些优化。当元组在返回值或函数参数的上下文中使用时,这特别有益。