数据容器
一、什么是数据容器
基本介绍
1.数据容器是一种数据类型,有些地方也简称为容器/collections
2.数据容器可以存放多个数据,每一个数据也被称为一个元素
3.存放的数据/元素可以是任意类型
4.简单的说,数据容器就是一种可以存放多个数据/元素的数据类型
分类
-
列表(list)
-
元组(tuple)
-
字符串(str)
-
集合(set)
-
字典(dict)
二、列表
基本介绍
1.列表可以存放多个不同类型数据,即:列表就是一列数据(多个数据)
2.列表也是一种数据类型
列表的定义
创建一个列表,只要用逗号分隔的不同的数据项使用方括号括起来即可
list1 = [100,200,300,400,500]
list2 = ['red','blue','green']
列表内存图

列表的使用
列表名[索引]
索引是从0开始计算的
列表的遍历
将列表的每个元素依次取出,进行处理的操作
注意事项和细节
1.如果我们需要一个空列表,可以通过[],或者list()方式来定义
2.列表的元素可以有多个,而且数据类型没有限制,允许有重复元素,并且是有序的
3.列表的索引/下标是从0开始的
4.列表索引必须在指定范围内使用,否则报:IndexError:list index out of range
5.索引也可以从尾部开始,最后一个元素的索引为-1,往前一位为-2,以此类推

6.通过列表[索引]=新值,对数据进行更新,使用列表.append(值)方法来添加元素,使用del语句来删除列表的元素,注意不能超出有效索引范围
list_a.append("123")
del list_a[1]
7.列表是可变序列(要注意其使用特点)
# 列表的元素是可以修改的,修改后,列表变量指向地址不变,只是数据内容变化
list1 = [1, 2.1, 4.2]
print(f"list: {list1} 地址:{id(list1)}")
list1[2] = 5.6 # 可以修改
print(f"list: {list1} 地址:{id(list1)}")

列表生成式
列表生成式就是生成列表的公式
基本语法
[列表元素的表达式 for 自定义变量 in 可迭代对象]
# 列表生成式
list1 = [ele * 2 for ele in range(1, 8)] # [2, 4, 6, 8, 10, 12, 14]
print(list1)
list2 = [ele + ele for ele in "李奕"] # ['李李', '奕奕']
print(list2)
三、元组
元组是不可变序列,通常用于储存异构数据的多项集(例如由enumerate()内置函数产生的二元组)。元组也被用于需要同构数据的不可变序列的情况(例如允许存储到set或dict的实例)
基本介绍
1.元组(tuple)可以存放多个不同类型元素
tuple不可变是指当你创建了tuple的时候,他就不能改变了,也就是说它没有append()、insert()这样的方法,但它也有获取某个索引值的方法,但是不能重新赋值。
2.元组也是一种数据类型
元组的定义
创建一个元组,只要把逗号分隔的不同的数据项,使用圆括号括起来即可
tuple_a = (100,200,300,400,500)
tuple_b = ('red','green','blue','yellow','white','black')
元组的使用
元组使用语法
元组名[索引]
注意事项和细节
1.如果我们需要一个空元组,可以通过(),或者tuple()方法来定义
tuple_a = ()
tuple_b = tuple()
2.元组的元素可以有多个,而且数据类型没有限制(甚至可以嵌套元组),允许有重复元素,并且是有序的
3.元组是不可变序列(要注意其使用特点)
# 元组的元素是不能修改的
tuple_e = (1,2.1,'hello')
# tuple_e = 'python' # 不能修改
4.可以修改元组内list的内容(包括修改、增加、删除等)
tuple_f = (1, 2.1, 'hello', ['jack', 'python', 'tom'])
# 修改
tuple_f[3][0] = 'sss' # 可以修改,改变的是列表的元素
# tuple_f[3] = [10, 20] # 不可以操作,这样就改变的元组的元素
5.索引也可以从尾部开始,最后一个元素的索引为-1,往前一位为-2
6.定义只有一个元素的元组,需要带上逗号
tuple_h = (100,)
# tuple_h = (100) # python 会认为这样的tuple_h是一个int类型
7.有了列表,为什么还要提供元组这样的数据类型
- 在项目中,尤其是多线程环境中,有经验的程序员会考虑使用不变对象(一方面因为对象状态不能修改,所以可以避免由此引起的不必要的程序错误;另一方面一个不变对象自动就是线程安全的,这样就可以省掉处理同步化的开销。可以方便的被共享访问)。所以,如果不需要对元素进行增删改的情况下,可以考虑使用元组。
- 元组在创建时间和占用的空间上面都优于列表
- 元组能够对不需要修改的数据写保护
四、字符串
基本介绍
1.在python中处理文本数据是使用str对象,也称为字符串。字符串是由Unicode码位构成的不可变序列
- Unicode码是一种字符编码
- ord()返回单个字符对应的Unicode编码值
2.字符串字面值有三种写法
- 单引号:‘允许包含有"双"引号’
- 双引号:“允许嵌入’单’引号”
- 三重引导:‘’‘三重单引号’‘’,“”“三重双引号”“”,使用三重引号的字符串可以跨越多行——其中所有的空白字符都将包含在该字符串字面值中
3.字符串是字符的容器,一个字符串可以存放多个字符
字符串比较
1.运算符:>,>=,<,<=,==,!=
2.比较规则:首先比较两个字符串中的第一个字符,如果相等则继续比较下一个字符,依次比较下去,直到两个字符串中的字符不相等时,其比较结果就是两个字符串的比较结果,两个字符串中的所有后续字符将不再被比较
3.比较原理:两个字符进行比较时,比较的是其ordinal value(原始值/码值),调用内置函数ord()可以得到指定字符的ordinal value。与内置函数ord对应的是内置函数chr,调用内置函数chr时指定ordinal value可以得到其对应的字符
注意事项
字符串是不可变序列,不能修改
在python中,字符串长度没有固定的限制,取决于计算机内存大小
五、切片
基本介绍
1.什么是切片:从一个序列中,取出一个子序列,在实际开发中,程序员经常对序列进行切片操作
2.什么是序列:序列是指,内容连续、有序,可使用索引的一类数据容器
3.列表、元组、字符串均可视为序列
基本语法
序列[起始索引:结束索引:步长]
1.表示从序列中,从指定的起始索引开始,按照指定的步长,依次取出元素,到指定结束索引为止,截取到一个新的序列
2.切片操作是前闭后开,也就是[起始索引:结束索引),即截取的子序列,包括起始索引,但是不包括结束索引的部分
3.步长表示,依次取出元素的间隔
- 步长为1:一个一个的取出元素
- 步长为2:每次跳过一个元素取出
- 步长为N:每次跳过N-1个元素取出
注意事项和使用细节
1.起始索引不写,默认为零;结束索引不写,默认为截取到结尾;步长如果不写,默认为1。
2.步长为负数,表示反向取,同时注意起始索引和结束索引也要反向标记。
3.切片操作并不会影响原序列,而是返回了一个序列。
六、集合
基本介绍
1.python支持集合这种数据类型,集合是由不重复元素组成的无序容器。
- 不重复元素:简单的说就是集合中不会有相同的元素
- 无序:集合中元素取出的顺序,和你定义时元素顺序并不能保证一致
2.集合对象支持合集、交集、差集等数学运算
3.既然有列表、元组这些数据容器,为什么还提供集合这样的数据类型
在项目中,我们可能有这样的需求:需要记录一些数据,而这些数据必须保证是不重复的,而且数据的顺序并没有要求,我们就可以考虑使用集合。
列表、元组的元素是可以重复,且有序。
集合的定义
创建一个集合,只要用逗号分隔的不同的数据项,并使用{}括起来即可
注意事项和使用细节
1.集合是由不重复元素组成的无序容器
2.集合不支持索引
3.由于集合不支持索引,所以对集合进行遍历不支持while,只支持for
4.创建空集合只能用set(),不能用{},{}创建的是空字典
集合生成式
1.集合生成式就是“生成集合的公式”
2.基本语法
{集合元素的表达式 for 自定义变量 in 可迭代对象}
{ele * 2 for ele in range(1,6)}
集合生成式和列表生成式的区别在于,集合生成式使用{},而列表生成式使用[]
七、字典
基本介绍
1.字典(dict)也是一种常用的python数据类型,其他语言可能把字典称为联合内存或联合数组
2.字典是一种映射类型,非常适合处理通过xx查询yy的需求,这里的xx我们称为key(键/关键字),这里的yy我们称为value(值),即key——Value的映射关系
字典的定义
创建一个字典,只要把逗号分隔的不同的元素,用{}括起来即可,存储的元素是一个个的:键值对
注意事项和使用细节
1.字典的key(关键字)通常是字符串或数字,Value可以是任意数据类型
2.字典不支持索引,会报KeyError
3.既然字典不支持索引,所以对字典进行遍历不支持while,只支持for,注意直接对字典进行遍历,遍历得到的是key
# 遍历dict的方式
dict_ = {'one': 1, 'two': 2, 'three': 3}
# 方法一:依次取出key,再通过dict[key]取出对应的value
for key in dict_:
print(key, dict_[key])
# 方法二:依次取出value
for value in dict_.values():
print(value)
# 方法三:依次取出key-value
for key, value in dict_.items():
print(key, value)
4.创建空字典可以通过{},或者dict()
dict_ = {}
dict_ = dict()
5.字典的key必须是唯一的,如果指定了多个相同的key,后面的键值对会覆盖前面的
字典生成式
内置函数zip()
zip()可以将可迭代的对象作为参数,将对象中对应的元素打包成一个元组,返回由这些元组组成的列表
字典生成式基本语法:
{字典key的表达式:字典value的表达式 for 表示key的变量, 表示value的变量 in zip(可迭代对象,可迭代对象)}
books = ['红楼梦', '三国演义', '水浒传', '西游记']
authors = ['曹雪芹', '罗贯中', '施耐庵', '吴承恩']
dict_ = {author:book for author, book in zip(authors, books)}
print(dict_) # {'曹雪芹': '红楼梦', '罗贯中': '三国演义', '施耐庵': '水浒传', '吴承恩': '西游记'}
八、list、tuple、set、dict传参机制
# list
print("--------------list---------")
def f1(my_list):
print(f"②my_list:{my_list},地址为:{id(my_list)}")
my_list[0] = 'iii'
print(f"③my_list:{my_list},地址为:{id(my_list)}")
my_list = [1, 2, 3, 4, 5]
print(f"①my_list:{my_list},地址为:{id(my_list)}")
f1(my_list)
print(f"④my_list:{my_list},地址为:{id(my_list)}")
# tuple
# 元组是不可变数据类型
# set
print("--------------set---------")
def f1(my_set):
print(f"②my_set:{my_set},地址为:{id(my_set)}")
my_set.add('iii')
print(f"③my_set:{my_set},地址为:{id(my_set)}")
my_set = {1, 2, 3, 4, 5}
print(f"①my_set:{my_set},地址为:{id(my_set)}")
f1(my_set)
print(f"④my_set:{my_set},地址为:{id(my_set)}")
# dict
print("--------------dict---------")
def f1(my_dict):
print(f"②my_dict:{my_dict},地址为:{id(my_dict)}")
my_dict[6]=('iii')
print(f"③my_dict:{my_dict},地址为:{id(my_dict)}")
my_dict = {1:'one', 2:'two', 3:'three', 4:'four', 5:'five'}
print(f"①my_dict:{my_dict},地址为:{id(my_dict)}")
f1(my_dict)
print(f"④my_dict:{my_dict},地址为:{id(my_dict)}")
小结
1.python数据类型主要有整数int/浮点数float/字符串str/布尔值bool/元组tuple/列表list/字典dict/集合set,数据类型分为两个大类,一种是可变数据类型;一种是不可变数据类型
2.可变数据类型和不可变数据类型
- 可变数据类型:当该数据类型的变量的值发生了变化,如果它的内存地址不变,那么这个数据类型就是可变数据类型
- 不可变数据类型:当该数据类型的变量的值发生了变化,如果它的内存地址变了,那么这个数据类型就是不可变数据类型
3.python的数据类型
- 不可变数据类型:数值类型(int,float)、bool、str、tuple
- 可变数据类型:list、set、dict

1008

被折叠的 条评论
为什么被折叠?



