【Python】09、線性結構、切片及解構


一、線性結構

    list、tuple、str、bytes、bytearray,range()

    都是順序存儲、順序訪問的、都是可迭代對象、都可以通過索引訪問;被稱爲線性結構

    可使用len()獲取長度、可以切片,可以使用iter()將可迭代對象轉換爲迭代器

In [16]: r = range(8)

In [17]: r
Out[17]: range(0, 8)

In [18]: i = iter(range(8))

In [19]: i
Out[19]: <range_iterator at 0x7f2417b7e5d0>

In [20]: next(i)
Out[20]: 0

In [21]: next(i)
Out[21]: 1

In [23]: len(r)
Out[23]: 8

In [24]: l = ["a", 0, 1]

In [25]: i = iter(l)

In [26]: type(i)
Out[26]: list_iterator

In [27]: next(i)
Out[27]: 'a'

In [28]: next(i)
Out[28]: 0

In [29]: next(i)
Out[29]: 1

In [30]: next(i)
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-30-bed2471d02c1> in <module>()
----> 1 next(i)

StopIteration:

      可迭代對象都可以用len獲取長度,使用iter()轉化成迭代器(iterator)


二、切片操作

      通過索引獲取獲取某個片段的值

格式:

      list[start:stop:step]    # 包含start不包含stop;返回一個新的list,不會對原list修改

In [1]: lst = list(range(5))

In [2]: lst
Out[2]: [0, 1, 2, 3, 4]

In [3]: lst[3]
Out[3]: 3

In [4]: lst[3:4]
Out[4]: [3]

In [6]: lst[1:5]
Out[6]: [1, 2, 3, 4]

In [7]: lst[1:5:2]
Out[7]: [1, 3]

In [8]: lst[1:5:6]
Out[8]: [1]

In [9]: lst[1:5:4]
Out[9]: [1]

In [10]: lst[1:5:3]
Out[10]: [1, 4]

In [11]: lst[1:5:-2]  
Out[11]: []



In [14]: lst[:]            
Out[14]: [0, 1, 2, 3, 4]

In [15]: lst[:3]
Out[15]: [0, 1, 2]

In [16]: lst[3:]
Out[16]: [3, 4]

In [17]: lst[::]           # star,stop,step都可以省略;默認爲0,-0,1
Out[17]: [0, 1, 2, 3, 4]

In [18]: lst[::2]
Out[18]: [0, 2, 4]

In [19]: lst[::-2]  # 這時step可以使用負數
Out[19]: [4, 2, 0]

In [20]: lst[::-1]
Out[20]: [4, 3, 2, 1, 0]

In [21]: lst[1:5:-1]
Out[21]: []

In [22]: lst[:5:-1]
Out[22]: []

In [23]: lst[0::-1]
Out[23]: [0]

當start >= stop時,step爲正時,返回空List;當step爲負數時,反向

In [34]: lst[2:-1]  # -1索引實際上等於len(list) + index,還是大於stop
Out[34]: [2, 3]

In [38]: lst[1:5]
Out[38]: [1, 2, 3, 4]

In [39]: lst[1:5:-2]
Out[39]: []

In [40]: lst[5:1:-2]
Out[40]: [4, 2]



三、解構與封裝

1、解構

解構:按照元素順序,把線性結構的元素複製給變量

In [69]: x = 1

In [70]: y = 2

In [71]: x, y
Out[71]: (1, 2)

In [72]: tmp = x

In [73]: x = y

In [74]: y = tmp

In [75]: x, y
Out[75]: (2, 1)


# 解構

In [76]: x = 1

In [77]: y = 2

In [78]: x, y = y, x

In [79]: x, y
Out[79]: (2, 1)

In [90]: lst = [1, 2]

In [91]: first, second = lst

In [92]: first, second
Out[92]: (1, 2)


2、封裝

     定義一個tuple,可以省略括號;封裝出來的一定是tuple

In [95]: t = 1, 2

In [96]: type(t)
Out[96]: tuple


3、結構的變化

     python3新增的特性

In [97]: lst = list(range(5))

In [98]: lst
Out[98]: [0, 1, 2, 3, 4]

In [99]: head, *mid, tail = lst

In [100]: head
Out[100]: 0

In [101]: tail
Out[101]: 4

In [102]: mid
Out[102]: [1, 2, 3]

## 加*號表示剩下的所有元素

In [103]: head, mid, *tail = lst

In [104]: head
Out[104]: 0

In [105]: mid
Out[105]: 1

In [106]: tail
Out[106]: [2, 3, 4]


In [108]: *head, mid, tail = lst

In [109]: head
Out[109]: [0, 1, 2]

In [110]: mid
Out[110]: 3

In [111]: tail
Out[111]: 4

In [112]: *head = lst
  File "<ipython-input-112-d93bf1bcef99>", line 1
    *head = lst
               ^
SyntaxError: starred assignment target must be in a list or tuple


In [113]: head, *m1, *m2, tail = lst
  File "<ipython-input-113-1fc1a52caa8e>", line 1
    head, *m1, *m2, tail = lst
                              ^
SyntaxError: two starred expressions in assignment


In [114]: *m1, *m2, tail = lst
  File "<ipython-input-114-ed48e48df1b1>", line 1
    *m1, *m2, tail = lst
                        ^
SyntaxError: two starred expressions in assignment

總結:

     元素按照順序賦值給變量

     變量和元素必須匹配

     加星號的變量,可以接受任意個數元素,不管右邊是什麼type返回的都是一個list,可以是[]

     加型號的變量不能單獨出現

In [115]: lst = [0, 1, 2, 3]

In [116]: v1, v2, v3, v4, v5 = lst
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-116-489c26003cc5> in <module>()
----> 1 v1, v2, v3, v4, v5 = lst

ValueError: not enough values to unpack (expected 5, got 4)

In [117]: v1, v2, v3, v4 = lst

In [118]: v1,v2,v3,v4
Out[118]: (0, 1, 2, 3)

In [119]: v1,v2,v3,*v4= lst

In [120]: v1,v2,v3,v4
Out[120]: (0, 1, 2, [3])

In [121]: v1,v2,v3,v4,*v5 = lst

In [122]: v1,v2,v3,v4,v5
Out[122]: (0, 1, 2, 3, [])


常見用法:

In [130]: head, *_, tail = lst     

## python中慣常使用單個下劃線_表示丟棄該變量,
## 單個下劃線也是Python中合法的標識符,但是如果不是要丟棄一個變量,通常不要用單個下劃線表示一個變量

In [131]: head
Out[131]: 0

In [132]: tail
Out[132]: 3

In [133]: _
Out[133]: [1, 2]


## 多層級解構

In [14]: lst = [1, (2, 3), 5]

In [15]: _, (_, var), _ = lst

In [16]: var
Out[16]: 3

In [17]: _
Out[17]: 5


     沒有解構,也可以活,但有了解構可以活的很美好

     解構這個特性,被很多語言借鑑,如(ES6)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章