Python基础(中)
最近这几天一边学习其他知识,一边又把Python的基础知识接着整理了一下,这次主要就是整理了Python中比较重要的几个数据结构,分别是列表、字典、元组和集合,作者认为这几块是比较容易让人产生困惑的,以及可能在后续的学习中会弄混淆,所以特别抽出来写一篇Python(中),后续还会接着整理最后下部分的基础知识。
11. 列表
11.1 为什么需要列表
- 变量可以存储一个元素,但是列表是一个“大容器”,可以存储N多个元素,程序可以方便地对这些数据进行整体操作
- 列表相当于其它语言中的数组
11.2 列表的创建
列表需要使用中括号[],元素之间使用英文的逗号进行分割
lst = ['大圣', '孙悟空']
列表的创建方式
- 直接使用中括号
lst = ['大圣', '孙悟空']
- 调用内置函数list()
lst2 = list(['大圣', '孙悟空'])
- 直接使用中括号
11.3 列表的特点
- 列表元素按照顺序有序排序
- 索引映射唯一一个数据
- 列表可以存储重复数据
- 列表可以任意数据类型混存
- 根据需要动态分配和回收内存
11.4 列表的查询操作
- 获取列表中指定元素的索引
index()
- 如查列表中存在
N
个相同元素,只返回相同元素中的第一个元素的索引 - 如果查询的元素在列表中不存在,则会抛出
ValueError
- 还可以在指定的
start
和stop
之间进行查找
下面用一个简单的代码例子来说明index()
方法查询的三个特点
1 |
|
- 获取列表中的单个元素
- 正向索引从
0
到N-1
举例:lst[0]
- 逆向索引从
-N
到-1
举例:lst[-N]
- 指定索引不存在时,会抛出
indexError
下面用一个简单的代码例子来说明获取单个元素的方法查询三个特点
1 |
|
- 获取列表中的多个元素
语法格式:列表名[start : stop : step]
- 切片的结果:原列表片段的拷贝
- 切片的范围:
[start, stop]
step
默认为1
:可以简写为[start: stop]
step
为正数的时候[: stop: step]
:切片的第一个元素默认是列表中的第一个元素[start: :step]
:切片的最后一个元素默认是列表的最后一个元素
step
为负数的时候[: stop: step]
:切片的第一个元素默认是列表中的最后一个元素[start: :step]
:切片的最后一个元素默认是列表的第一个元素
下面通过一个例子解释一下,如何获取列表中的多个元素,以及它们的不同形式写法
1 |
|
- 判断指定元素在列表中是否存在
- 元素
in
列表名 - 元素
not in
列表名
下面是一个例子说明如何判断指定元素是否在列表中存在
1 |
|
- 列表元素的遍历
for 迭代变量 in 列表名 :
下面是一个例子说明如何操作对列表元素的遍历
1 |
|
11.5 列表的增加操作
列表元素的增加操作
方法/其它 | 操作描述 |
---|---|
append() |
在列表的末尾添加一个元素 |
extend() |
在列表的末尾添加至少一个元素 |
insert() |
在列表的任意位置添加一个元素 |
切片 | 在列表的任意位置添加至少一个元素 |
下面用一个代码例子来说明上面四种添加方法的不同之处
1 |
|
11.6 列表的删除操作
方法/其它 | 操作描述 |
---|---|
remove() |
1. 一次删除一个元素 2. 重复元素只能删除第一个 3. 元素不存在抛出 ValueError |
pop() |
1. 删除一个指定索引位置上的元素 2. 指定索引不存在抛出 IndexError 3. 不指定索引,删除列表种最后一个元素 |
切片 | 一次至少删除一个元素 |
clear() |
清空列表 |
del |
删除列表 |
下面通过一个代码例子,来说明一下几种列表的删除操作的一些用法
1 |
|
11.7 列表元素的修改操作
- 为指定索引的元素赋予一个新值
- 为指定的切片赋予一个新值
下面是一个代码例子,来参考学习一下列表元素的两种修改操作
1 |
|
11.8 列表元素的排序操作
列表元素的排序操作,常见的有两种方式
- 调用
sort()
方法,列表中的所有元素默认按照从小到大的顺序进行排序,可以指定reverse=True
,进行降序排序 - 调用内置函数
sorted()
,可以指定reverse=True
,进行降序排序,原列表不发生改变
下面通过一个例子,了解一下两种不同函数进行排序操作的一些特点
1 |
|
11.9 列表生成式
列表生成式简称“生成列表的公式”
下面通过一段代码,加深对列表生成式的理解
1 |
|
由上述代码可见,其实真正决定
lst
的取值的就在于for
前面的表达式为多少,如果是i
,那就是range()
本身迭代的元素,如果是i*2
,那就要把迭代的元素全扩大2倍,就如注意事项说的一样,i*i
表示为列表元素的表达式。
12 字典
12.1 什么是字典
Python内置的数据结构之一,与列表一样是一个可变序列
- 可变就是指可以执行增删改操作
以键值对的方式存储数据,字典是一个无序的序列
scores = {'张山': 100, '李四': 98, '王五': 45}
- 他们分别由字典名、花括号、逗号、键、冒号、值一一对应组成
12.2 字典的原理
字典的实现原理
字典的实现原理与查字典类似,查字典是先根据部首或者拼音查找对应的页码,而Python中的字典是根据key
查找value
所在的位置
12.3 字典的创建与删除
- 字典的创建
- 最常用的方式:使用花括号
scores = {'张山': 100, '李四': 98, '王五': 45}
- 使用内置函数
dict()
dict(name = 'jack', age = 20)
下面通过一段代码,来了解一下
12.4 字典的查询操作
字典中元素的获取有两种方式
[]
——> 举例:scores['张三']
get()
方法 ——> 举例:scores.get('张三')
两种方法有着一些区别之处
[]
:如果字典中不存在指定的key
,抛出KeyError
异常get()
方法取值:如果字典中不存在指定的key
,并不会抛出KeyError
,而是返回None
,可以通过参数设置默认的value
,以便指定的key
不存在时返回
下面通过一段代码,了解一下字典的查询操作
1 |
|
12.5 字典元素的增、删、改操作
1. key的判断
key的判断 | 解释 | 举例 |
---|---|---|
in |
指定的key 在字典中存在返回True |
'张三' in scores |
not in |
指定的key 在字典中不存在返回True |
'Marry' not in scores |
1 |
|
2. 字典元素的删除
del scores['张三']
1 |
|
3. 字典元素的新增
scores['jack'] = 90
1 |
|
值得注意的是,字典元素的新增也可以作为修改来运行,只需把括号里面的键改成自己需要修改的元素,即可对他的value
进行修改
4. 获取字典视图的三个方法
keys()
——>获取字典中所有的key
values()
——>获取字典中所有value
items()
——>获取字典中所有key
,value
对
1 |
|
5. 字典元素的遍历
代码格式:
1 |
|
下面是一个代码例子,用来理解一下元素的遍历方法的使用
1 |
|
由代码例子可见,遍历的时候,获取
value
的值也是和上面的方法类似,可以直接使用[]
方法,也可以使用get()
方法。但是使用[]方法的时候可能会抛出异常,而get()
方法不会抛出异常,只会输出None
12.6 字典的特点
- 字典中的所有元素都是一个
key-value
对,key
不允许重复,value
可以重复 - 字典中的元素是无序的
- 字典中的
key
必须是不可变对象 - 字典也可以根据需要动态地伸缩
- 字典会浪费较大的内存,是一种使用空间换时间的数据结构
12.7字典推导式
items = ['Fruits', 'Books', 'Others'] prices = [96, 78, 85]
{'Fruits': 96,'Books': 78, 'Others': 85}
- 内置函数
zip()
- 用于将可迭代对象作为参数,将对象中对应的元素打包成一个元组,然后返回由这些元组组成的列表
1 |
|
根据上述代码的演示,可以发现,就是利用两个列表合并,用for循环遍历生成了一个字典,其中使用到了内置函数
zip()
,包括使用到了str.upper()
函数,这个函数的意思为将小写字母变成大写字母
13. 元组
13.1 什么是元组
t = ('Python', 'hello', 90)
元组:Python内置的数据结构之一,是一个不可变序列
不可变序列和可变序列
- 不可变序列:字符串、元组
- 不可变序列没有增删改的操作
- 可变序列:列表、字典
- 可变序列可以对序列执行增删改操作,对象地址不发生更改
- 不可变序列:字符串、元组
13.2 元组的创建方式
- 直接小括号
t = ('Python', 'hello', 90)
- 使用内置函数tuple()
t = tuple(('Python', 'hello', 90))
- 只包含一个元组的元素需要使用逗号和小括号
t = (10, )
下面是几段代码,来解释一下元组的创建方式
1 |
|
上面代码种也提到了一些注意事项,例如元组只有一个元素的时候,应该怎么创建,在后面加上逗号。另外,还提到了空列表、空字典、空元组的创建方式
13.3 元组的遍历
元组是可迭代对象,所以可以使用for in
进行遍历
1 |
|
13.4 为什么将元组设计成不可变序列
- 在多任务环境下,同时操作对象时不需要加锁
- 因此,在程序种尽量使用不可变序列
注意事项:
- 元组种存储的是对象的引用
- 如果元组中对象本身是不可对象,则不能再引用其他对象
- 如果元组种的对象是可变对象,则可变对象的引用不允许改变,但数据可以改变
下面是一段代码例子,用来说明一下注意事项中的两条
1 |
|
由此可见,如果元组对象中的是不可变对象,比如
10
,9
,那么他们就不能再引用其他对象,因为他们的id
是固定的,如果是t[1]
,[20, 30]
,本身是一个可变的列表,那么它的引用是不可变的,因为它的id
是固定的。但是可以再列表后面接着追加变量,例如append(100)
,此时它的id
仍然是没有变化
14. 集合
14.1 什么是集合
- Python语言提供的内置数据结构
- 与列表、字典一样都属于可变类型的序列
- 集合是没有value的字典
14.2 集合的创建
- 直接
{}
s = {'python', 'hello', 90}
- 使用内置函数
set()
下面通过一些代码例子,来了解一下集合的创建
1 |
|
14.3 集合的增删查改操作
1. 集合元素的判断操作
in
或者not in
1 |
|
2. 集合元素的新增操作
- 调用
add()
方法,一次添加一个元素 - 调用
update()
方法,至少添加一个元素
1 |
|
3. 集合元素的删除操作
- 调用
remove()
方法,一次删除一个指定元素,如果指定的元素不存在,则抛出KeyError
异常 - 调用
discard()
方法,一次删除一个指定元素,如果指定的元素不存在,不抛出异常 - 调用
pop()
方法,一次只删除一个任意元素 - 调用
clear()
方法,清空集合
1 |
|
14.4 集合之间的关系
- 两个集合是否相等
- 可以使用运算符
==
或者!=
进行判断
- 可以使用运算符
1 |
|
- 一个集合是否是另一个集合的子集
- 可以调用方法
issubset
进行判断 B
是A
的子集
- 可以调用方法
1 |
|
- 一个集合是否是另一个集合的超集
- 可以调用方法
issuperset
进行判断 A
是B
的超集
- 可以调用方法
1 |
|
- 两个集合是否没有交集
- 可以调用方法
isdisjoint
进行判断
- 可以调用方法
1 |
|
14.5 集合的数据操作
交集、并集、差集、对称差集
1 |
|
14.6 集合生成式
- 用于生成集合的公式
{i * i for i in range(1, 10)}
i*i
中的i
表示集合元素的表达式,第二个i是自定义变量,range
是可迭代对象
- 将
{}
修改为[]
就是列表生成式 - 没有元素生成式
1 |
|
15. 列表、字典、元组、集合总结
数据结构 | 是否可变 | 是否重复 | 是否有序 | 定义符号 |
---|---|---|---|---|
列表(list ) |
可变 | 可重复 | 有序 | [] |
元组(tuple ) |
不可变 | 可重复 | 有序 | () |
字典(dict ) |
可变 | key 不可重复value 可重复 |
无序 | {key: value} |
集合(set ) |
可变 | 不可重复 | 无序 | {} |
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!