Python数据容器

列表(list)、元组(tuple)、字符串(str)、集合(set)、字典(dict)

1. 数据容器:list(列表)

1.1 列表的定义

基本语法:

python 在容器中请求另一个容器的服务_元组


列表内的每一个数据,称之为元素

  • 以 [] 作为标识
  • 列表内每一个元素之间用, 逗号隔开

1.2 列表的定义方式

python 在容器中请求另一个容器的服务_数据_02


注意:
列表可以一次存储多个数据,且可以为不同的数据类型,支持嵌套

1.3 列表的下标(索引) - 反向

或者,可以反向索引,也就是从后向前:从-1开始,依次递减(-1、-2、-3…)

python 在容器中请求另一个容器的服务_数据_03


如图,从后向前,下标索引为:-1、-2、-3,依次递减:

python 在容器中请求另一个容器的服务_数据_04

1.4 嵌套列表的下标(索引)

如果列表是嵌套的列表,同样支持下标索引

python 在容器中请求另一个容器的服务_元组_05


如下案例:

python 在容器中请求另一个容器的服务_字符串_06

1.5 列表的常用功能(方法)

  • 查找某元素的下标
    功能:查找指定元素在列表的下标,如果找不到,报错ValueError。
    语法:列表.index(元素)
  • python 在容器中请求另一个容器的服务_数据_07

  • 修改特定位置(索引)的元素值
    语法:列表[下标] = 值 可以使用如上语法,直接对指定下标(正向、反向下标均可)的值进行重新赋值(修改)。
  • python 在容器中请求另一个容器的服务_字符串_08

  • 插入元素
    语法:列表.insert(下标, 元素),在指定的下标位置,插入指定的元素。
  • python 在容器中请求另一个容器的服务_python_09

  • 追加元素
    语法:列表.append(元素),将指定元素,追加到列表的尾部
  • python 在容器中请求另一个容器的服务_元组_10

  • 追加元素方式2
    语法:列表.extend(其它数据容器),将其它数据容器的内容取出,依次追加到列表尾部。
  • python 在容器中请求另一个容器的服务_字符串_11

  • 删除元素
    语法1: del 列表[下标] 语法2:列表.pop(下标)
  • python 在容器中请求另一个容器的服务_元组_12

  • 删除某元素在列表中的第一个匹配项
    语法:列表.remove(元素)
  • python 在容器中请求另一个容器的服务_数据_13

  • 清空列表内容
    语法:列表.clear()
  • python 在容器中请求另一个容器的服务_元组_14

  • 统计某元素在列表内的数量
    语法:列表.count(元素)
  • python 在容器中请求另一个容器的服务_数据_15

  • 统计列表内元素个数
    语法:len(列表) 可以得到一个int数字,表示列表内的元素数量。
  • python 在容器中请求另一个容器的服务_数据_16

python 在容器中请求另一个容器的服务_字符串_17

1.6 列表的特点

  • 可以容纳多个元素(上限为2**63-1、9223372036854775807个)
  • 可以容纳不同类型的元素(混装)
  • 数据是有序存储的(有下标序号)
  • 允许重复数据存在
  • 可以修改(增加或删除元素等)

2. list(列表)的遍历

2.1 列表的遍历 - for循环

python 在容器中请求另一个容器的服务_字符串_18

2.2 列表的遍历 - while循环

python 在容器中请求另一个容器的服务_字符串_19

3. 数据容器:tuple(元组)

元组同列表一样,都是可以封装多个、不同类型的元素在内。但最大的不同点在于:元组一旦定义完成,就不可修改。所以,当我们需要在程序内封装数据,又不希望封装的数据被篡改,那么元组就非常合适了。

3.1 定义元组

元组定义:定义元组使用小括号,且使用逗号隔开各个数据,数据可以是不同的数据类型。

语法如下:

python 在容器中请求另一个容器的服务_数据_20

举例如下:

python 在容器中请求另一个容器的服务_python_21


python 在容器中请求另一个容器的服务_python_22

注意:元组只有一个数据,这个数据后面要添加逗号

3.2 元组的相关操作

python 在容器中请求另一个容器的服务_python_23


注意:

元组由于不可修改的特性,所以其操作方法非常少。

3.3 元组的相关操作 - 注意事项

  • 不可以修改元组的内容,否则会直接报错
  • python 在容器中请求另一个容器的服务_元组_24

  • 可以修改元组内的list的内容(修改元素、增加、删除、反转等)
  • python 在容器中请求另一个容器的服务_数据_25

  • 不可以替换list为其它list或其它类型
  • python 在容器中请求另一个容器的服务_字符串_26

3.4 元组的特点

  • 可以容纳多个数据
  • 可以容纳不同类型的数据(混装)
  • 数据是有序存储的(下标索引)
  • 允许重复数据存在
  • 不可以修改(增加或删除元素等)
  • 支持for循环

多数特性和list一致,不同点在于不可修改的特性。

4. 数据容器:str(字符串)

4.1 字符串的说明

和其它容器如:列表、元组一样,字符串也可以通过下标进行访问。从前向后,下标从0开始,从后向前,下标从-1开始

python 在容器中请求另一个容器的服务_python_27


同元组一样,字符串是一个无法修改的数据容器

4.2 字符串常用操作汇总

python 在容器中请求另一个容器的服务_元组_28

4.3 字符串的特点

作为数据容器,字符串有如下特点:

  • 只可以存储字符串
  • 长度任意(取决于内存大小)
  • 支持下标索引
  • 允许重复字符串存在
  • 不可以修改(增加或删除元素等)
  • 支持for循环

5. 数据容器的切片

序列是指:内容连续、有序,可使用下标索引的一类数据容器。列表、元组、字符串,均可以可以视为序列。

序列的典型特征就是:有序并可用下标索引,字符串、元组、列表均满足这个要求。

5.1 序列的常用操作 - 切片

序列支持切片,即:列表、元组、字符串,均支持进行切片操作。
切片:从一个序列中,取出一个子序列

语法:序列[起始下标:结束下标:步长]

表示从序列中,从指定位置开始,依次取出元素,到指定位置结束,得到一个新序列。

  • 起始下标表示从何处开始,可以留空,留空视作从头开始
  • 结束下标(不含)表示何处结束,可以留空,留空视作截取到结尾
  • 步长表示,依次取元素的间隔
  • 步长1表示,一个个取元素
  • 步长2表示,每次跳过1个元素取
  • 步长N表示,每次跳过N-1个元素取
  • 步长为负数表示,反向取(注意,起始下标和结束下标也要反向标记

注意:
此操作不会影响序列本身,而是会得到一个新的序列(列表、元组、字符串)。

5.2 序列的切片演示

python 在容器中请求另一个容器的服务_python_29


python 在容器中请求另一个容器的服务_元组_30

6. 数据容器:set(集合)

6.1 基本语法:

python 在容器中请求另一个容器的服务_python_31


和列表、元组、字符串等定义基本相同:

  • 列表使用:[]
  • 元组使用:()
  • 字符串使用:“”
  • 集合使用:{}

6.2 集合的常用操作

python 在容器中请求另一个容器的服务_数据_32

6.3 集合的特点

  • 可以容纳多个数据
  • 可以容纳不同类型的数据(混装)
  • 数据是无序存储的(不支持下标索引)
  • 不允许重复数据存在
  • 可以修改(增加或删除元素等)
  • 支持for循环

7. 数据容器:dict(字典、映射)

7.1 字典的定义

字典的定义,同样使用{},不过存储的元素是一个个的:键值对,如下语法:

python 在容器中请求另一个容器的服务_数据_33

7.2 循环字典

方法1:循环key
```python
scores = {'zhangsan':98, 'lisi':89, 'maishu':96}

for name in scores:
  print(f'{name}:{scores[name]}')

```
默认情况下,循环字典,`其实是循环的字典的keys`,所以name就是一个个key。如果需要访问value,`可以通过scores[name]`来取用。

和下面效果一样:

for name in scores.keys():
  print(f'{name}:{scores[name]}')
方法2:循环key和value
for name, score in scores.items():
  print(f'{name}:{score}')
方法3:打印序号
scores = {'zhangsan':98, 'lisi':89, 'maishu':96}

for i, (name, score) in enumerate(scores.items()):
   print(i, name, score)

先用items()函数转成元组的列表,再使用enumerate函数加上序号。
注意,因为是元组,for的变量中一定要加上括号:i, (name, score)。Python只会做简单的自动开包,这里还有个变量i,它就不会自动开包,它只是单个变量元组,需要加上括号。

7.3 字典的常用操作

python 在容器中请求另一个容器的服务_元组_34

7.4 字典的特点

  • 可以容纳多个数据
  • 可以容纳不同类型的数据
  • 每一份数据是KeyValue键值对
  • 可以通过Key获取到Value,Key不可重复(重复会覆盖)
  • 不支持下标索引
  • 可以修改(增加或删除更新元素等)
  • 支持for循环,不支持while循环

8. 数据容器的通用操作

8.1 数据容器对比总结

数据容器可以从以下视角进行简单的分类:
  • 是否支持下标索引
    支持:列表、元组、字符串 - 序列类型
    不支持:集合、字典 - 非序列类型
  • 是否支持重复元素:
    支持:列表、元组、字符串 - 序列类型
    不支持:集合、字典 - 非序列类型
  • 是否可以修改
    支持:列表、集合、字典
    不支持:元组、字符串
数据容器特点对比

python 在容器中请求另一个容器的服务_python_35

基于各类数据容器的特点,它们的应用场景如下:
  • 列表:一批数据,可修改、可重复的存储场景
  • 元组:一批数据,不可修改、可重复的存储场景
  • 字符串:一串字符串的存储场景
  • 集合:一批数据,去重存储场景
  • 字典:一批数据,可用Key检索Value的存储场景

8.2 数据容器的通用统计功能

python 在容器中请求另一个容器的服务_字符串_36

8.3 容器的通用转换功能

python 在容器中请求另一个容器的服务_python_37

8.4 容器通用排序功能

python 在容器中请求另一个容器的服务_字符串_38

8.5 容器通用功能总览

python 在容器中请求另一个容器的服务_python_39

Python函数进阶

1 函数多返回值

python 在容器中请求另一个容器的服务_字符串_40

  • 按照返回值的顺序,写对应顺序的多个变量接收即可
  • 变量之间用逗号隔开
  • 支持不同类型的数据return

2 函数多种传参方式

2.1 函数参数种类

使用方式上的不同, 函数有4中常见参数使用方式:

  • 位置参数
  • 关键字参数
  • 缺省参数
  • 不定长参数
位置参数

位置参数:调用函数时根据函数定义的参数位置来传递参数。

python 在容器中请求另一个容器的服务_python_41

注意:
传递的参数和定义的参数的顺序及个数必须一致。

关键字参数

关键字参数:函数调用时通过“键=值”形式传递参数

作用: 可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求。

python 在容器中请求另一个容器的服务_数据_42


注意:

函数调用时,如果有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序。

缺省参数

缺省参数:缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传该默认参数的值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调用)。

作用: 当调用函数时没有传递参数, 就会使用默认是用缺省参数对应的值

python 在容器中请求另一个容器的服务_字符串_43


注意:

函数调用时,如果为缺省参数传值则修改默认参数值, 否则使用这个默认值。

不定长参数

不定长参数:不定长参数也叫可变参数. 用于不确定调用的时候会传递多少个参数(不传参也可以)的场景.
作用: 当调用函数时不确定参数个数时, 可以使用不定长参数。

不定长参数的类型:

  • 位置传递
  • 关键字传递
位置传递(元组)

python 在容器中请求另一个容器的服务_元组_44

注意:
传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组(tuple),args是元组类型,这就是位置传递。

关键字传递(字典)

python 在容器中请求另一个容器的服务_python_45


注意:

参数是“键=值”形式的形式的情况下, 所有的“键=值”都会被kwargs接受, 同时会根据“键=值”组成字典.

3 匿名函数

3.1 函数作为参数传递

python 在容器中请求另一个容器的服务_字符串_46

3.2 lambda匿名函数

语法如下:

lambda 传入参数:函数体(一行代码)

python 在容器中请求另一个容器的服务_字符串_47