Python小白的切片练习101

Python切片的基本语法

sequence[start:stop]
sequence[start:stop:step]
  • 通过给定的索引区间获得线性结构的一部分数据
  • start、stop、step为整数,可以是正整数、负整数、零
  • start为0时,可以省略 stop为末尾时,可以省略 step为1时,可以省略
  • 切片时,索引超过上界(右边界),就取到末尾;超过下界(左边界),取到开头
x = range(90,100)
x
range(90, 100)
x[:]
range(90, 100)
x[:-1]
range(90, 99)
x[0:]
range(90, 100)
x[3:]
range(93, 100)
x[3:-1]
range(93, 99)
x[9:-1]
range(99, 99)
x[:100]
range(90, 100)
x[-100:]
range(90, 100)
x[4:-2]
range(94, 98)
x[-4:-2]
range(96, 98)

字符串和byte同样可以切片

print("9876543210"[-4:8])
32
print(b"9876543210"[-4:8])
b'32'

Python切片的步长

x = range(0,10)
x
range(0, 10)
x[::]
range(0, 10)
x[::2]
range(0, 10, 2)
x[2:8:3]
range(2, 8, 3)
x[:9:3]
range(0, 9, 3)
x[1::3]
range(1, 10, 3)
x[-10:8:2]
range(0, 8, 2)

Python切片的起止和方向控制

  • 在序列上使用切片[start:stop],子区间索引范围[start, stop),相当于从start开始指向stop的方向上获 取数据
  • 默认step为1,表示向右;步长为负数,表示向左
  • 如果子区间方向和步长方向不一致,直接返回当前类型的"空对象"
  • 如果子区间方向和步长方向一致,则从起点间隔步长取值
x = [0,1,2,3,4,5,6,7,8,9,]
print(x)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
x[-10:]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
x[-5:-6]
[]
x[6:5]
[]
x[5:5]
[]
x[1:9:-2]
[]
x[::-2]
[9, 7, 5, 3, 1]
x[8::-2]
[8, 6, 4, 2, 0]
x[8:-10:-2]
[8, 6, 4, 2]
x[8:-10:-2]
[8, 6, 4, 2]
x[-5:4:-1]
[5]
x[-5:5:-1]
[]

切片包前不包后

t = [0,50,2,3,4]
t[1:2]
[50]

我们简单看一下切片有哪些实用的应用场景:

  • 用切片倒序输出,因为是按照索引取值,时间复杂度为O(1),所以是节省内存的输出方法,例如
x = range(6)
x
range(0, 6)
for i in range(-1, -len(x)-1, -1):
    print(x[i])
5
4
3
2
1
0

如上倒序输出写法等价于:

for z in x[::-1]:
    print(z)
5
4
3
2
1
0
  • 我们还可以使用切片完成copy,例如:

  • 实际上切片后得到一个全新的对象。 [:] 或 [::] 相当于copy方法,即相当于浅拷贝。

x= [1,2,3,4,5,6]
x
[1, 2, 3, 4, 5, 6]
y = x[:]
print(id(x),id(y))
2973248551304 2973249530440
x = [[1]]
y = x[:]
x[0][0]=100
y # 因为是浅拷贝,y的[0][0]个元素也自动变成了100
[[100]]
x ==y
True

上例可知,实际上切片后得到一个全新的对象。 [:] 或 [::] 相当于copy方法。

y 和 x它们两个变量指向同一个对象。
y=[]、y[:]=x等价于 z=x[:],都是创建x的副本。 切片赋值用作初始化相当于copy,还可以使用。如果用在替换、插入元素,看似语法比较简洁,但是由于列表是顺序表结构,将会引起数据的挪动,这非常影响性能,应当尽量避免使用。

  • 用切片进行赋值:
    切片操作写在了等号左边,被插入的可迭代对象写在等号右边
x = [0, 1, 2, 3, 4]
z = list()
z[:]=x
z[1:2]=10 #注意这里是不可以的,因为右边必须是可迭代对象iterable
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-88-baac5eba4b45> in <module>
      2 z = list()
      3 z[:]=x
----> 4 z[1:2]=10 #注意这里是不可以的,因为右边必须是可迭代对象iterable


TypeError: can only assign an iterable
z[1:2]=(111,)
z
[0, 111, 2, 3, 4]
z[2:]=(222,)
z
[0, 111, 222]
z[1:] = (40, 50 ,60, 70) 
z
[0, 40, 50, 60, 70]
t[1:] = range(10,20)
t
[0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

今日鸡汤:一个人水平有多高,取决于基础有多么扎实

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值