切片与迭代切片假设你已经有了一个列表或者元组,你想从中获取一些元素,你是怎么做的呢?一般情况下,首先想到的是使用索引,或者使用循环语句来匹配条件的值。首先,让我们谈谈指数价值。Python索引默认从0开始。假设给定的列表如下:>>>L=['Lei','Allen','Pony','Jacky']现在需要取出前两个元素,尝试使用索引值,即,取索引为0和1的元素:>>>L[0],L[1]('Lei','Allen')这种方法虽然看起来可行,但是如果取值范围足够大到某个程度,那么再用这个方法就不行了。然后考虑使用循环:>>>lst=[]>>>n=2>>>foriinrange(n):...lst.append(L[i])...>>>lst['Lei','Allen']这里使用了循环的方式,只需要改变n的大小就可以改变取值范围。上面的循环方式虽然可以指定一个范围来实现取值,但是比较繁琐。Python提供了切片(Slice)操作的概念,可以简化这种操作。还是上面的问题,现在用slice的方法来实现:>>>L[0:2]['Lei','Allen']上面的代码相对于循环可以说是非常简洁了。L[0:2]表示取值是从index0到index2(这里不包括index2)。取的索引为0、1,即需要取的两个元素。这里如果前面的index为0,可以省略:>>>L[:2]['Lei','Allen']也可以取从index1开始的两个元素值:>>>L[1:3]['Allen','Pony']这里又是一个索引知识,索引可以为负数。当index为-1时,表示最后一个元素。取负值时,从末尾递减1的跨度:>>>L[-1]'Jacky'>>>L[-2]'Pony'切片也支持这种索引操作,比如取后面两个元素:>>>L[-2:]['Pony','Jacky']这里取到最后,最后的部分可以省略(即索引值后面可以不写)冒号)。切片可以取前n个元素,取后n个元素,也可以取中间的值。其实前面的L[1:3]就是取between的值,这里可能不是很明显。重新生成0-59的数字列表:>>>??L=list(range(60))>>>L[0,1,2,...,59]取前5个元素:>>>L[:5][0,1,2,3,4]取下5个元素:>>>L[-5:][55,56,57,58,59]取15到25之间的数(不包括25)>>>L[15:25][15,16,17,18,19,20,21,22,23,24]前10个数中,每隔2取一个元素:>>>L[:10:2][0,2,4,6,8]在所有数中,每隔5取一个元素:>>>L[::5][0,5,10,15,20,25,30,35,40,45,50,55]还有一种情况,就是L[:],表示原样复制一个列表:>>>L[:][0,1,2,...,59Both]tuple和string可以使用切片操作,但这两种类型在切片后返回原始类型。例如:>>>_tuple=(0,1,2,3,4,5)>>>_str='012345'>>>_tuple[0:2](0,1)>>>_str[:2]'01'这里,元组切片操作返回的是元组,字符串也是,返回的字符串仍然是字符串。迭代如果给定一个列表,我们用for循环遍历这个列表,这种遍历称为迭代。在Python中,迭代是通过for...in...完成的,这就是上面的循环方法所做的。在Python中,for与其他语言不一样。它不仅可以作用于元组或列表,还可以作用于其他可迭代对象。下一篇介绍了可迭代对象的概念,可以回顾一下。Python的生成器和迭代器,比如dictionarydict,它没有索引的概念,但它是一个可迭代对象,也可以使用for循环进行迭代:>>>_dict={'a':1,'b':2、'c':3}>>>forkeyin_dict:...print(key)...abc正常的字典存储方式并不是按顺序存储的,所以输出结果的顺序可能不同。默认情况下,遍历字典的结果就是键(key)。如果需要迭代值(value),可以使用forvaluein_dict.values();如果需要同时迭代key和value,可以使用forkey,valuein_dict.items()。字符串也是可迭代对象,也可以使用for循环:>>>forchin"abc":...print(ch)...abc所以如果使用for循环,只要是一个可迭代对象,可以正常运行。至于判断一个对象是否为可迭代对象,这个问题在《Python 生成器和迭代器》的上述文章中已经有说明,这里不再赘述。for循环迭代时,可以输出元素值对应的索引。这是通过内置函数enmuerate完成的。这个函数能够将可迭代对象与索引组合成一个序列:>>>fori,eleminenumerate(['a','b','c']):...print(i,elem)...0a1b2c以上是关于切片和迭代的。欢迎关注微信公众号《书所集录》
