1.7 元组
要创建简单的数据结构,可以使用元组将一组值打包到一个对象中。在圆括号中放入一组值即可创建元组,例如:
stock = ('GOOG', 100, 490.10)
address = ('www.python.org', 80)
person = (first_name, last_name, phone)
即使没有圆括号,Python通常也能识别出元组:
stock = 'GOOG', 100, 490.10
address = 'www.python.org',80
person = first_name, last_name, phone
为了完整起见,也可以定义0个和1个元素的元组,但语法较为特殊:
a = () # 0元组 (空元组)
b = (item,) # 1元组 (注意随后的逗号)
c = item, # 1元组 (注意随后的逗号)
和列表一样,也可以使用数字索引来提取元组中的值。然而,更常见的做法是将元组解包为一组变量,例如:
name, shares, price = stock
host, port = address
first_name, last_name, phone = person
尽管元组支持的大部分操作与列表的相同(如索引、切片和连接),但创建元组后不能修改它的内容(也就是说无法替换、删除现有元组中的元素,或者向现有元组中添加新元素)。这说明最好把元组看成一个由多个部分组成的单一对象,而不是可在其中插入或删除项的不同对象的集合。
因为元组与列表之间存在诸多相似之处,所以有些程序员往往完全忽略了元组,而只使用列表,因为后者看似更灵活。尽管这并无不可,但如果程序创建了大量的小列表(即包含的项少于十来个),则会造成内存浪费。这是因为系统会为列表分配稍微多一些内存,以优化添加新项的操作的性能。而由于元组是不可变的,所以它们的展现更为紧凑,不会占据额外的内存空间。
表示数据时,经常同时使用元组和列表。例如,下面的程序显示了如何读取包含不同数据列,且各数据列由逗号隔开的文件:
# 文件中各行的格式为"name,shares,price"
filename = "portfolio.csv"
portfolio = []
for line in open(filename):
fields = line.split(",") # 将每行划分为一个列表
name = fields[0] # 提取并转换每个字段
shares = int(fields[1])
price = float(fields[2])
stock = (name,shares,price) # 创建一个元组(name, shares, price)
portfolio.append(stock) # 将记录追加到列表中
字符串的split()方法会按照指定的分隔符将一个字符串划分为一个字段列表。该程序最后创建的portfolio数据结构类似一个二维的行列数组,每行由一个元组表示,并可通过如下方式访问:
>>> portfolio[0]
('GOOG', 100, 490.10)
>>> portfolio[1]
('MSFT', 50, 54.23)
>>>
每个数据项可以通过如下方式访问:
>>> portfolio[1][1]
50
>>> portfolio[1][2]
54.23
>>>
下面给出了一种循环访问所有记录并将字段展开到一组变量中的简单方法:
total = 0.0
for name, shares, price in portfolio:
total += shares * price
时间: 2024-10-04 16:15:35