一.序列(sequence):序列中每个元素分配一个序号--元素的位置,也称为索引.第一个索引是0,以此类推.Python有六种内建的序列(列表,元组,字符串,Unicode字符串,buffer對象與xrange對象)
列表與元組的主要區別在於,列表可以修改而元組則不能。也就是說如果要根據要求來添加元素,那麼列表會更好用,而序列不能修改的時候,元組全更合適。序列也可以包含其他的序列。
>>> edward = ['Edward Gumbe',42] >>> john = ['John Smith',50] >>> database = [edward,john] >>> database [['Edward Gumbe', 42], ['John Smith', 50]]
所有序列類型都可進行某些特定的操作:索引(indexing),分片(sliceing),加(adding),減(multiplying)以及檢查某個元素是否屬於序列的成員,此外還有計算序列的長度,找出最大元素和最小元素的内建函数.
1.1索引:所有的索引都是从0开始递增,可以通过编号分别访问,使用负数索引时,Python会从右边,也就是从最后1个元素开始计数,最后一个元素的编号是-1.
>>> greeting = "Hello" >>> greeting[0] 'H' >>> greeting[3] 'l' >>> greeting[-1] 'o'
字符串字面值能够直接使用索引而不需要一个变量引用它们.
>>> 'Hello'[1] 'e' >>> fourth = raw_input("Year:")[3] Year:2014 >>> fourth '4'
1.2 分片 索引访问单个元素,而分片操作访问一定范围内的元素,分片通过冒号相隔的2个索引来实现
>>> tag = '<a href="http://www.python.org">Python web site</a>' >>> tag[9:30] 'http://www.python.org' >>> tag[32:-4] 'Python web site'
分片操作对于提取序列的一部分是很有用的,而编号在这里十分重要,第一个索引是需要提取的第一个元素的编号,而最后一个索引则是分片之后剩下部分的第1个元素的编号.
>>> numbers = [1,2,3,4,5,6,7,8,9,10] >>> numbers[3:6] [4, 5, 6] >>> numbers[0:1] [1]
总之:分片操作的实现需要提供两个索引边界,第1个索引是包含在分片内,而第2个则不包含在分片内.
>>> numbers[7:10] [8, 9, 10]
索引10指向的是第11个元素--这个元素并不存在,却是最后一个元素之后.
>>> numbers[-3:-1] [8, 9] >>> numbers[-3:0] [] >>> numbers[-3:] [8, 9, 10] >>> numbers[:3] [1, 2, 3] >>> numbers[:] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
只要分片中最左边的索引比右边的晚出现在序列中,结果就是一个空的序列,所以如果分片所得部分包括序列的结尾的元素,那么只需置空最后一个元素即可.同样适用于序列开始的元素
在分片的时候,分片的开始与结束需要进行指定,而另一个参数--步长(step length)--通常是隐匿设置,在普通中步长是1,
>>> numbers[::1] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> numbers[::2] [1, 3, 5, 7, 9] >>> numbers[::-2] [10, 8, 6, 4, 2]
当然步长不能为0,那样不会向下执行,但是步长可以是负数,即从左到左提取元素.
>>> numbers[1:10:-2] [] >>> numbers[10:1:-2] [10, 8, 6, 4]
总结:开始点的元素包括中结果之中,而结束点的元素不在分片之内.当使用一个负数作为步长时,必须让开始大于结束点.对于一个正数步长,Python会从序列的头部开始向右提取元素,直到最后一个元素,而对于负数步长,则是从序列的结尾部开始向左提到元素,直到第一个元素.
1.3 序列相加
>>> [1,2,3]+[4,5,6] [1, 2, 3, 4, 5, 6] >>> 'Hello,'+'world!' 'Hello,world!' >>> 'Hello,'+[1,2,3] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot concatenate 'str' and 'list' objects
列表与字符串是无法连接在一起的,尽管他们都是序列,简单来说:2种相同类型的序列才能相加.
1,4相乘 用数字乘以一个序列会生成一个新的序列,在新的序列中,原来的序列被重复x次
>>> 'python'*5 'pythonpythonpythonpythonpython' >>> [42]*10 [42, 42, 42, 42, 42, 42, 42, 42, 42, 42]
空列表,None是Python内建值,它的含意是"这里什么都没有",如果想被始化一个长度为10的列表
>>> sequence = [None]*10 >>> sequence [None, None, None, None, None, None, None, None, None, None]
1.5成员资格
检查一个值是否在序列中,可以使用in运算符.这个运算符检查某个条件是否为真,然后返回相应的值:条件为真返回true,条件为假返回false.
>>> permission = 'rw' >>> 'w' in permission True >>> 'x' in permission False
1.6 长度,最小值与最大值
内建函数len,min与max非常有用.len返回序列中元素的数量,min与max返回序列中最大值与最小值.
>>> numbers = [12,42,52,13,99,85,25,75,100] >>> len(numbers) 9 >>> min(numbers) 12 >>> max(numbers) 100
二,列表
2.1 list函数 字符串不能像列表一样被修改,所以有时根据字符串创建列表会很有用.list适用与所有的序列,而不只是字符串
>>> list('Hello') ['H', 'e', 'l', 'l', 'o']
改变列表:元素赋值与删除元素
>>> x = [1,1,1] >>> x[1] = 3 >>> x [1, 3, 1] >>> del x[2] >>> x [1, 3]
分片赋值:分片是一个非常强大的特性,而分片赋值则更加显示它的强大.
>>> name = list('Perl') >>> name ['P', 'e', 'r', 'l'] >>> name[2:]=list('ar') >>> name ['P', 'e', 'a', 'r'] >>> name[3:]=list('john') >>> name ['P', 'e', 'a', 'j', 'o', 'h', 'n']
分片赋值时,可以使用与原序列不等长的序列将分片替换,也可以在不需要替换任何原有元素的情况下插入新的元素
>>> numbers=[1,5] >>> numbers [1, 5] >>> numbers[1:1]=[2,3,4] >>> numbers [1, 2, 3, 4, 5] >>> numbers[1:4]=[] >>> numbers [1, 5]
列表的方法:方法是一个与某些对象紧密联系的函数,对象可能是列表,数字,也可能是字符串或者其它类型的对象.
append方法不是简单返回一个修改过的新列表,而是直接修改原来的列表.
>>> lst=[1,2,3] >>> lst [1, 2, 3] >>> lst.append(4) >>> lst [1, 2, 3, 4]
count方法统计某个元素在列表中出现的次数.
>>> st = ['bo','be','or','not','to','be','to'] >>> st.count('bo') 1 >>> st.count('to') 2
extend方法是在列表末尾一次性追加另一个序列中的多个值.
>>> a = [1,2,4] >>> b = [4,5,6] >>> a.extend(b) >>> a [1, 2, 4, 4, 5, 6] 看起来有点像连接操作,区别中于,extend方法修改了扩展的序列,而原始连接操作不然,它会返回一个全新的列表
>>> a = [1,2,4] >>> b = [4,5,6] >>> a+b [1, 2, 4, 4, 5, 6] >>> a [1, 2, 4]
index方法用于从列表中找出某个值在第一个匹配项的索引位置
>>> knights = ['we','are','the','knights','who','say','ni'] >>> knights.index('who') 4 >>> knights.index('ke') Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: 'ke' is not in list
insert方法用于将对象插入到列表中
>>> numbers = [1,2,4,5,6,7] >>> numbers.insert(3,'four') >>> numbers [1, 2, 4, 'four', 5, 6, 7]
pop方法会移除列表中一个元素(默认是最后一个),并且返回该元素的值
>>> x = [1,2,3] >>> x.pop() 3 >>> x [1, 2] >>> x.pop(0) 1 >>> x [2]
remove方法用于移除列表中某个值的第一个匹配项
>>> x = ['to','be','or','not','to','be'] >>> x ['to', 'be', 'or', 'not', 'to', 'be'] >>> x.remove('be') >>> x ['to', 'or', 'not', 'to', 'be'] >>> x.remove('bee') Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: list.remove(x): x not in list
erverse方法将列表中的元素反向存放
>>> x = [1,2,3,7,1] >>> x.reverse() >>> x [1, 7, 3, 2, 1]
sort方法用于在原位置对列表进行排序,意味着改变原来的列表,从而让其中的元素能按一定顺序排列,而不是简单的返回一个已排序的列表副本
>>> x [1, 7, 3, 2, 1] >>> x.sort() >>> x [1, 1, 2, 3, 7]
如果即要保留原来的列表,又要获取新的排序后的列表则用sorted
>>> x [1, 7, 3, 2, 1] >>> x.sort() >>> x [1, 1, 2, 3, 7]
元组 元组与列表一样,也是一种序列,唯一不同的是元组不能修改,创建元组有逗号,一般需要小括号.
>>> 1,2,3 (1, 2, 3) >>> (1,2,3) (1, 2, 3) >>> () () >>> 2, (2,) >>> 3*(40+2) 126 >>> 3*(40+2,) (42, 42, 42)
tuple函数:以一个列表为参数,将序列转换成元组.元组的分片还是元组
>>> tuple([1,2,4,23]) (1, 2, 4, 23) >>> x = 1,2,3 >>> x[1] 2 >>> x[0:2] (1, 2)