返回介绍

2.2 数据容器

发布于 2024-01-27 21:43:11 字数 6527 浏览 0 评论 0 收藏 0

本节会讲到数据容器,里面装有许多数据点(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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文