9. 数据结构

来源:互联网 发布:易语言辅助源码 编辑:程序博客网 时间:2024/06/05 09:39
    在做其他的笔记之前还是决定先把数据结构这一章的笔记做了。

    所谓数据结构其实就是用来存储数据的一种结构方式。其中最常用就是字符串。之前就讨论过字符串,字符串就是一连串字符所组成的一个序列。在python中的序列主要有两个特点,一个是索引操作,也就是下标操作。另一个是切片操作。

    下标操作就是取整个序列中某一个位置的操作,假如这个字符串长为len,那么这个字符串的下标是从0开始一直到len - 1。想知道怎么进行下标操作还是来看例子吧:

#!/usr/bin/pythons = 'this is a string'print 'index 0 is', s[0] # tprint 'index 1 is', s[1] # hprint 'index -1 is', s[-1] # gprint 'index -4 is', s[-4] # r

显示:

index 0 is t
index 1 is h
index -1 is g
index -4 is r

    怎么还有负数?负数是什么?吼吼,python还是很犀利的,它就是那么犀利,支持负数,在一个有N个元素的序列中是这样的:

    自己用画图做的,不小心做大了,不过就是这么回事了。下标还是很简单的,那么切片呢?神马是切片啊?切片其实就是通过下标操作来截取一段该序列的子序列,因为是子序列,当然是一头一尾啦,所以只要通过一头一尾两个下标就行了,在两个下标中使用分号分开。接着看例子吧:

#!/usr/bin/pythons = 'this is a string'print 'sub 1:', s[3:6] # s iprint 'sub 2:', s[-8:-1] # a strinprint 'sub 3:', s[2:-2] # is is a striprint 'sub 4:', s[:4] # thisprint 'sub 5:', s[-2:] # ngprint 'sub 6:', s[:] # this is a string
显示:

sub 1: s i
sub 2: a strin
sub 3: is is a stri
sub 4: this
sub 5: ng
sub 6: this is a string

    这是不是很犀利啊,在python中的操作中都是前闭后开的区间,这一点很重要。如果前面的下标没有给出则默认为0,如果后面的下标没给出则默认为最后。根据前面的索引操作其实切片操作是很后理解的。

    好了,改换台了,我们将目光集中到另外一个python中超级常用的数据结构——列表,列表时使用方括号包含、用逗号分隔数据的数据结构,与其他语言的数组十分相似,最大的不同在于python中的列表可以包含不同的数据类型,包括他们自己,而其他的大多数语言的数组只能由同类型组成。由于列表也是序列,因此列表也支持索引和切片操作,不过每个下标元素不在像字符串中一样是字符(严格来说并不是字符,而是长度为1的字符串),而是数据本身,还是看例子吧,我看书就喜欢看例子:

#!/usr/bin/pythonls = ['this', 'is', 'a', 'list']for i in range(0, len(ls)):    print ls[i]for i in ls:    print i
显示:

this
is
a
list
this
is
a
list

切片操作我并没有演示,我想有了下标操作切片操作不是问题。我们还看到了另一种遍历的方式,i会不停的迭代ls中的元素。

    如果在列表中有你想删除的元素请使用del语句,例如:del ls[0]。对于列表还有两个操作很重要,一个是append函数,另一个是extend函数。我们先看看append函数,这个函数是向列表后面添加一个元素,这个元素就是append函数的参数;extend函数则是对列表的扩充,将元素加在列表的后面。就这样看似乎没有什么区别啊?还是看例子吧:

#!/usr/bin/pythonls = ['this is a list']another_ls = ['another list']print lsls.extend(another_ls)
print ls #['this is a list', 'another list']del ls[1]
ls.append(another_ls)
print ls #['this is a list',['another list']]

显示:

['this is a list']
['this is a list', 'another list']
['this is a list', ['another list']]

    再换个频道,该看看元组了,元组就是把列表的中括号换成小括号,值得注意的是,定义单个元素的元组的时候,必须要带上逗号,不然的话你无法判断是否是元组,有可能当作一个变量或常量加上了括号而已。而且元组也是不可变的,也就是说元组中的数据是只读的,而且,元组是完全没有内建的函数的,例如append。元组使用比较多的应该就是用于输出吧,还记得之前的sayHi函数吗?那个输出看的是那么的不尽如人意,那么我们来改善一下吧:

#!/usr/bin/pythondef sayHi(name = ''):    print 'Hello %s!' % namesayHi('L')

显示:

Hello L!

是不是觉得看的爽多了啊。再来看一个更完整的例子吧:

#!/usr/bin/pythonage = 21name = 'L'print '%s is %d years old' % (name, age)

    其实也很简单,用了跟字符串中的转义符类似的方法,用百分号加上一个字母类表示输出的类型,然后在后面的元组中寻找对应的变量或常量的值来替代,在输出的字符串和元组中间同样使用百分号将其分隔开。

    再换个台,该讲字典了。字典是一个比较特殊的数据结构,不想之前介绍的那些数据结构,每个元素都是独立出现的,在字典中,元素是成对出现的。没错就是成对,一个键值对。这可能也是为什么要称作字典的原因吧,因为我们要通过给定的关键字——键——来查找对应的数据——值,因此字典这种数据结构有时也会替代类似C语言中的switch语句。那么看看怎么定义吧:d = {key1 : value1, key2 : value2...},最后是我最喜欢的部分——例子:

#!/usr/bin/python# 'ab' is short for 'a'ddress'b'ookab = {       'Swaroop'   : 'swaroopch@byteofpython.info',             'Larry'     : 'larry@wall.org',             'Matsumoto' : 'matz@ruby-lang.org',             'Spammer'   : 'spammer@hotmail.com'     }print "Swaroop's address is %s" % ab['Swaroop']# Adding a key/value pairab['Guido'] = 'guido@python.org'# Deleting a key/value pairdel ab['Spammer']print '\nThere are %d contacts in the address-book\n' % len(ab)for name, address in ab.items():    print 'Contact %s at %s' % (name, address)if 'Guido' in ab: # OR ab.has_key('Guido')    print "\nGuido's address is %s" % ab['Guido'] 
显示:

Swaroop's address is swaroopch@byteofpython.info

There are 4 contacts in the address-book

Contact Swaroop at swaroopch@byteofpython.info
Contact Matsumoto at matz@ruby-lang.org
Contact Larry at larry@wall.org
Contact Guido at guido@python.org

Guido's address is guido@python.org

我们可以使用in操作符来检验一个键/值对是否存在,或者使用dict类的has_key方法。具体帮助使用help函数吧。
    最后在来看看引用吧,当你创建一个对象并给它赋一个变量的时候,这个变量仅仅引用那个对象,而不是表示这个对象本身!也就是说,变量名指向你计算机中存储那个对象的内存。这被称作名称到对象的绑定。当你赋值就会重新绑定,这也是为什么在python通过变量之间的传值无法实现像C语言中的swap函数。

原创粉丝点击