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 切片原理」 索引

相關文章
相關標籤/搜索