Python中的切片容易混淆,这里总结一下自己的看法
切片的语法
| 1 | a = [1,2,3,4] | ||
| 2 | x = a[1:2] #实际上执行的是 a.__getitem__(slice(1,2,None)) | ||
| 1 | slice([start], stop[, step] | ||
| 2 |
| |
| 3 | step的符号表示一种方向的含义 | |
| 4 | +:从左向右看,start默认是0,stop默认是索引最大值 |
| 5 | -:从右向左看,start默认是索引最大值,stop默认是0 |
| 1 | 1.先看第三个参数,如果该数为正,则从前往后数,如果为负,则从后往前数,如果非1,则是跳步来数(1表示走一步,跳0步) | |
| 2 | 2.PYTHON总是左开右闭的,也就是说第一个参数要包括,第二个参数不包括 | |
| 3 | 3.如果第一个参数没填,则自动设为第一个参数(根据第三个参数的正负判断是整数第一个还是倒数第一个) |
| 4 | 4.如果第二个参数没填,则自动设定为最后一个参数(根据第三个参数的正负判断是整数第一个还是倒数第一个 |
| 5 | 另外这个参数不会包括进去【左开右闭】) |
示例
| 01 | >>> s = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] | |
| 02 | >>> s[5:0:-1] | |
| 03 | [5, 4, 3, 2, 1] | |
| 04 | >>> s[5:4:-1] | |
| 05 | [5] | |
| 06 | >>> s[:3:-1] | |
| 07 | [9, 8, 7, 6, 5, 4] | |
| 08 | >>> s[0:3:-1] | |
| 09 | [] | |
| 10 | >>> s[9::-1] | |
| 11 | [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] | |
| 12 | >>> s[::2] | |
| 13 | [0, 2, 4, 6, 8] |
代码分析
| 01 | 首先定义 s = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] | |
| 02 |
| |
| 03 | Python中正索引是从0开始的,负索引从-1开始,索引1对应1, 而索引-1对应9. | |
| 04 |
| |
| 05 | s[5:0:-1]: 1.step 为负数,从右往左输 | |
| 06 | 2.从索引 5 开始 到索引0 结束, 但不包括索引0 , 输出为 [5, 4, 3, 2, 1] | |
| 07 |
| |
| 08 | s[:3:-1]: 1.step 为负数,从右往左输出 | |
| 09 | 2.step 为负数,[start]默认值为索引最大值, 即 9, 那么这个切片等价于s[9:3:-1] |
| 10 | 3.从索引 9 开始 到索引3 结束, 但不包括索引3 , 输出为[9, 8, 7, 6, 5, 4] |
| 11 |
| |
| 12 | s[9::-1]: 1.step 为负数,从右往左输 | |
| 13 | 2.step 为负数,[stop]默认值为0, 那么这个切片等价于s[9:0:-1],输出为[9, 8, 7, 6, 5, 4, 3, 2, 1, 0] | |
| 14 |
| |
| 15 | s[::2]: 1.step 为正数,从右往左输 | |
| 16 | 2.step 为正数,start默认是0,stop默认是索引最大值,那么这个切片等价于s[0:9:2 | |
| 17 | 3.step 为2表示走两步, 即中间间隔一个字符, 输出为[0, 2, 4, 6, 8] |
转载于:https://blog.51cto.com/bsbforever/1593708