切片(slice)就是切取列表(字符串、tuple)中连续或非连续元素,组成的新列表。没理解这句话没关系,看例子就能懂,跟着敲就行。熟悉基本用法的可以拖到进阶和高阶部分。

如何python qpi切花数据源 python切片程序_Python


饿了么?放个切片面包

初阶

现在有 1 到 9 组成的列表对象

>>> nums = [1, 2, 3, 4, 5, 6, 7, 8, 9]

我想获取 4、5、6 三个元素,你可以根据下标索引逐个取出3个元素,不过 Python 程序员是不会这么做的,而是使用切片技术。

4是从第3个元素,从这里开始连续的取值,直到第6个元素结束(但不含第6个元素),可表示为 [start:end]

>>> nums[3:6]
[4, 5, 6]

如果开始位置是0,那么 start 是可以省略的

>>> nums[0:5]
[1, 2, 3, 4, 5]

>>> nums[:5]
[1, 2, 3, 4, 5]

同样的道理,如果结束的位置是最后一个元素,那么 end 也可以省略

>>> nums[6:len(nums)]
[7, 8, 9]
>>> nums[6:]
[7, 8, 9]

如果结束的位置超出了列表的长度会怎么样,不会怎么样。反正就是取到最后一个元素为止。

>>> nums[6:20]
[7, 8, 9]

如果开始位置是0,结束位置是列表的长度,就是取列表的全部元素,相当于复制出了一个新的列表。

>>> nums[0:len(nums)]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

进阶

复制列表有更简便的写法,开始位置和结束位置都可以省略。

>>> nums[:]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

切片一般情况下是以连续的方式选择列表中的部分元素,不过也可以非连续按某个固定步长 “n” 来选取,这个时候需要用两个冒号表示: [start:end:n],所取的值就是: nums[start],nums[start+n] ,nums[start+n+n] … 直到结束位置。

>>> nums[0:5:2]
[1, 3, 5]

从第0个位置开始,到第5个位置结束,步长为2,得到的元素是 nums[0],nums[0+2],nums[0+2+2]

步长n默认为1,只是省略掉了而已。

>>> nums[1:5]
[2, 3, 4, 5]
# 等价
>>> nums[1:5:1]
[2, 3, 4, 5]

步长n还可以是负数,例如:

# 反转列表
>>> nums[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1]

高阶

通常情况下掌握了上面的知识能满足90%的场景,但是,这种切片不支持生成器的切片,如果列表非常大,切片返回的字列表也很大,我们知道列表与迭代器的区别是后者能节省内容,所以有个高阶的切片方式在 itertools 模块下面。

>>> s = itertools.islice(nums, 1, 5)
>>> s
<itertools.islice object at 0x01A97F00>
>>> list(s)
[2, 3, 4, 5]

用法和列表切片类似,只不过将开始位置、结束位置、步长三个数当作参数传给 islice 方法。 不同的是步长n 不能为负数。 返回的结果是一个生成器对象。

生成器不支持直接切片

>>> g = (x*2 for x in range(10))
>>> g
<generator object <genexpr> at 0x01A97E40>
>>> g[2:5]
TypeError: 'generator' object is not subscriptable

用 itertools.islice 就可以。

>>> s = itertools.islice(g,1,5)
>>> list(s)
[2, 4, 6, 8]

对于复杂的切片场景,有可能你会用到 UserString、UserList 这样的类型,等你去探索。

最后给你留个作业,将列表换成字符串,重复上面的代码示例。


PS:昨天给大家推荐的小册,如果你在学爬虫或者有志于从事爬虫工程师这个岗位(次条有工作推荐),可以花一个快餐的钱学习大规模爬虫怎么玩。没兴趣的请自动忽略哈。谢谢你们