Python slicing(切片)的高级用法(推测)
需求:一条语句从(0,1,2,3,4,5,6,7,8,9,10)
中取出(7,5,3)
。
分析:可以使用Python的切片功能。
完整用法:iteratableObj[startIndex:endIndex:step]
其中iteratableObj
可以是list, tuple,其他的我就不清楚了。(没去查官方文档= =)
然后startIndex
为包含性的从0开始的元素编号,表示切片的开始位置;endIndex
为非包含性的从0开始的元素编号,表示切片的结束位置;step
表示步进,即每次前进多少个元素,默认为1。
这些数字如果是负数的话,也是有特定含义的,会被Python解释器认为是反向编址的序号,即常说的倒数第几个。相应地,step处的负号会让整个列表翻转。然后这里就涉及了一个很有意思的问题:同时进行切片和翻转,到底谁先谁后?也就是说,startIndex
和endIndex
到底应该是填顺序的还是反序的?
经过实践,发现顺序如下:
- 先检查
step
的符号,如果为负,翻转列表(也可能是将读取顺序标记为反序) - 按照
startIndex
和step
开始选取元素,以endIndex
为界限(不包含)。这里的两个index都还是顺序的!
于是上文的题目解答如下:
arr = (0,1,2,3,4,5,6,7,8,9,10)
print(arr[7:2:-2]) # or print(arr[-4:-9:-2])
千万要记住这里的第二个地址还是不包含的,所以一定要多顺着方向将地址+1!