数据结构
数据结构基本上是这样的 - 它们是能够将一些数据组合在一起的一种结构。换句话说,它们被用来存储相关数据的集合。
Python 中有四种内置的数据结构 - list, tuple, dictionary and set。
List
list 是一种保存有序项集合的数据结构。 也就是说,你可以在列表中存储一系列项。这很容易想象,如果你有一系列的东西要买就会思考出一个购物清单,可能在你的购物清单中每一项都有一个单独的行,而在 Python 中你使用逗号隔开它们。
项目列表应该使用方括号扩起来,以便 Python 能够理解您正在定义一个列表。一旦创建了列表,你就可以在列表中增加,删除或者搜索列表中的项 。 正因为我们可以增加和删除项,所以我们称列表是一种 可变 数据类型,也就是说这个类型可以被改变。
对象和类的简介
列表是使用对象和类的一个例子。当我们使用一个变量 i 并为它赋值时,例如将整数 5 赋值给它。我们可以将其看作是创建一个对象 i (即,实例)的过程,它对应的 类 (即,类型)为 int 。实际上,你可以通过查看 help(int) 来更好地理解这一点。
一个类也可以有 方法 ,即只能被该类调用的函数。只有当你拥有该类的对象时,才能使用这些函数。例如, Python 为 列表 类提供了一个 append 函数,它允许你在列表的末尾添加一个元素(或者项)。例如, mylist.append('an item') 会把那个字符串添加到列表 mylist 中。注意,我们是用点(.)来访问对象中的方法。
一个类也可以有 字段 ,它们只是为该类定义的变量。只有当你拥有该类的对象时,才可以使用这些变量 / 名称。字段也可以用点访问,例如, mylist.field 。
示例(保存为 ds_using_list.py):
# 这是我的购物清单shoplist = ['apple', 'mango', 'carrot', 'banana']print('I have', len(shoplist), 'items to purchase.')print('These items are:', end=' ')for item in shoplist: print(item, end=' ')print('I also have to buy rice.')shoplist.append('rice')print('My shopping list is now', shoplist)print('I will sort my list now')shoplist.sort()print('Sorted shopping list is', shoplist)print('The first item I will buy is', shoplist[0])olditem = shoplist[0]del shoplist[0]print('I bought the', olditem)print('My shopping list is now', shoplist)
输出
$ python ds_using_list.pyI have 4 items to purchase.These items are: apple mango carrot bananaI also have to buy rice.My shopping list is now ['apple', 'mango', 'carrot', 'banana', 'rice']I will sort my list nowSorted shopping list is ['apple', 'banana', 'carrot', 'mango', 'rice']The first item I will buy is appleI bought the appleMy shopping list is now ['banana', 'carrot', 'mango', 'rice']
工作原理
变量 shoplist 是某个购物者的购物清单。在 shoplist 中,我们只存储要购买的商品名称所对应的字符串,但是,你也可以向列表中添加 任何类型的对象 ,包括数字或者其它列表。
我们还使用 for..in 循环来遍历列表中的项(元素)。到目前为止,你必须要意识到,列表其实也是一个序列。关于序列的特性,我们将会在 后面的小节 中进行讨论。
注意,我们在调用 print 函数时,使用了 end 参数,这表明我们希望以空格作为输出的结尾,而不是以通常的换行符作为输出的结尾。
接下来,如前面所述,我们使用列表对象中的 append 方法向列表中添加一个项(元素)。然后,我们直接将列表传递给 print 函数,来检查一下项(元素)是否已经添加到列表中。
然后,我们使用列表中的 sort 方法对列表进行排序。重要的是我们要了解,该方法影响的是列表本身,并且不会返回修改后的列表 —— 这和字符串不一样。这就是我们所说的,列表是 可变的 而字符串是 不可变的 。
接下来,我们在市场上买完一件商品后,我们想要把它从购物清单中删除。我们可以用 del 语句来实现这一点。在这里,我们指哪删哪,即我们指出想要删除列表中的哪一项(元素), del 语句就能删除哪一项。在例程中我们想要删除列表中的第一项(元素),因此我们使用 del shoplist[0] (记住, Python 是从 0 开始计数的)。
元组
元组用于将多个对象组合在一起。可以将它们近似看作列表,但是没有列表类提供的许多功能。元组的一个重要特征是,它们和字符串一样是 不可变的 ,即你不能修改元组。
元组是由一些特殊的项定义的,这些项在一对可选的圆括号中,由逗号隔开。
元组通常用于这种情况,也就是语句或者用户自定义的函数可以安全地认为值的集合(即,值的元组)不会改变的情况。
示例(保存为 ds_using_tuple.py):
# 尽管圆括号是可选的,# 我还是建议使用圆括号,# 来表示元组的开始和结束。# 因为显式总比隐式要好。zoo = ('python', 'elephant', 'penguin')print('Number of animals in the zoo is', len(zoo))new_zoo = 'monkey', 'camel', zoo # parentheses not required but are a good ideaprint('Number of cages in the new zoo is', len(new_zoo))print('All animals in new zoo are', new_zoo)print('Animals brought from old zoo are', new_zoo[2])print('Last animal brought from old zoo is', new_zoo[2][2])print('Number of animals in the new zoo is', len(new_zoo)-1+len(new_zoo[2]))
输出:
$ python ds_using_tuple.pyNumber of animals in the zoo is 3Number of cages in the new zoo is 3All animals in new zoo are ('monkey', 'camel', ('python', 'elephant', 'penguin'))Animals brought from old zoo are ('python', 'elephant', 'penguin')Last animal brought from old zoo is penguinNumber of animals in the new zoo is 5
工作原理
变量 zoo 代表一个元组。我们可以看到 len 函数可以用来获得元组的长度。这也表明元组是一个 序列 。
现在,我们把这些动物转移到一个新的动物园,因为旧的动物园要关门了。因此,元组 new_zoo 包含一些之前就存在的动物以及从旧的动物园带过来的动物。从现实的角度看,要注意,元组中的元组依然是一个元组,不会丢失它的特性。
我们可以通过在一堆方括号中指定项的位置来访问元组中的项(元素),就像我们访问列表中的项一样。我们称之为 索引 操作符。我们通过 new_zoo[2] 来访问 new_zoo 中的第三个项,我们通过 new_zoo[2][2] 来访问 new_zoo 元组中第三个项中的第三个项。