核心知識點:
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 模組時還可能...