相关知识的介绍
1.1 序列的类型
序列是Python最基本的数据结构。
python有6种内建序列:列表、元组、字符串、unicode字符串、buffer对象和xrange对象。
序列可以插入、删除、替换并且所有序列都支持迭代。
1.2 索引
索引可以理解为序列里每一个元素的标号,从0开始,以-1结束,
也就是说第一个元素的索引是0,而最后一个元素的索引是-1,
如c='2011',c[0]=2,c[1]=0,c[2]=1,c[-1]=1。
1.3 分片
使用分片,访问一定范围内的元素。分片通过冒号相隔的两个索引实现。
如:c='Python',当要输出tho时可以编写如:print c[2:5],即输出从索引为二到索引为五的所有元素
将c全部输出,可以编写为:print c[0:len(c)]或者print c[:]
输出最后三位可以编写为:print c[:-3]
输出前三位可以编写为:print c[:3]或print c[-3:]
但print c[0:-1]或者print c[0:-2]等无法输出全部字符。
因为[前索引:后索引)输出从前索引开始到后索引之前结束,不包括后索引本身所指的元素。
1.4 步长
当我们要跳跃式的输出元素时,我们可以使用步长。
步长默认值为1,可以为负数(步长为负数时将倒序输出),但不能为0!
如果更改步长则在两个索引后用冒号分隔:如[前索引:后索引:步长]
如:mynumber = [1,2,3,4,5,6,7,8,9,10]
mynumber[::4] =》 [1,5,9] #步长为4,隔3个元素输出第四个元素
mynumber[8:3:-1] =》 [9,8,7,6,5] #从第8个元素倒序到第4个元素
mynumber[0:10:-2] =》 [] #0比10在序列中更早出现,所以无输出
mynumber[::-2] =》 [10,8,6,4,2] #倒序输出
mynumber[5::-2] =》[6,4,2]
mynumber[:5:-2] =》[10,8]1.5 相加
同类型的可以相加,不同类型的不可以相加
1.6 相乘
1.7 None、空列表和初始化
None是python的内建值,表示为空(类似于c的null)
如果想建立一个长度一定的空列表可以:[None]*n1.8 成员资格
判断一个值是否在序列中,使用in运算符,如果存在返回True,否则返回False
列表
2.1 列表的创建
list(‘Hello’);//list函数用于创建一个列表,可以由其它类型序列创建,如例子中由字符串创建列表。
或:shoplist=['apple','banana','carrot','pear','grape']
2.2 列表元素赋值
用索引可以改变该索引所在的列表元素的值。
如:numberlist[2] = 100
2.3 列表元素删除
使用del操作符可以删除列表中某个索引的元素。
当然也可以分片删除,如del numberlist[2:3]或者numberlist[2:3] = []
2.4 分片赋值
numberlist = list('12345678');
numberlist[1:4] = []; =》['1','5','6','7','8']//替换空元素,实现删除
numberlist[1:1] = list('234'); =》['1','2','3','4','5','6','7','8']//使用相同的索引位置,可以在该位置实现插入
numberlist[1:] = list('abc'); =》['1','a','b','c']//从某个索引位置开始替换到结尾2.5 绑定
当我在用替换空元素来删除元素时,遇到了一个问题:
为什么事先将numberlist的值用 = 赋给olditem,在修改了numberlist后,olditem的值也一起被修改了呢?
首先,我们要清楚的是:
当我们创建一个对象并给它赋一个变量的时候,这个变量仅仅参考那个对象,
而不是表示这个对象本身!也就是说,变量名指向你计算机中存储那个对象的内存。
这被称作名称到对象的绑定。
我们可以试着证明。
证明前,我们得了解一个函数id(),函数id()的解释如下:
那我们可以看看无论是olditem还是numberlist所指向的内存地址是不是同一个。
如上图所示,olditem及numberlist指向的内存地址是同一个,
这也就不难解释为什么修改了numberlist的同时olditem也被修改了。
那我们如何将numberlist的值赋给olditem才能保证他们所指的不是同一个内存单元地址或者说
当我们该别numberlist的值时olditem的值保持不变呢?
答案就是:得使用切片操作符来建立序列的拷贝!
上图是不是很好的证明了列表的赋值语句不创建拷贝。必须使用切片操作符来才能建立序列的拷贝?
2.6 列表方法
python中方法的概念:方法是与对象有紧密联系的函数。
方法的调用方式:对象.方法(参数)
列表的方法:(1)append用于列表尾追加元素。append方法直接修改原列表而不是返回一个新列表。
(2)count方法用于统计某个元素出现测次数。
(3)extend方法用于在列表尾追加另一个列表(扩展)。list1.extend(list2),修改list1,list2不变。
extend看起来像连接(+)操作,但是连接只会生成新的列表副本,而不会改变原有两个列表。
用连接实现扩展(extend):a= a+b,虽然可以实现但是没有extend方法效率高。
用分片替换实现扩展(extend):a[len(a):] = b;可以实现但是可读性不好。
(4)index方法用于找出第一个与给定值匹配的元素的索引位置。如果没有该值则异常。
(5)insert方法用于向列表中插入对象。对象.insert(插入位置,插入值);也可以用分片赋值实现插入。
(6)pop方法用于删除列表中某一元素。默认删除最后一个元素。该方法返回被删除的元素的值。
pop是唯一一个既能修改列表又返回元素值的列表方法。
默认的append和pop方法结合使用可以实现栈的操作(LIFO)
使用insert(0,...)和pop方法可以实现队列的操作(FIFO)
(7)remove用于移除列表中的某个值的第一个匹配项。remove是一个没有返回值的原位置改变方法,
它修改列表但是没有返回值。
(8)reverse方法将列表中的方法反向存储。
(9)sort方法用于在原位置对列表排序,原位置意味着改变列表而不是返回列表副本。(升序排列)
注意sort没有返回值,如果当遇到想对某列表进行排序,但是又不想改变原列表的情况下,则需要
如下操作:
y = x[:];//将列表x复制给y 注意如果只简单的用y = x,实际上y和x还是指向的同一个对象!
y.sort();
sorted函数可以生成一个列表的副本,sorted是函数不是方法,它可以用于任何序列,但返回值都为列表。
高级排序:
sort方法参数:1.可以指定排序比较函数,lst.sort(cmp);
2.可以给每个元素创建键,按照键排序,lst.sort(key = len);
3.可以指定是否反向排序,lst.sort(reverse = True);元组
3.1 元组的基本介绍
元组可以看作是元素值不能改变的列表。因为元素值 不能改变,所以元组没有方法。
即使元组只有一个值也要用‘,’分开!
42 不是元组,(42)也不是元组,(42,)才是元组。
3*(40+2) =》126
3*(40+2,) =》(42,42,42)
3.2 tuple函数
上面说的是元组没有方法,不是说元组没有函数!
tuple函数将列表转换为元组.
3.3 元组不可替代的原因:
(1)元组可以在映射中当作键使用,但列表不可以
(2)元组作为很多内建函数和方法的返回值存在