切片操作slice
首先要明确一点:字符串和元组是不可变的可迭代对象,列表是可变的可迭代对象
对于可变不可变,就引起了能否赋值的问题
例如:
>>> s = [1,2,3] # 列表 可变
>>> s[0] = 100
>>> s
[100, 2, 3]
>>> a = (1,2,3) # 元组 不可变
>>> a[0]
1
>>> a[0]=100
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
a[0]=100
TypeError: 'tuple' object does not support item assignment
>>> b = 'helloworld' # 字符串 不可变
>>> b[0]
'h'
>>> b[0]=k
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
b[0]=k
NameError: name 'k' is not defined
以上是索引赋值,索引都不能赋值的,切片就也不能赋值了,好了,进入正题吧
切片的定义
从序列中取出相应的元素重新组合成一个新的序列
语法
s[(开始索引b):(结束索引e):(步长s)]
说明
- 切片切下的位置:0 代表第一个元素,-1代表最后一个元素
- 结束索引是切片的终止索引(但不包括终止点)
- 步长是切片每次获取完当前元素后移动的偏移量
3.1. 步长默认为 1
3.2. 当步长是正数时,取正向切片,开始索引默认为 0 ,结束索引为最后一个元素的下一个位置
3.3. 当步长为负数时,取反向切片,开始默认为最后一个,结束位置是第一个的前一个
举个栗子:
>>> s = 'helloworld'
>>> s[2]
'l'
>>> s[2:3] # 索引从2开始,到3的前一个结束
'l'
>>> s[0:5:2]
'hlo'
>>> s[0:5:-2] # 为什么呢? 步长为负,开始索引必须大于终止索引才有数据让我们切啊!!
''
>>> s[5:0:-2]
'wle'
>>> s = [1,2,3,4,56,7]
>>> s[2::2]
[3, 56]
>>> s = (1,2,3,4,5,6)
>>> s[2::2]
(3, 5)
切片赋值
切片赋值只对可变序列有效,即只有列表了
举个栗子:
# 此示例示意字符串的切片赋值
>>> s = 'hello world'
>>> s[1:2] = 'w'
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
s[1:2] = 'w'
TypeError: 'str' object does not support item assignment
很明显,失败了
# 此示例示意元组的切片赋值
>>> s = (1,2,3,5,6,3)
>>> s[1:2]=123
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
s[1:2]=123
TypeError: 'tuple' object does not support item assignment
我们不难发现,错误信息和字符串是相同的,再看列表怎么样
>>> s = [1,2,3,4,5,6]
>>> s[1:2]=100 # 看报错信息是让赋值可迭代对象,但字符串和元组直接就是不让赋值
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
s[1:2]=100
TypeError: can only assign an iterable
>>> s[1:2]=[100000]
>>> s
[1, 100000, 3, 4, 5, 6]
在列表开始位置插入数据
>>> s = [1,2,3]
>>> s[0:0]=[123]
>>> s
[123, 1, 2, 3]
如果是[0:1]会是什么效果呢?
>>> s = [1,2,3]
>>> s[0:1]=[123]
>>> s
[123, 2, 3]
这样就把索引为 0 的元素给替换掉了
在指定索引处插入数据
>>> s = [1,2,3]
>>> s[1:1] = [222222] # 在索引为 1 的位置插入数据
>>> s
[1, 222222, 2, 3]
在最后插入数据
>>> s = [1,2,3]
>>> s[len(s):] = [111]
>>> s
[1, 2, 3, 111]
因为我们不知道这个列表到底有多长,可以先计算其长度,再赋值
本节完