[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浏览器模拟