Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3008173
  • 博文数量: 167
  • 博客积分: 613
  • 博客等级: 中士
  • 技术积分: 5473
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-13 21:35
个人简介

人, 既无虎狼之爪牙,亦无狮象之力量,却能擒狼缚虎,驯狮猎象,无他,唯智慧耳。

文章分类
文章存档

2015年(19)

2014年(70)

2013年(54)

2012年(14)

2011年(10)

分类: Python/Ruby

2014-06-09 14:24:07

    在简单了解了Python的基本语法之后,今天来学习Python的数据结构——序列,类似于C中的数组,元素按顺序组成一个集合,每个元素都有一个标号作为坐标,仍旧从0开始计数,-1表示最后一个元素,从后向前计数。

一、序列的基本操作
   序列其实分为两类:可以修改的称为列表(List),不能修改的称为元祖(Tuple),字符串也是一种特殊的元祖。这节主要介绍序列的通用操作,由于不涉及对于序列对象的修改,因此可以适用于列表和元祖。老样子,先看一段基础代码:

点击(此处)折叠或打开

  1. #Sequence's Basic Operation

  2. #index
  3. x = [1, 2, 5, 7, 9, 11, 13, 21, 15, 19, 18]
  4. x[1] = 3
  5. x[-1] = x[-1] -1
  6. print 'Seq X is:\n' + str(x)

  7. #piece
  8. print "x[:] is: " + str(x[:])
  9. print "x[:3] is: " + str(x[:3])
  10. print "x[::2] is: " + str(x[::2])

  11. #add
  12. y = [10, 12, 14]
  13. print 'x+y is: ' + str(x+y)

  14. #multiply
  15. z = 'Python'
  16. print 'z * 5 is:
-1. 索引
    第4行的代码x=[]用来定义一个序列,由于这样定义的序列可以修改,因此实际的效果是定义了一个列表,列表中的每个元素使用','分隔,注意的是同一个列表中可以包含不同类型的元素,如x = [1, 2, 'Alice'],这点是比C的数组更为灵活的一点,事实上,可以直接使用序列包含一个子序列;
   第5行和第6行就像数组下标似的引用序列中的元素,可以修改赋值,这里的[-1]表示从序列的右侧最后一个元素开始向左计数;
   第7行要注意print可以打印数值或字符串或序列,但是拼接时,要求序列两侧必须为同一类型,所以这里使用了str()进行类型转换,即字符串+字符串,序列+序列;
-2. 分片
   第10-12行用于展示分片的作用,分片的意义在于提供了更加便捷的序列元素的选取方式,分片[m:n]的实际效果是左闭右开区间[m:n),即以序列的下标作为参照(左侧从0开始),包含第m个元素到底n-1个元素之间的元素都被分片选取了出来。省略m/n时即代表选取整个序列,其实省略哪个部分,即默认该部分从序列的相应端点开始选取。第三个参数作为步长,默认为1,我们这里修改为了2;
-3. 加法和乘法
   序列可以进行加法和乘法,加法意义为同类型序列的拼接,而乘法意义为同个序列的多次重复;
   整个的程序运行结果如下,其中序列y = [10, 12, 14]

   序列的len\mix\max操作用于获得序列的长度和最小值/最大值。

二、列表操作
   上个部分的所有操作在不涉及元素修改的前提下都适用于列表和元祖,接下来我们来重点介绍下列表,里面会涉及元素修改的操作。按例先看个代码:

点击(此处)折叠或打开

  1. #A Python Program for List and tuple
  2. import sys

  3. #Make a User-Passwd Login
  4. database = [
  5.             ['admin', 123456],
  6.             ['guest', 123],
  7.             ['Tom', 'tom123'],
  8.             ['Alice', 'alice123']
  9.         ]
  10. username = raw_input("User name: ")
  11. passwd = input("Password: ")
  12. if [username, passwd] in database:
  13.     print "Access granted!"
  14. else:
  15.         print "Access denyed!"
  16.         sys.exit()

  17. #After login...
  18. x = [3, 5, 2, 8, 9, 10, 56, 99]
  19. print "List X is: "
  20. print x
  21. y = x
  22. z = x[:]
  23. x.sort()
  24. print "List y is after x.sort(): "
  25. print y
  26. print "List z is after x.sort(): "
  27. print z
  28. y.reverse()
  29. print "List x after y.reverse()"
  30. print x
  1. raw_input("Please Enter for Exit...")
-1. 第2行代码首先导入了模块sys,因为我们想使用该模块下的exit()函数作为程序退出使用;
-2. 第5行定义了一个数据库,实际就是一个列表,里面含有四个子列表,每个列表都是由两个元素构成;
-3. 第11-12行用来接收用户的输入,这里有一点需要注意,即由于database中的序列资料用户名是字符串,而密码是数值,因此在用户输入时不能都是用raw_input(),那样会导致输入的数据都试字符类型,从而无法匹配数据库,这里有两种方法,一种是database中将密码字段都修改为字符串,然后都使用raw_input()函数;另一种方法是输入密码时使用input()函数;
   另一个要点是in操作,用于判断序列中是否存在该元素,返回true或false;
-4. 第13-17行代码主要用来判断用户是否合法,这里要注意Python中没有';'和{},因此代码块是依靠缩进的位置来区分的,即if应当和else位于同一个缩进列中,以表示属于并列的代码块;
-5. 第20行代码之后,主要在澄清一个问题:Python的变量其实是C++的引用,因此y = x这样的序列赋值,仅仅是为同一个序列增加了一个引用而已;如果真的想获得一个序列的副本,必须使用y = x[:]的形式才可以;
   具体的程序结果如下:


三、列表的特有方法
   接下来我们来详细介绍一下列表的特有操作方法。由于Python是面向对象的编程语言,因此列表结构具有一些内建的方法属性。自己将这些操作和方法归结为:List类型方法、增(insert\.append\.extend)、减(del\.pop\.remove)、序(.sort\.reverse)和找(index)。
-1. 定义列表
   一般来说,定义一个序列时默认就是一个列表,如x = [1, 2, 3];对于字符串,本身是元祖,可以通过list()函数转换成列表,如:

-2. 增加列表
   其实,增加列表有许多方法,比如利用基本的分片赋值操作、append()和extend()方法等,见程序:

   利用分片进行插入和删除的时候需要注意分片起始范围,比如y[2:2}表示从第三个元素处进行插入后面的列表,而删除时将指定的分片范围都复制为NULL即[]就可以了;append()方法是在原列表末尾追加一个序列或元素,改动是直接体现到原有序列上的,如果append(一个新序列),则添加的序列会以子序列的形式添加到原序列中,而extend()方法则是将新的序列的元素直接延展在原有序列的尾部,形式效果如同拼接,但是直接改变了原有序列:当利用insert()方法插入序列时,必须先指定要插入的位置以及插入的序列,即insert(location, lst):

-3. 删除序列
   删除序列的方法主要有自身的操作del以及方法pop()和remove(),其中del删除指定索引的元素,pop()删除最后一个序列元素,返回该值;remove()方法则删除从左至右匹配到的第一个元素或序列:

   使用del操作时,必须制定要删除的元素索引,比如del a[2];当使用pop()时,类似于出栈的操作,将列表的最后一个元素删除,并且返回该元素,这是列表方法中唯一一个即修改了原序列又返回了值的方法;而remove()方法,则删除从左至右匹配到的第一个元素或序列。
-4. 排序
    列表可以使用sort()方法进行序列升序排列(默认),或使用reverse()方法进行逆序排列。

四、元祖
   元祖就是不可改变的序列,除了可以使用tuple()函数进行转换之外,也可以直接使用()来定义一个元祖x = (1, 2, 3),数值元祖则必须在数值后添加',',如y = (42,),由于元祖不可改变,所以基本的操作都是访问读取。那么为什么要有元祖呢?主要有两个原因:一是元祖可以在映射和集合的成员中当作键来使用,而列表不行;二是很多内建函数和方法的返回值是元祖,因此你必须对元祖进行处理。总之,当不改变序列值的时候,元祖就可以当作操作(列表特有的append()等方法不可用)。














阅读(6471) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~