翻译:《实用的Python编程》02_01_Datatypes

2.1 数据类型和数据结构

本节以元组和字典为代表介绍数据结构。

原始数据类型

Python 有一些原始数据类型:

整数

浮点数

字符串(文本)

空类型 email_address = None

None 常用作可选值或缺失值的占位符。它在条件语句中计算为 False。

if email_address: send_email(email_address, msg) 数据结构

实际的程序具有更复杂的数据。例如,关于股票的持有信息:

100 shares of GOOG at $490.10

这是一个包含三个部分的“对象”:

股票的名称或符号("GOOG",字符串)

股份数目(100,整数)

价格(490.10,浮点数)

元组

元组是分组在一起的值的集合。

示例:

s = ('GOOG', 100, 490.1)

有时候会在语法上省略 () 。

s = 'GOOG', 100, 490.1

特殊情况(0 元组,1 元组)。

t = () # An empty tuple w = ('GOOG', ) # A 1-item tuple

元组一般用来表示简单的记录或结构。

通常,它是由多个部分组成的单个对象。这有一个很好的类比:元组就像数据库表中的一行。

元组的内容是有序的(类似于数组)。

s = ('GOOG', 100, 490.1) name = s[0] # 'GOOG' shares = s[1] # 100 price = s[2] # 490.1

但是,元组的内容无法修改。

>>> s[1] = 75 TypeError: object does not support item assignment

你可以基于当前元组创建一个新元组。

s = (s[0], 75, s[2]) 元组打包

元组更多的是把相关的项打包到一个实体(entity)中。

s = ('GOOG', 100, 490.1)

然后,该元组很容易作为单个对象传递给程序的其它部分。

元组拆包

要在其它地方使用元组,可以把元组的各部分拆包为变量。

name, shares, price = s print('Cost', shares * price)

左侧变量的数目必须与元组的结构匹配。

name, shares = s # ERROR Traceback (most recent call last): ... ValueError: too many values to unpack 元组与列表

元组看起来像只读列表。但是,元组最常用于由多个部分组成的单项。列表通常是类型相同的项的集合,

record = ('GOOG', 100, 490.1) # A tuple representing a record in a portfolio symbols = [ 'GOOG', 'AAPL', 'IBM' ] # A List representing three stock symbols 字典

字典是键到值的映射。有时,字典也称为哈希表(hash table)或关联数组(associative array)。键用作访问值的索引。

s = { 'name': 'GOOG', 'shares': 100, 'price': 490.1 } 常见操作

要从字典中获取值,请使用键名。

>>> print(s['name'], s['shares']) GOOG 100 >>> s['price'] 490.10 >>>

要添加或修改值,请使用键名进行分配。

>>> s['shares'] = 75 >>> s['date'] = '6/6/2007' >>>

要删除值,请使用 del 语句。

>>> del s['date'] >>> 为什么使用字典?

当存在很多不同的值并且可能会修改或操作这些值时,字典很有用。字典使代码更具可读性。

s['price'] # vs s[2] 练习

在上次的几个练习中,编写了一个取数据文件 Data/portfolio.csv 的程序 。使用 csv 模块,可以轻松地逐行读取文件。

>>> import csv >>> f = open('Data/portfolio.csv') >>> rows = csv.reader(f) >>> next(rows) ['name', 'shares', 'price'] >>> row = next(rows) >>> row ['AA', '100', '32.20'] >>>

尽管读取文件很容易,但是与读取数据相比,通常使用数据做更多的事情。例如,也许想存储它并对其执行一些计算。不幸的是,原始的数据“行”并不能这样做。例如,即使是简单的数学计算也不行。

>>> row = ['AA', '100', '32.20'] >>> cost = row[1] * row[2] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can't multiply sequence by non-int of type 'str' >>>

要执行更多的操作,通常需要以某种方式解释原始数据,并将其转换为更有用的对象类型,以便以后处理。有两种简单的方式可以选择:元组或者字典。

练习 2.1:元组

在交互式提示符下,创建以下代表上一行的元组,但数字列要转换为恰当的数字。

>>> t = (row[0], int(row[1]), float(row[2])) >>> t ('AA', 100, 32.2) >>>

使用这种方式,现在可以使用股份数目乘以价格来计算总价,

>>> cost = t[1] * t[2] >>> cost 3220.0000000000005 >>>

Python 中,数学没用了吗?结果为什么是 3220.0000000000005?

这是计算机上浮点硬件的产物,只能在二进制(而不是十进制)中准确表示小数。即使是涉及十进制小数的简单计算,也会引入小的误差。这很正常,如果你之前没有见过,可能会有点惊讶。

虽然在所有使用浮点小数的编程语言中都会发生这种情况,但是打印的时候可以把它隐藏,例如:

>>> print(f'{cost:0.2f}') 3220.00 >>>

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssxys.html