天天看點

python序列的主要特點_python序列模型

python序列的主要特點_python序列模型

序列按存儲元素類型是否一緻可分為:扁平序列、容器序列。

扁平序列:string(字元串)、array.array(數組)、memoryview(記憶體視圖)、bytes(位元組串)、bytearray(位元組數組)

扁平序列中所有元素都為同類型資料。

容器序列:list(清單)、tuple(元組)、collection.deque(雙向隊列)

容器序列則可以存儲不同類型的資料,但容器序列實際存儲的是個元素的引用。支援元素嵌套

序列按是否更改又能分為:可變和不可變序列。

可變序列:list、array.array、bytearray、colloction.deque、memoryview

不可變序列:tuple、string、bytes

字典和集合嚴格意義上說并不屬于序列。序列即為一系列資料元素有秩序的組合在一起,構成一個整體,是一種組織資料的模型。

python中有序序列如list、tuple、str和range等都支援雙向索引

正向索引:從0開始

逆向索引:-1代表倒數第一個元素,-2代表代數第二個元素,以此類推

清單清單為python内置的可變序列資料結構之一,包含若幹==有序連續==的記憶體空間。

當清單增加或删除元素時,清單對象會自動進行記憶體的擴充或收縮,以保證元素之間沒有縫隙。

由于在清單中間插入或删除元素時會涉及大量元素的移動,效率較低,是以盡量從尾部增删元素。

==*同一清單中的元素的資料類型可以各不相同==

因為基于值的記憶體管理機制,清單中元素并不直接存儲值,而是存儲值的引用(或者說對象的引用)。

清單的建立list()内置函數

操作符,各元素之間用逗号隔開

清單的基本操作原地操作(通常都是list對象自帶的行為操作,del指令删除指定位置元素)

函數

功能

lst.append(x)

在清單lst末尾增加元素X

lst.extend(lst2)

在清單lst與lst2合并,==與lst+=lst2效果一樣且都是原地操作.

但lst=lst+lst2則會改變lst的id值,即lst+lst2傳回一個新的清單對象==

lst.insert(index,x)

在清單lst指定的index位置插入元素x

lst.remove(x)

删除清單lst中元素x

lst.pop([index])

傳回并删除清單lst指定index位置的元素,

預設為清單尾部元素

lst.clear()

删除清單lst中所有元素,但保留清單對象,

即傳回空清單

lst.index(X)

傳回清單lst中第一個為X的元素的下标

lst.count(x)

傳回指定元素X在清單lst中出現的次數

lst.reverse()

将清單lst逆序,lst發生變化(原地操作)

而内置函數reversed(lst)為非原地操作,原lst不變,傳回一個新清單

lst.sort(key=None,reverse=False)

将lst排序(原地操作)

lst.copy()

傳回清單lst的==淺複制==

淺複制&深複制

我們尋常意義的複制就是深複制,即将被複制對象完全再複制一遍作為獨立的新個體單獨存在。是以改變原有被複制對象不會對已經複制出來的新對象産生影響。

淺複制并不會産生一個獨立的對象單獨存在,他隻是将原有的資料塊打上一個新标簽,是以當其中一個标簽被改變的時候,資料塊就會發生變化,另一個标簽也會随之改變。這就和我們尋常意義上的複制有所不同了。

對于簡單的 object,用 shallow copy 和 deep copy 沒差別

複雜的 object,如 list 中套着 list 的情況,shallow copy中的子list,并未從原object 真的「獨立」出來。也就是說,如果你改變原 object 的子 list 中的一個元素,你的copy 就會跟着一起變。這跟我們直覺上對「複制」的了解不同。

了解原子對象和容器對象

非原地操作(Python内置函數,運算符+、*等)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68>>> x=list(range(10))

>>> y=x #x,y指向同一個對象,由id(x),id(y)可以看出

>>> y

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> id(x)

2568897570056

>>> id(y)

2568897570056

>>> import random

>>> random.shuffle(x) #随即打亂

>>> x

[3, 7, 1, 6, 8, 2, 0, 9, 4, 5]

>>> x is y

True

>>> y

[3, 7, 1, 6, 8, 2, 0, 9, 4, 5]

>>> x.pop() #原地操作

5

>>> id(x)

2568897570056

>>> x.append(258) #原地操作

>>> x

[3, 7, 1, 6, 8, 2, 0, 9, 4, 258]

>>> y

[3, 7, 1, 6, 8, 2, 0, 9, 4, 258]

>>> id(x)

2568897570056

>>> x.extend([15,51]) #原地操作

>>> y

[3, 7, 1, 6, 8, 2, 0, 9, 4, 258, 15, 51]

>>> id(y)

2568897570056

>>> x.insert(0,'insert') #原地操作

>>> x

['insert', 3, 7, 1, 6, 8, 2, 0, 9, 4, 258, 15, 51]

>>> x.remove(7) #原地操作

>>> x

['insert', 3, 1, 6, 8, 2, 0, 9, 4, 258, 15, 51]

>>> x.reverse() #list對象本身自帶逆序函數,原地操作

>>> x

[51, 15, 258, 4, 9, 0, 2, 8, 6, 1, 3, 'insert']

>>> x.pop()

'insert'

>>> x

[51, 15, 258, 4, 9, 0, 2, 8, 6, 1, 3]

>>> x.sort() #原地操作

>>> x

[0, 1, 2, 3, 4, 6, 8, 9, 15, 51, 258]

>>> reversed(x) #内置函數進行逆序,非原地操作,傳回新的對象。x不變

>>> x

[0, 1, 2, 3, 4, 6, 8, 9, 15, 51, 258]

>>> sorted(x,reverse=True) #非原地操作,産生新的清單

[258, 51, 15, 9, 8, 6, 4, 3, 2, 1, 0]

>>> x

[0, 1, 2, 3, 4, 6, 8, 9, 15, 51, 258]

>>> x=x+[1,2] #非原地操作(*)

>>> id(x)

2569288051976

>>> id(y)

2568897570056

>>> y

[0, 1, 2, 3, 4, 6, 8, 9, 15, 51, 258]

>>> y+=[1,2] #原地操作(與上一語句(*)對比)

>>> y

[0, 1, 2, 3, 4, 6, 8, 9, 15, 51, 258, 1, 2]

>>> id(y)

2568897570056

python中内置函數map(),filter(),reduce()等函數是==python函數式程式設計==的重要展現

(reduce()函數在python3中不是内置函數,而是在functools庫中)

注:下表中的lst不一定是清單,其他可疊代對象均可

函數 | 功能

— | —

map.(func,lst) | 傳回清單lst中每個元素經過函數func映射後的結果清單,

這裡的func也可以是lambda函數

filter(func,lst) | 将一個單參數函數作用到序列lst上,并傳回該序列中使得該函數

傳回值為True的那些元素組成的filter對象,如果指定函數為None,

則傳回序列中等價于True的元素所組成的filter對象

reduce(func,lst) | 将一個兩參數函數以累積方式從左到右依次作用到序列lst上

zip(seq1[,sep2[,sep3…]]) | 傳回元素為元組的新清單

enumerate(seq) | 枚舉清單元素,傳回enumerate對象

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15>>> a=list(range(10))

>>> a

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> b=list(map(lambda x :chr(x+ord('A')),a))

>>> b

['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']

>>> list(enumerate(b))

[(0, 'A'), (1, 'B'), (2, 'C'), (3, 'D'), (4, 'E'), (5, 'F'), (6, 'G'), (7, 'H'), (8, 'I'), (9, 'J')]

>>> list(filter(lambda x:x>6,a))

[7, 8, 9]

[x>6 for x in a ]

[False, False, False, False, False, False, False, True, True, True]

>>> from functools import reduce

>>> reduce(lambda i,j:i+j ,a)

45

切片通過切片擷取清單部分元素

可以通過切片實作删除、更改、增加元素

通過切片進行淺複制

清單推導式[表達式或函數式 for 變量 in 可疊代對象]

清單推導式結合if語句過濾元素

清單推導式實作多重循環

清單推導式實作矩陣轉置

清單推導式内使用函數或複雜表達式

array.array

簡介

array數組類型和C語言中的數組很類似,可以指定數組中存儲元素的類型。特點是速度快,可以通過執行個體方法存儲和讀取二進制檔案。

執行個體

collection.deque

簡介

清單可以通過pop()方法和append()方法來實作“先進先出”的隊列屬性,但由于頻繁移動元素導緻效率不高。deque類型專門對入隊出隊進行了優化。

執行個體

元組及具名元組

元組

元組基本知識元組為不可變序列,支援切片操作,但隻能通過切片來通路元組中的元素。可以将元組看成‘常量清單’。

當元組中的元素包含可變序列(如清單)時,情況變得不一樣。

python對元組内部做了優化,其通路和處理速度比清單更快。而且由于其不可改變的特點通常用來==函數調用時進行參數傳遞==

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27>>> a= (1,2,3)

>>> a

(1, 2, 3)

>>> type(a)

>>> b=a[:]

>>> b

(1, 2, 3)

>>> c=(3) #c=3等價,建立含一個元素的元組如d

>>> c

3

>>> type(c)

>>> d=(3,)

>>> d

(3,)

>>> type(d)

>>> e=()

>>> e

()

>>> f=tuple()

>>> f

()

>>> g=tuple([1,2,34,5])

>>> g

(1, 2, 34, 5)

生成器推導式格式:(表達式 for 變量 in 序列或疊代對象)

生成器推導式的結果為一個生成器對象

==生成器對象==:

可以使用工廠函數list(),tuple()将其轉化為清單或元組,也可以通過生成器對象本身的next方法或内置函數next()進行周遊,也可将其直接當做疊代器對象使用。但無論如何周遊或使用,當所有元素周遊完後,需要重新建立生成器對象才能重新通路其中的元素。生成器對象的優點是節省記憶體空間

包含yield關鍵字的函數可以用來建立可疊代的生成器對象

注意事項盡量不要把可變序列作為元組的元素

增量指派不是 原子操作,對于可變序列,+=運算符調用–iadd–() 特殊方法,就地操作。而不可變序列則沒有–add–(),是通過–add–()方法實作的,此時會建立一個新的對象,完成操作後與原變量關聯。

具名元組

collection.namedtuple()是一個工廠函數,用來建構帶字段名的元組和帶名字的類。

執行個體

序列解包對多個變量同時指派

同時周遊多個序列

在實參前加*号可以實作序列解包并在函數調用時進行參數傳遞

元組拆包常常用來傳遞函數參數。