[toc]
## 列表的定義和創建
### 定義:
`[]`內以逗號分隔,按照索引,存放各種數據類型,每個位置代表一個元素
### 列表的創建
* 常用方法(**常用**)
* 定義空列表
`L1=[]`
* 定義普通列表
`L2=['張三','李四','noah']`
* 定義嵌套列表
`L3=['張三',['李四','alex']]`
* 其他方法
所謂其他方式,其實就是在定義列表時,使用列表函數`lsit()`來定義,一般都這樣用
`list_test=list('noah')`
`list_test=list(['張三',‘李四’,'noah'])`
## 列表的特點
1. 可存放多個值
2. 按照從左到右的順序定義列表元素,下標從0開始順序訪問,有序
| list | | 張三 | 李四 | noah |
| --- | --- | --- | --- | --- |
| 索引 | | 0 | 1 | 2 |
3. 可修改指定索引位置對應的值,可變
## 列表的常用操作:
### 查詢取值+索引
列表`L2=['a','b',['c','d'],'a','e',1,2]`
* 通過索引取值
```
>>> L2[0] #取值順序從左至右,從0開始
'a'
>>> L2[-1] #可以指定負數,從右至左取值
2
```
* 嵌套列表取值
```
>>> L2[2]
['c', 'd']
>>> L2[2][0] #嵌套列表就用多個下標
'c'
>>>
```
* 返回指定元素的索引值
```
>>> L2.index('a') #多個元素相同,只會返回第一個元素的索引
0
>>> L2.index('b')
1
```
### 統計+包含
列表`L2=['a','b',['c','d'],'a','e',1,2]`
* 統計指定元素的個數`count`
```
>>> L2.count('a')
2
```
* 統計列表長度`len`
```
>>> len(L2)
5
```
* 判斷元素是否包含在列表中`in` or `not in`
```
>>> 'noah' in L2
False
>>> 'd' in L2
True
```
### 切片
切片顧頭不顧尾,用單冒號`:`進行切片,用雙冒號'::'可指定切片步長
列表`L2=['a','b','c','d','a','e',1,2]`
* 單冒號切片`:`
```
>>> L2[0:3] #顧頭不顧尾,返回0,1,2三個元素
['a', 'b', 'c']
>>> L2[0:-1] #用負號從后面計算,但不包含最后一個元素
['a', 'b', 'c', 'd', 'a', 'e', 1]
>>> L2[3:] #冒號后面不寫表示到最后一個元素
['d', 'a', 'e', 1, 2]
>>> L2[:] #前后都不寫,表示所有元素
['a', 'b', 'c', 'd', 'a', 'e', 1, 2]
```
* 雙冒號帶步長切片`::`
```
>>> L2[1:6:2] #默認步長1,這里指定步長2
['b', 'd', 'e']
>>> L2[::2]
['a', 'c', 'a', 1]
```
### 插入+追加+擴展
列表`L2=['A','B','C','D']`
* 追加`append`
append是在列表最后面追加一個元素,不能一次追加多個,但可以追加一個列表做嵌套列表
```
>>> L2.append('noah')
>>> L2
['A','B','C','D','noah']
>>> L2.append(['aa','cc'])
>>> L2
['A', 'B', 'C', 'D', 'noah', ['aa', 'cc']]
```
* 插入`insert`
insert是在指定的索引位置,插入一個元素,并將原來的元素依次往后擠
```
>>> L2.insert(2,'D')
>>> L2
[''A','B','D','C','D', 'noah', ['aa', 'cc']]
```
* 列表擴展`extend`
```
#extend方法將新列表追加到原列表后面
>>> L2=['A','B','C','D']
>>> L3=[1,'F','G',2]
>>> L2.extend(L3)
>>> L2
['A', 'B', 'C', 'D', 1, 'F', 'G', 2]
# 也可以不命名列表,直接寫信列表值,相當于同時append追加多個元素
>>> L2=['A','B','C','D']
>>> L2.extend([1,'F','G',2])
>>> L2
['A', 'B', 'C', 'D', 1, 'F', 'G', 2]
```
### 修改
列表`L2=['A','B','C','D']`
* 修改
```
>>> L2[2]='BBB'
>>> L2
['A','B','BBB','C','D']
```
### 刪除+清空
列表自帶方法不能指定索引位置進行刪除,python全局方法可以
列表`L2=['A','B','C','A','F','D']`
* 列表自帶方法
```
>>> L2.pop() #pop方法,刪除最后一個元素
'noah'
>>> L2
['A','B','C','A','F']
>>> L2.remove('A') #remove方法,刪除找到的第一個元素
>>> L2
['B','C','A','F']
```
* python全局方法
```
>>> del L2[-2] #刪除指定位置的元素
>>> L2
['B','C','F']
>>> del L2[0:2] #刪除列表多個元素
>>> L2
['F']
```
* 清空列表
```
>>> L2.clear()
>>> L2
[]
```
### 循環+枚舉
使用for循環即可將列表中的每個元素循環打印出來,如果要同時打印元素及其索引,可以使用`enumerate`函數進行枚舉后打印
列表`L2=['A','B','C','A','F','D']`
* 循環打印每個元素
```
>>> for i in L2:
... print(i)
...
A
B
C
A
F
D
```
* 循環打印元素及其索引`enumerate`1
枚舉函數可以將元素及其索引作為一個小列表打印出來
```
>>> for i in enumerate(L2):
... print(i)
...
(0, 'A')
(1, 'B')
(2, 'C')
(3, 'D')
```
* 循環打印元素及其索引`enumerate`1
如果想讓元素和索引分開打印,可以用兩個變量來循環
```
for i,n in enumerate(L2):
... print(i,n)
0 A
1 B
2 C
3 A
4 F
5 D
```
### 排序+反轉
列表排序使用sort方法,但被排序的列表中不能同時有數字和字符串,否則會報錯,排序順序是按ASCII碼進行的.
列表`L2=['a','A','@','!','B','b']`
* 排列
```
>>> L2.sort()
>>> L2
['!', '@', 'A', 'B', 'a', 'b']
```
* 反轉
對列表當前順序進行反轉,可配置排序做逆序排序
```
>>> L2.reverse()
>>> L2
['b', 'a', 'B', 'A', '@', '!']
```
### 等于+拷貝
列表`L2=['A','B','C','D']`
* 等于`=`
兩個列表相等和兩個字符串相等不一樣,源列表的內容改變會影響新列表,這是因為列表有一個內存地址,列表中的每個元素也有一個內存地址,列表指向了這每一個元素的地址,所以改變源列表的值時,該列表對于的內存地址實際未變化,變化的是該元素再指向的內存地址
```
>>> L3=L2
>>> L2[0]='X'
>>> L2
['X', 'B', 'C', 'D']
>>> L3
['X', 'B', 'C', 'D']
```
* 拷貝`copy`
為了讓兩個列表不互相影響,就需要用到`copy`方法,可以讓新列表使用新內存地址
```
>>> L2=['A','B','C','D']
>>> L3=L2.copy()
>>> L2[0]='X'
>>> L2
['X', 'B', 'C', 'D']
>>> L3
['A', 'B', 'C', 'D']
```
* 深度`copy`
其實這種copy也只是淺copy,如果列表中有子列表的話,仍然是同一個內存地址
如果要用完全復制,就要導入`copy`工具箱,然后使用里面的`deepcopy`方法
- 基礎部分
- 基礎知識
- 變量
- 數據類型
- 數字與布爾詳解
- 列表詳解list
- 字符串詳解str
- 元組詳解tup
- 字典詳解dict
- 集合詳解set
- 運算符
- 流程控制與循環
- 字符編碼
- 編的小程序
- 三級菜單
- 斐波那契數列
- 漢諾塔
- 文件操作
- 函數相關
- 函數基礎知識
- 函數進階知識
- lambda與map-filter-reduce
- 裝飾器知識
- 生成器和迭代器
- 琢磨的小技巧
- 通過operator函數將字符串轉換回運算符
- 目錄規范
- 異常處理
- 常用模塊
- 模塊和包相關概念
- 絕對導入&相對導入
- pip使用第三方源
- time&datetime模塊
- random隨機數模塊
- os 系統交互模塊
- sys系統模塊
- shutil復制&打包模塊
- json&pickle&shelve模塊
- xml序列化模塊
- configparser配置模塊
- hashlib哈希模塊
- subprocess命令模塊
- 日志logging模塊基礎
- 日志logging模塊進階
- 日志重復輸出問題
- re正則表達式模塊
- struct字節處理模塊
- abc抽象類與多態模塊
- requests與urllib網絡訪問模塊
- 參數控制模塊1-optparse-過時
- 參數控制模塊2-argparse
- pymysql數據庫模塊
- requests網絡請求模塊
- 面向對象
- 面向對象相關概念
- 類與對象基礎操作
- 繼承-派生和組合
- 抽象類與接口
- 多態與鴨子類型
- 封裝-隱藏與擴展性
- 綁定方法與非綁定方法
- 反射-字符串映射屬性
- 類相關內置方法
- 元類自定義及單例模式
- 面向對象的軟件開發
- 網絡-并發編程
- 網絡編程SOCKET
- socket簡介和入門
- socket代碼實例
- 粘包及粘包解決辦法
- 基于UDP協議的socket
- 文件傳輸程序實戰
- socketserver并發模塊
- 多進程multiprocessing模塊
- 進程理論知識
- 多進程與守護進程
- 鎖-信號量-事件
- 隊列與生產消費模型
- 進程池Pool
- 多線程threading模塊
- 進程理論和GIL鎖
- 死鎖與遞歸鎖
- 多線程與守護線程
- 定時器-條件-隊列
- 線程池與進程池(新方法)
- 協程與IO模型
- 協程理論知識
- gevent與greenlet模塊
- 5種網絡IO模型
- 非阻塞與多路復用IO實現
- 帶著目標學python
- Pycharm基本使用
- 爬蟲
- 案例-爬mzitu美女
- 案例-爬小說
- beautifulsoup解析模塊
- etree中的xpath解析模塊
- 反爬對抗-普通驗證碼
- 反爬對抗-session登錄
- 反爬對抗-代理池
- 爬蟲技巧-線程池
- 爬蟲對抗-圖片懶加載
- selenium瀏覽器模擬