python 学习笔记 关于切片

切片是python中列表(list)、元组(tuple)、字符串(str)等序列类型都支持的一种操做,但实际上切片的功能比人们所想象的要强大的多。python

切片区间为何会忽略最后一个元素

  1. 当只有一个位置信息时,咱们也能够读出该区间包含几个值,例如:rang(3) / my_list[:3]都是含有3个元素;
  2. 当起止位置信息均可见时,咱们能够快速计算区间的长度,即(stop-start)便可;
  3. 能够利用一个任意下标将序列分割成互不交叉的两个子序列,如:my_list[:x] / my_list[x:]。

切片slice(start, stop, step)

对seq[start, stop, step]进行求值的时候,python会调用seq.__getitem__( slice(start, stop, step))。咱们还能够给切片进行命名,有名字的切片,显然更具备可读性。以下例:ssh

invoice = """
0.....6........15.....21
1001  prod_1   $17.5  3
1002  prod_2   $4.5   2
1003  prod_3   $10    1
1004  prod_4   $12    1
1005  prod_5   $8     1
"""

prod_id = slice(0, 6)
prod_desc = slice(6, 15)
prod_price = slice(15, 21)
prod_quantity = slice(21, None)
line_items = invoice.split('\n')[2:]
for item in line_items:
    print(item[prod_price], item[prod_desc], item[prod_quantity])

运行结果以下:
图片描述ide

给切片赋值

若是把切片放在赋值符号的左边,或者将切片做为del操做的对象,咱们就能够对序列进行嫁接、切除或者修改等操做,十分快捷方便。
图片描述spa

  • 对切片赋值时,赋值符号右侧必须是一个可迭代对象,即便这个对象只包含一个元素,不然会提示错误 TypeError: can only assign an iterable。

切片的实现

>>> dir(slice)
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'indices', 'start', 'step', 'stop']

slice 是python的内置类型,类型所具备的indices方法能够帮助咱们实现序列的切片操做。code

S.indices(len) -> (start, stop, stride)
给定长度为len的序列,计算S表示的扩展切片的起始和结尾索引,以及步幅。超出边界的索引会被截掉。

图片描述

如上图两个例子,假如如今有一个长度为5的序列seq,那么对于该序列而言,orm

seq[0, 10, 2] == seq[0, 5, 2]
seq[-3, 0, 0] == seq[2, 5, 1]

若是可以善用slice类型中Indices方法,则能够更加快捷实现自定义类型数据的切片操做。对象

注: 以上内容主体来自于《流畅的python》一书中 “2.4 切片” 和 “10.4.1 切片原理” 索引

相关文章
相关标签/搜索