队列与堆栈
队列
先进先出FIFO
l=[ ]
l.append(11) [11]
l.append(22) [11,22]
l.append(33) [11,22,33]
l.pop(0) 11
l.pop(0) 22
l.pop(0) 33
堆栈
先进后出LIFO
l=[ ]
l.append(11) [11]
l.append(22) [11,22]
l.append(33) [11,22,33]
l.pop(-1) 33
l.pop(-1) 22
l.pop(-1) 11
集合
工厂函数set
用途:去重 关系运算
1.集合去重无法保证顺序
2.只能针对不可变元素
定义方式:在{
}内用逗号分隔开多个元素,集合内的元素特点有三个
集合元素必须是不可变类型
集合内元素不能重复
集合内元素无序
s = {
11,2.1,"XXX", (1, 2, 3,)}
不能放字典,列表
s={
11,11,11,11,22,33}
集合找重案例
案例1
pythons = ["tom", "jack", "alex", "egon", "lxx"]
linux = ["lili", "sasa", "egon", "lxx", "jay"]
l = [ ]
for name in pythons:
if name in linux:
l.append(name)
print(l)
案例2
RES = set("hello")
print(RES,tpye(RES)) #打印结果为{
'e', 'h', 'o', 'l'} <class 'set'>
names = ["egon","lxx","LILI","egon","egon"]
print(set(names)) # {
'LILI', 'egon', 'lxx'}p
print(list(set(names))) # ['lxx', 'LILI', 'egon']
集合常用去重案例
students_info = [
{
"name": "nana", "age": 18, "gender": "girl"},
{
"name": "dada", "age": 19, "gender": "male"},
{
"name": "xiaoming", "age": 18, "gender": "male"},
{
"name": "nana", "age": 18, "gender": "girl"},
{
"name": "nana", "age": 18, "gender": "girl"},
]
l = [ ]
for n in students_info:
if n not in l:
l.append(n)
print(l)
定义空集合
s = set( )
print(type(s)) # <class 'set'>
集合常用操作的运算
pythons = ["tom", "jack", "alex", "egon", "lxx"]
linuxs = ["lili", "sasa", "egon", "lxx", "jay"]
交集:取两个集合的共同部分,即报名pythons又报名linux的学生
print(pythons&linuxs)
并集:两个集合并到一起的,所有学生的姓名
print(pythons|linuxs)
差集:一个集合减掉另外一个集合的共同部分
print(pythons-linuxs) 只学了python的学生姓名
print(linuxs-pythons) 只学了Linux的学生姓名
交叉补集/对称差集:两个集合相减,然后再并到一起,取没有同时学两门课的学生
res = pythons^linuxs 原理:res=(pythons-linuxs)|(linux-pythons)
父子集合:当一个集合完全包含了另外一个集合,改集合才能称爹
s1 = {
1,2,3}
s2 = {
1,2,3,4}
print(s2 >= s1) 这种情况才能成立,比较的是包含关系
需要掌握的
s={
1,2,3}
s.update({
3,4,5}) #更新覆盖原集合,{
1, 2, 3, 4, 5}
s.add(4) #s 往集合里面加值{
1, 2, 3, 4}
s.remove(1) # 删除集合的指定元素{
2, 3},删除没有的元素会报错
s.discard(4) # 删除集合的指定元素{
2, 3}删除没有的元素不会报错
s.clear() # 全部删除 set()
s.pop() # 随机删除
s.copy # 复制所有元素
s={
1,2,3}
s1={
4,5,6}
print(s.isdisjoint(s1)) # 判断两个集合完全没有交集的集合,结果为True
总结:
存多个值
无序
集合内的元素不可变,集合本身可变类型
s={
1,2,3}
print(id(s)) # 6023960
s.add(4)
print(id(s)) # 6023960
文件管理
什么是文件
文件是操作系统提供给用户或者应用程序操作硬盘的一种机制
为何要用文件
读写文件就是存取硬盘
应用程序: open()
操作系统: 打开文件
计算机硬件: 硬盘空间
一个操作系统文件对应一个硬盘空间
如何用文件
打开文件
读 / 写
关闭文件
open(r"a\a.txt",mode = "rt", encoding = "UTF-8") # encoding是指定字符编码表的意思
windowsx系统要在前面加个"r"取消"\"的意义
open("/a/b/c/d.txt") # linux操作系统文件路径是以根开头
f = open(r"a.txt",mode = "rt", encoding = "UTF-8")
print(f) # <_io.TextIOWrapper name='a.txt' mode='rt' encoding='UTF-8'>
1.告诉操作系统打开一个文件、
2.定义了一个变量值f
f占用的是应用程序的内存空间对操作系统发请求,由操作系统去调用硬盘空间
f的值称为文件句柄,文件对象
对f的值发请求像是对操作系统打开的文件发请求
数据从硬盘调用到内存
res=f.read()
将文件从硬盘读入到内存后,要么读文件,要么写文件
print(res,type(res)) # 打印文件a的内容,字符串类型<class 'str'>
关闭文件:
f.close()
关闭操作系统的文件,f变量值还在应用程序里面占用这应用程序的内存,由pycharm软件的垃圾回收机制自动回收
注意操作系统不会自动关闭文件,会隔一段时间扫描一次文件
如果同时打开了多个文件关闭,达到上限后,其他文件就打不开了,会导致操作系统崩溃
with语法:
with 被称为上下文管理(with会自动帮关文件)
f = open(r"a.txt",mode = "rt",)
f1 = open(r"b.txt", mode="rt",)
with open(r"a.txt", mode="rt",)as f, \
open(r"b.txt", mode="rt",) as f1:
res = f.read()
通过with运行文件可以打开多个文件,顺序是先打开啊a.txt,再打开b.txt
f.read()一次性读完全部文件内容
with open(r"a.txt",mode="rt",encoding = "UTF-8")as f:
for line in f:
res=line.strip("\n").split(":")
print(res)
with open(r"a.txt", mode="rt", encoding="UTF-8")as f:
for line in f:
print(line, end="")
文件末尾有换行符,print自带换行符。可以通过end=" "取消换行
字符编码乱码问题
储备知识
运行python程序的三个步骤:python a.py
1、先启动python解释器
2、解释器会将文本文件a.py内容由硬盘读入内存
3、解释器会解释执行刚刚读入内存的内容,识别python语法
2、什么是字符编码
人类的字符-----------编码------------->数字
人类的字符<-----------解码-------------数字
编码与解码的过程必须参照字符编码表
3、为何要学习字符编码:
为了解决运行python程序三个阶段中2、3阶段有可能会出现的乱码问题
4、字符编码表发展史
一家独大:
ASCII:只能识别英文字符
8bit对应一个英文字符
天下大乱
GBK:汉字与英文
用2Bytes对应一个字符
Shift-JIS:日文与英文
Euc-KR:韩文与英文
分久必合
unicode:
1、万国字符
2、兼容老的字符编码表
2bytes对应一个字符
英文字符-----------》内存:ASCII格式的二进制------》硬盘:ASCII格式的二进制
中文字符、英文字符-----------》内存:gbk格式的二进制------》硬盘:gbk格式的二进制
日文字符、英文字符-----------》内存:shift-JIS格式的二进制------》硬盘:shift-JIS格式的二进制
万国字符-----------》内存:unicode格式的二进制------》硬盘:utf-8格式的二进制
日文字符、英文字符-----------》内存:unicode格式的二进制------》硬盘:shift-JIS格式的二进制
中文字符、英文字符-----------》内存:unicode格式的二进制------》硬盘:gbk格式的二进制
结论:
如何保证不乱码
1、编码与解码必须参照同一张字符编码表