第5條 了解切割序列的辦法

2022-03-14 01:44:31 字數 3428 閱讀 4943

核心知識點:

1.不要寫多餘的**:切片的起止索引為0時,有時候使用負值更方便,應該省略;

2.切片不會計較起止索引是否越界;

3.使用切片對列表負值,系統不會考慮範圍的長度;

4.更改淺拷貝生產的列表,不會對原列表產生影響,反之,則不同。

python提供了一種把序列切成小塊的寫法。這種切片(slice)操作,使得開發者可以輕易的訪問由序列中的某些元素所構成的子集。

最簡單的用法就是對內建的list、str和bytes進行切割。

切割的基本寫法時somelist[start:end],其中start(起始索引)所指的元素覆蓋在切割後的範圍內,而end(結束索引)所指的元素不包括在切割結果之中。

>>> a = ['

a','

b','

c','

d','

e','

f','

g','

h','i'

]>>> print('

first four:

',a[:4])

first four: ['a

', '

b', '

c', 'd'

]>>> print('

last four:

',a[-4:])

last four: ['f

', '

g', '

h', 'i'

]>>> print('

middle three:

',a[3:-3])

middle three: ['d

', '

e', 'f'

]#這裡我之所以會多此一舉的使用print,我想提醒大家乙個概念

#在python解釋其中,我們並沒有列印,而結果輸出了,那是python直譯器幫我們執行了print操作。

如果從列表開頭獲取切片,那就不要在start那裡寫上0,而是應該把它留空,這樣**會看起來清爽一些。

同樣的如果切片一直要取到列表末尾,也要把end留空,因為即便寫了也是多餘的。

很多時候我們使用負值來表示索引的位置,會顯得簡單和直白。

切割列表的時候,即便start或end索引越界也不會出現任何問題。利用這一特性,我們可以限定輸入序列的最大長度。

>>> print('

all:

',a[:20])

all: ['a

', '

b', '

c', '

d', '

e', '

f', '

g', '

h', 'i'

]>>> print('

all:

',a[-20:])

all: ['a

', '

b', '

c', '

d', '

e', '

f', '

g', '

h', '

i']

但是訪問單個元素時,下標不能越界,否則就會出現異常。

>>> a[20]

traceback (most recent call last):

file

"", line 1, in

indexerror: list index out of range

原表進行切割之後,會產生另外乙份全新的列表。系統依然維護著指向原列表中各個物件的引用

在切割後得到的列表上進行修改,不會影響原列表。

>>> b = a[4:]

>>> print('

before:

',b)

before: ['e

', '

f', '

g', '

h', 'i'

]>>> b[1] = 99

>>> print('

after:

',b)

after: ['e

', 99, '

g', '

h', 'i'

]>>> print('

no change:

',a)

no change: ['a

', '

b', '

c', '

d', '

e', '

f', '

g', '

h', '

i']

在賦值時對左側列表使用切割操作,會把該列表中處在指定範圍內的物件替換為新值。

與元祖(tuple)的賦值(如a,b =c[:2])不同(元祖不能改變),此切片的長度無需與新值的個數相等,

位於切片範圍之前及之後的那些值都保持不變。列表會根據新值的個數相應的擴張或收縮。

>>> print('

before

',a)

before ['a

', '

b', '

c', '

d', '

e', '

f', '

g', '

h', 'i'

]>>> a[2:7] = [99,22,14]

>>> print('

after

',a)

after ['a

', '

b', 99, 22, 14, '

h', '

i']

如果對賦值操作右側的列表使用切片,而把切片的起止索引都留空,那麼就會產生乙份對原列表的拷貝。

>>> b =a[:]

>>> print(a == b) #

淺拷貝true

>>> print(a is

b)false

關於深淺拷貝的部落格:

如果對賦值操作左側的列表使用切片,而又沒有指定起止索引,那麼系統會把右側的新值賦值乙份,

並用這份拷貝來替換掉左側列表的全部內容,而不會重新分配新的列表。

>>> b =a

>>> print('

berofe

',a)

berofe ['a

', '

b', 99, 22, 14, '

h', 'i'

]>>> a[:] = [102,103,104]

>>> print('

after

',a)

after [102, 103, 104]

>>> print('

after

',b)

after [102, 103, 104] #

b還是指向a

第5條了解切割序列的方法

python提供切片操作 slice 可以輕鬆的訪問序列中的某段子集元素。python常見的資料元素list,str,和bytes均提供slice操作。同時切割操作可以通過 getitem 和 setitem 特殊方法實現。切割的基本操作為 somlist start end 表示的區間為左閉右開區...

第47條 了解和使用類庫

假設希望產生位於0到某個上界之間的隨機整數。可能會這樣編寫 private static final random rnd new random static int random int n 測試隨機性 public static void main string args 結果接近於666666...

第4章 文字和位元組序列 了解編碼問題

常見編譯碼異常 unicodeencodeerror 編碼錯誤,將字串編碼成位元組串 二進位制位元組序列 時的異常 unicodedecodeerror 解碼錯誤,將位元組串 二進位制位元組序列 解碼成字串時的異常 syntaxerror 如果原始碼的編碼與預期不符,載入 python 模組時還可能...