## 切片操作
python的切片操作是用來訪問可迭代對象的,包括字符串和數組,列表等。
我們以數組為例進行介紹
```python
a = [1, 2, 3, 4, 5]
# 訪問數組的前3個元素
a[0:3]
```
[1, 2, 3]
可以看到我們采用a[0:3]的方法很容易的訪問到了數組的前三個元素。
對于具有序列結構的數據來說,切片操作的方法是:consequence[start_index: end_index: step]。
start_index:表示是第一個元素對象,正索引位置默認為0;負索引位置默認為 -len(consequence)
end_index:表示是最后一個元素對象,正索引位置默認為 len(consequence)-1;負索引位置默認為 -1。
step:表示取值的步長,默認為1,步長值不能為0。
```python
print(a[-2])
```
4
```python
a[0::2] # 從第0個元素開始,每隔兩個元素取一個元素
```
[1, 3, 5]
```python
a[-4 : 3] # 從倒數第四個元素到正數第三個元素
```
[2, 3]
```python
a[-4 : -2] # 從倒數第四個元素到正數第四個元素
```
[2, 3]
可以看到從楊是從
# 利用步長對序列進行倒序取值
在切片運算中,步長為正,表示從左至右,按照索引值與起始位置索引之差可以被步長整除的規律取值;當步長為負,則表示從右至左,按照按照索引值與起始位置索引之差可以被步長整除的規律取值。
根據這個特性,我們可以很方便對某個序列進行倒序取值,這個方法比reverse方法更方便,且適用于沒有reverse方法的字符串和元組。
```python
print(a[::-1])
```
[5, 4, 3, 2, 1]
```python
a[::-2] # 從最后一個元素開始,每兩個元素取一個
```
[5, 3, 1]
# 列表生成式
列表生成式是python中非常好用的一個語法糖,很多時候可以大大的簡化代碼,讓代碼更加容易閱讀和理解。是Python內置的非常簡單卻強大的可以用來創建list的生成式。舉個例子,要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用range(1, 11):
```python
list(range(1, 11))
```
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
但如果要生成[1x1, 2x2, 3x3, ..., 10x10]怎么做?方法一是循環:
```python
demolist = []
for x in range(1, 11):
demolist.append(x * x)
demolist
```
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
但是循環太繁瑣,而列表生成式則可以用一行語句代替循環生成上面的list:
```python
[x * x for x in range(1, 11)]
```
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
寫列表生成式時,把要生成的元素x * x放到前面,后面跟for循環,就可以把list創建出來,十分有用,多寫幾次,很快就可以熟悉這種語法。
for循環后面還可以加上if判斷,這樣我們就可以篩選出僅偶數的平方:
```python
[x * x for x in range(1, 11) if x % 2 == 0]
```
[4, 16, 36, 64, 100]
還可以使用兩層循環,可以生成全排列:
```python
[m + n for m in 'ABC' for n in 'XYZ']
```
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
在涉及到列表操作的時候,列表生成式是非常方便的,舉個簡單的例子,舉個例子我們要找出1到100中所有3的倍數:
```python
L = []
for x in range(100):
if x % 3 == 0:
L.append(x)
print(L)
```
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
```python
# 而如果用列表生成式就簡單多了
print([x for x in range(100) if x % 3 == 0])
# 代碼的可讀性高,只要一行代碼就能夠完成四行代碼的工作
# 在比如找出100以內所有3或者7的倍數
print([x for x in range(100) if x % 3 == 0 or x % 7 == 0])
```
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
[0, 3, 6, 7, 9, 12, 14, 15, 18, 21, 24, 27, 28, 30, 33, 35, 36, 39, 42, 45, 48, 49, 51, 54, 56, 57, 60, 63, 66, 69, 70, 72, 75, 77, 78, 81, 84, 87, 90, 91, 93, 96, 98, 99]
絕大部分用到循環的地方,都可以用列表生成式來簡化代碼,列表生成式是python中非常強大的工鞥呢。