本章将引入一个新的概念:数据结构。
数据结构是通过某种方式阻止在一起的数据元素的集合,这些数据元素可以是数字或者字符,设置可以是其他数据结构。
Python中,最基本的数据结构是序列(Sequence),序列中的每个元素被分配一个序列号--即元素的位置,也称为索引。第一个索引是0,第二个则是1,以此类推,倒数第一个是-1。
Python中包含6中内建的序列:列表、元组、字符串、Unicode字符串、buffer对象、xrange对象。本章节重点内容是:列表和元组。
列表和元组的主要区别在于:列表可以修改, 元组则不能。
下面开始举例:
>>> example = ['1','b',3] >>> example2 = ['test'] >>> test = [example,example2] >>> test [['1', 'b', 3], ['test']]
上例是对列表进行赋值操作,列表是用[]来括起来的
常用的操作包括:索引(indexing)、分片(sliceing)、加(adding)、乘(multiplying)以及检查某个元素是否属于序列的成员。除此之外,Python还有计算序列长度,找出最大元素和最小元素的内建函数。
>>> test = 'hello' >>> test[0] 'h'
下面再例举一个代码实例:
#define months months = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ] #define day's endings endings = ['st','nd','rd'] + 17*['th']\ + ['st','nd','rd'] + 7*['th']\ + ['st'] year = raw_input('Year:') month = raw_input('Month(1-12):') day = raw_input('Day(1-31):') month_number = int(month) day_number = int(day) month_name = months[month_number - 1] day_name = day + endings[day_number - 1] print month_name +' '+ day_name + ',' + year
输出结果:
Year:2013 Month(1-12):12 Day(1-31):26 Dec 26th,2013
>>> a = [1,2,3,4,5,6,7,8,9,10] >>> a[1:5] [2, 3, 4, 5]
结合上例,根据上节索引内容可知,分片操作的实现需要提供至少两个索引作为边界,第一个索引的元素是包含在元素分片内的,而第二个则不包含在分片内。
下面再例举几个实例:>>> a[-3:-1] [8, 9] >>> a[-3:] [8, 9, 10] >>> a[:] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
更大的步长
>>> a = [1,2,3,4,5,6,7,8,9,10] >>> a[1:9:2] [2, 4, 6, 8] >>> a[::2] [1, 3, 5, 7, 9] >>> a[::-2] [10, 8, 6, 4, 2]
进行分片的时候,分片的开始和结束点需要进行指定,而另一个参数 - 步长(step length),通常都是隐式设置的。在普通的分片中,默认步长是1,分片操作就是按照这个步长逐步遍历序列的元素,然后返回开始喝结束点之间的所有元素。
如果步长是负数,那么就会从右往左提取元素。
>>> a = [1,2] >>> b = [3,4] >>> a + b [1, 2, 3, 4]
>>> 'Python'*5 'PythonPythonPythonPythonPython' >>> [5]*5 [5, 5, 5, 5, 5]
下面举一个复杂一点的乘法示例:用程序在屏幕上打印一个由字符组成的“盒子”,而这个“盒子”在屏幕上居中,而且能根据用户输入的句子自动调整大小:
sentence = raw_input('please input the sentence:') screen_width = 80 text_width = len(sentence) box_width = text_width +6 left_margin = (screen_width - box_width)//2 print print ' '*left_margin + '+' + '-'*(box_width-2) + '+' print ' '*left_margin + '|' + ' '*(box_width-2) + '|' print ' '*left_margin + '|' + sentence + ' '*(box_width-2-text_width) + '|' print ' '*left_margin + '|' + ' '*(box_width-2) + '|' print ' '*left_margin + '+' + '-'*(box_width-2) + '+' print
输出结果如下:
please input the sentence:Python
+----------+
| |
|Python |
| |
+----------+
None、空列表和初始化
空列表可以简单地通过两个中括号进行表示([])。
None是一个Python的内建值,它的确切含义是“这里什么也没有”,因此,如果想初始化一个长度为10的列表,可以按照下面的例子:
>>> sequence = [None]*10
>>> sequence
[None, None, None, None, None, None, None, None, None, None]
注意None的首字母大写
>>> p = [2,3] >>> 2 in p True >>> x = 'Python' >>> 'm' in x False
>>> python = [1,2,3,4,5] >>> len(python) 5 >>> max(python) 5 >>> min(python) 1
上面的例子已经用了很多次列表,下面将会讨论列表不同于元素和字符串的地方:列表时可变的(mutable)——可以改变列表的内容,并且列表有很多有用的、专门的方法。
>>> list('Python') ['P', 'y', 't', 'h', 'o', 'n']
list函数适用于所有类型的序列,而不只是字符串
>>> a = [1,2,3] >>> a[1] = 4 >>> a [1, 4, 3]
②删除元素
>>> test = ['a','b','c','d'] >>> del test[2] >>> test ['a', 'b', 'd']
③分片赋值
>>> name = list('python') >>> name[1:] = 'wm' >>> name ['p', 'w', 'm'] >>> names = list('english') >>> names[1:3] = 'tt' >>> names ['e', 't', 't', 'l', 'i', 's', 'h']
分片赋值语句可以在不需要替换任何原有元素的情况下插入新的元素:
>>> a = ['1','2','3'] >>> a[1:1] = 'test' >>> a ['1', 't', 'e', 's', 't', '2', '3']
>>> a = [1,2,3] >>> a.append(4) >>> a [1, 2, 3, 4]
② count
>>> test = [1,'a','a',[1,2],[1,[1,2]]] >>> test.count(1) 1 >>> test.count('a') 2 >>> test.count([1,2]) 1
③ extend
>>> a = [1,2,3] >>> b = [4,5,6] >>> a.extend(b) >>> a [1, 2, 3, 4, 5, 6]
和连接操作,赋值操作对比
>>> a = [1,2,3] >>> b = [4,5,6] >>> a+b [1, 2, 3, 4, 5, 6] >>> a [1, 2, 3] >>> a = a + b #赋值操作 >>> a [1, 2, 3, 4, 5, 6]
④ index
>>> a = ['a','b','c','d'] >>> a.index('c') 2
当索引中寻找的匹配项找不到,系统就会报错
>>> a = [1,2,3,4,5] >>> a.insert(3,'Python') >>> a [1, 2, 3, 'Python', 4, 5]
⑥ pop
>>> a = [1,2,3] >>> a.pop() 3 >>> a [1, 2]
⑦ remove
remove方法用于移除列表中某个值的第一个匹配项>>> a = [1,2,3,1] >>> a.remove(1) >>> a [2, 3, 1]
⑧ reverse
>>> a = ['a','b','c'] >>> a.reverse() >>> a ['c', 'b', 'a']
⑨ sort
>>> x = [1,6,4,3,9,2] >>> x.sort() >>> x [1, 2, 3, 4, 6, 9]
4. 元组
元组与列表一样,也是一种序列。唯一的不同是元组不能修改。创建元组的语法很简单:
>>> 1,2,3 (1, 2, 3) >>> (2,3,4) (2, 3, 4) >>> () ()
①tuple函数
tuple函数的功能与list函数基本是一样的:以一个序列作为参数并把它转换为元组。如果参数是元组,那么该参数就会被原样返回:
>>> tuple([1,2,3]) (1, 2, 3) >>> tuple('abc') ('a', 'b', 'c') >>> tuple((1,2)) (1, 2)
②基本元组操作和序列类似
③元组的意义
(加快自己的节奏,最近又贪玩了,呵呵下自己)