- 本书赞誉
- 前言
- 目标读者
- 不适合阅读本书的读者
- 本书结构
- 什么是数据处理
- 遇到困难怎么办
- 排版约定
- 使用代码示例
- 致谢
- 第 1 章 Python 简介
- 第 2 章 Python 基础
- 第 3 章 供机器读取的数据
- 第 4 章 处理 Excel 文件
- 第 5 章 处理 PDF 文件 以及用 Python 解决问题
- 第 6 章 数据获取与存储
- 第 7 章 数据清洗:研究、匹配与格式化
- 第 8 章 数据清洗:标准化和脚本化
- 第 9 章 数据探索和分析
- 第 10 章 展示数据
- 第 11 章 网页抓取:获取并存储网络数据
- 第 12 章 高级网页抓取:屏幕抓取器与爬虫
- 第 13 章 应用编程接口
- 第 14 章 自动化和规模化
- 第 15 章 结论
- 附录 A 编程语言对比
- 附录 B 初学者的 Python 学习资源
- 附录 C 学习命令行
- 附录 D 高级 Python 设置
- 附录 E Python 陷阱
- 附录 F IPython 指南
- 附录 G 使用亚马逊网络服务
- 关于作者
- 关于封面
2.2 数据容器
本节会讲到数据容器,里面装有许多数据点(data point)。但应该注意的是,这些容器本身也是 Python 的数据类型。Python 中有几种常见的容器:变量、列表和字典。
2.2.1 变量
变量为我们提供了保存数据的方法,这些数据包括字符串、数字或其他数据容器。变量由一串字符组成,通常是一个小写单词(或用下划线连接的多个单词),用来说明变量包含的内容。
我们试着创建一个简单的变量。在 Python 解释器中,试试下面的代码:
filename = 'budget.csv'
输入正确的话,解释器应该不会返回任何值。这与在 Python 解释器中输入字符串有所不同。如果在 Python 解释器中只输入 'budget.csv',它会输出 'budget.csv'。
当你创建一个变量时,是将程序本来应该输出的数据赋值给这个变量。这也是创建新变量时没有返回值的原因。在上面的例子中,我们的变量叫作 filename,其中保存着我们输入的字符串('budget.csv'),作为它的值。
面向对象编程
你可能听说过面向对象编程(object-oriented programming,OOP)。Python 是一门面向对象的编程语言。“面向对象编程”中的“对象”可以是本章我们学过的任意一种数据类型,例如字符串、变量、数字或浮点数。
在正文给出的例子中,我们的对象是一个字符串,此时保存在 filename 中。我们定义的每一个变量都是一个 Python 对象。在 Python 中,我们用对象来保存后面要用到的数据。这些对象通常具有不同的性质和行为,但它们都是对象。
例如,每一个整数对象都可以用 + 号(加法运算符)与另一个整数相加。继续学习 Python 的过程中,你会学到关于这些对象及其基础类型的性质和行为的更多内容,也会因此喜欢上面向对象编程的!
前面在创建一串字母并将其赋值给名为 filename 的变量时,我们遵循了变量命名的几条通用规则。不用担心记不住这些规则,但如果在代码中定义新变量时出现错误,一定要想起这些规则。
· 可以包含下划线,但不能包含连字符。
· 可以包含数字,但变量名不能以数字开头。
· 为了方便阅读,单词用小写字母,单词之间用下划线隔开。
试一试下面的代码:
1example = 'This is going to break.'
发生了什么?你得到了什么类型的错误?你应该得到的是语法错误,因为你违反了第二条规则。
只要不违反 Python 变量命名的规则,变量几乎可以任意命名。例如:
horriblevariablenamesarenotdescriptiveandtoolong = 'budget.csv'
可以看出,变量名太长,并且没有对变量内容进行说明。另外,缺少下划线,让人难以读懂。什么样的变量名是一个好的变量名?问自己一个问题:六个月之后,如果我已经把代码全部忘记了,什么样的变量名仍是有意义的,并能帮我理解代码的内容?
我们来看一个更合理的变量名——cats。如前一个例子所示,变量的值不一定要是文件名。
变量可以有许多不同的值和名字。我们假装在数猫咪的数量,所以要把一个整数赋值给变量 cats:
cats = 42
如果 Python 脚本记录了我们有多少只猫咪,我们不需要每时每刻都知道确切的数字。我们只需要知道这个值被保存在变量 cats 中,所以,当我们在解释器中调用 cats 时,或者在另一段代码中用到 cats 时,它总会返回当前猫咪的数量。
调用变量,是指请求 Python 返回该变量的值。我们来调用 cats。在解释器中输入 cats。你应该会得到 42 作为返回值。如果输入 filename,你应该会得到字符串 'budget.csv' 作为返回值。在计算机上试一下:
>>> cats 42 >>> filename 'budget.csv' >>>
如果输入不存在的变量名(或者输错了变量名),你会得到以下错误:
>>> dogs Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'dogs' is not defined
前面说过,学会如何阅读错误信息是很重要的,这可以让你明白犯了什么错误,以及如何改正错误。在这个例子中,错误信息指出,dogs is not defined,意思是我们没有定义过一个叫作 dogs 的变量。由于我们没有定义过这个变量,所以 Python 不知道我们要调用的是什么。
在第一个例子中,如果你忘了在 'budgets.csv' 上加引号,也会得到相同的错误。在 Python 解释器中试一下:
filename = budget.csv
返回的错误信息是 NameError: name 'budget' is not defined。这是因为 Python 并不知道 budget.csv 应该是一个字符串。要记住,字符串总是用引号来标记。没有引号的话, Python 会试图将其解释成另一个变量。这个练习的要点就是,注意错误发生在哪一行,并问问自己:错误可能出在哪里?在 dogs 的例子中,错误信息指出,错误发生在第 1 行。如果有很多行代码,错误信息可能会指向第 87 行。
前面给出的所有例子都是短字符串或整数。变量也可以保存长字符串,甚至是跨很多行的字符串。在例子中我们选择用短字符串,是因为对你(或我们)来说,输入长字符串一点都不好玩。
试一下保存长字符串的变量。注意,字符串里含有单引号,我们必须用双引号来保存:
recipe = "A recipe isn't just a list of ingredients."
现在输入 recipe,你会得到保存的长字符串:
>>>recipe "A recipe isn't just a list of ingredients."
变量的数据类型不一定要是字符串或整数。变量可以保存各种不同的 Python 数据类型,我们会在后续章节进一步学习这方面的内容。
2.2.2 列表
列表是具有某种共同关系的一组值。在 Python 中使用列表,和在日常语言中使用列表很相似。在 Python 中,将一列元素放到方括号([])中,元素之间用逗号隔开,即可创建列表。
我们在 Python 中创建一个食品的列表:
['milk', 'lettuce', 'eggs']
上面这个列表由字符串组成,不是由变量组成。这一点是可以看出来的,因为单词都用引号包裹。如果元素都是变量的话,是不会有两边的引号的。
按下 Return 键,Python 会返回以下内容:
['milk', 'lettuce', 'eggs']
你刚刚创建了第一个 Python 列表:字符串列表。你可以创建任意数据类型的列表,或者多种数据类型混合的列表(例如,同时包含浮点数和字符串的列表)。我们来创建一个同时包含整数和浮点数的列表:
[0, 1.0, 5, 10.0]
下面将我们的列表保存在变量中,这样就可以在后面的代码中调用它。变量很有用,因为变量可以让我们不必反复输入数据。如果列表很长,比如说有 5000 个元素那么长,手动输入数据很容易出错,而且效率不高。正如前文所述,变量是保存值的方法,将其保存在合理命名的容器中。
在 Python 解释器中尝试以下代码:
shopping_list = ['milk', 'lettuce', 'eggs']
按下 Return 键,你应该会看到新的一行。看起来似乎什么也没有发生。之前是将列表原样返回,还记得吗?现在 Python 将列表保存在 shopping_list 变量中。如果在 Python 提示符中输入 shopping_list 来调用变量,你应该会得到以下返回值:
shopping_list ['milk', 'lettuce', 'eggs']
列表也可以保存变量。比如说,我们有一个变量,里面保存的是动物收容所中动物的数量:
cats = 2 dogs = 5 horses = 1
现在可以将这些动物的数量放在一个列表中:
animal_counts = [cats, dogs, horses]
在 Python 解释器中输入 animal_counts,Python 会返回下面的值:
[2, 5, 1]
变量为我们保存信息。当我们输入变量名时,Python 返回的是变量中保存的值。
你还可以创建包含列表的列表。比如说,创建动物名字的列表:
cat_names = ['Walter', 'Ra'] dog_names = ['Joker', 'Simon', 'Ellie', 'Lishka', 'Fido'] horse_names = ['Mr. Ed'] animal_names = [cat_names, dog_names, horse_names]
在 Python 解释器中输入 animal_names,Python 会返回下面的值:
[['Walter', 'Ra'], ['Joker', 'Simon', 'Ellie', 'Lishka', 'Fido'], ['Mr. Ed']]
你不必输入所有的名字来创建包含列表的列表。原始变量(cat_names, dog_names, horse_names)也是列表,它们仍然可用。例如,输入 cat_names,你会得到 ['Walter', 'Ra'] 作为返回值。
前面已经探索了列表,下面我们继续探索一个稍微复杂一点的数据容器,叫作字典。
2.2.3 字典
字典比变量或列表更加复杂。“字典”这个名字是很贴切的。将 Python 的字典看作传统意义上的字典——用来查找单词释义的工具。在 Python 的字典中,你要查找的单词叫作键(key),这些单词的释义叫作值(value)。在 Python 中,键对应一个值。
回头看动物的例子。animal_numbers 保存的是我们拥有的不同动物数量的列表,但我们不清楚哪个数字对应哪一种动物。字典是存储这种信息的好方法。
在下面的例子中,我们用动物种类作为键,每种动物的数量作为值:
animal_counts = {'cats': 2, 'dogs': 5, 'horses': 1}
如果想用键来访问一个值,可以从字典中访问键(类似在普通的字典中查单词)。为了在 Python 中实现这样的查找(比如查找我们拥有的狗狗的数量),可以输入以下代码:
animal_counts['dogs']
你应该看到的返回值是 5,因为我们在字典中('dogs': 5)设置 'dogs' 键对应的值是 5。如你所见,想要存储匹配的键值对时,字典是很有用的。根据你的需求不同,字典可以是非常强大的,所以我们进一步研究同时使用列表和字典。
对于前面动物名字的列表,很难说清楚哪个名字列表属于哪一种动物。哪个列表里面是猫咪的名字,哪个列表里面是狗狗的名字,哪个列表里面是马的名字,谁也搞不清楚。但是,我们可以用字典把动物们区分清楚:
animal_names = { 'cats': ['Walter', 'Ra'], 'dogs': ['Joker', 'Simon', 'Ellie', 'Lishka', 'Fido'], 'horses': ['Mr. Ed'] }
存储同样的值还有另一种方法,它用到了更多的变量:
cat_names = ['Walter', 'Ra'] ➊ dog_names = ['Joker', 'Simon', 'Ellie', 'Lishka', 'Fido'] horse_names = ['Mr. Ed'] animal_names = { 'cats': cat_names, ➋ 'dogs': dog_names, 'horses': horse_names }
❶ 这一行代码将变量 cat_names 定义为猫咪名字的列表(字符串列表)。
❷ 这一行代码使用变量 cat_names,传递猫咪名字的列表作为字典中键 'cats' 对应的值。
虽然过程有所不同,但两种方法得到的是相同的字典 1。随着对 Python 的深入学习,你将能够更好地判断,什么时候需要定义更多的变量,什么时候不这么做反而更好。现在你会发现,利用许多定义好的不同变量(例如 cat_names 和 dog_names)来创建新的变量(例如 animal_names),这是很容易的。
1两个字典并不完全相同,因为第二个字典中使用了可以被修改的对象。想详细了解二者的区别,请查阅附录 E。
虽然 Python 有间距和格式的规则,但你的字典格式不一定非得和我们前面的一样。但是,你的代码应该尽可能易于阅读。保证代码的可读性,你自己以及其他合作的开发者都会因为这一点而感谢你的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论