这几种数据结构的共性:
都是顺序存储
顺序访问
可迭代对象(可迭代对象可以用len方法获取其长度)
通过索引进行元素的访问
可以进行切片操作
切片不会对原有的序列做任何修改,切片的语法为:
从索引<code>start</code>开始,到索引<code>stop</code>结束,不包含<code>stop</code>,返回新的序列,不会对原有的对象做任何修改。
几个特性:
<code>start</code>超出索引范围:<code>start = 0</code>
<code>stop</code>超出索引范围:<code>stop = -1</code>
负数索引:实际上可转化为:<code>len(seq) + index</code>
当<code>start &gt;= stop</code>时,返回空列表
slice的实现:
运行结果为:
如果有了步长之后,上面的规则就会发生变化。接下来加入步长的slice实现:
切片的一些常用操作:
如果索引超出范围,将引发<code>IndexError</code>的异常。修改元素的时候,如果超出索引范围,也同样引发<code>IndexError</code>异常。
<code>index(value)</code>方法根据value找索引
<code>count(value)</code>方法统计value出现的次数
enumerate的实现:
列表批量赋值:
不建议使用以上的方式对切片赋值的操作。
解构与封装可以叫做解包与封包。
解构把集合里的元素复制给变量;
封装是用变量构建元组。
解构:按照元素顺序,把线性解构的元素依次赋值给变量。
封装的例子:
定义一个元组,可以省略小括号。
封装出来的是元组。封装没有什么难度。解构的变化多样,接下来重点看看解构。
先看一个例子:
对上面的代码进行改写,由3行代码,变成了一行代码:
对于如下的代码操作,就是解包:
上面的代码使用的是元组,列表也是可以的:
接下来看一下封包:
继续看例子:
如果对一个含有2个元素的列表进行解包:
如果对一个含有一个元素的列表进行解包:
如果对一个空列表进行解包:
针对上述例子的总结:
左边不能只有一个星号,还要有其他元素
如果左边不用星号,那么左边的元素个数要与右边的元素个数相同
左边变量数小于右边元素个数,且左边没有加星号会报错
元素按照顺序赋值给变量
变量和元素必须匹配
加星号变量,可以接收任意个数的元素
加星号的变量不能单独出现
针对上述,写一个具体的例子:
更复杂一点的例子:
下面这个例子,在Python2中不能实现:
接下来还有更好玩的,如果我们要丢弃=右边某个值,可以使用下划线来,演示如下:
如果我们只想要序列的首位两个元素,可以这样操作:
再来一发,两边结构要一样:
对上面的例子,再来稍微变化一下,不过两边的结构要一样,解构是支持多层次的。:
注意:
解包的时候,两边的结构要一致 (重要的事情说三遍)
只要两边结构一样就行
python的一个惯例,使用单个下划线表示丢弃该变量。单个下划线也是Python合法的标识符,但是如果不是要丢弃一个变量,通常不要用单个下划线表示一个有意义的变量。
非常复杂的数据结构,多层嵌套的线性结构的时候,可以用解构快速提取其中的值。
版权声明:原创作品,如需转载,请注明出处。否则将追究法律责任
本文转自 bigstone2012 51CTO博客,原文链接:http://blog.51cto.com/lavenliu/2044036