第8天 堆栈与队列 集合 文件管理 字符编码

队列与堆栈
队列

先进先出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 = {
    
    112.1"XXX", (1, 2, 3,)}
不能放字典,列表
s={
    
    111111112233}

集合找重案例

案例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 = {
    
    123}
s2 = {
    
    1234}
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程序三个阶段中23阶段有可能会出现的乱码问题


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、编码与解码必须参照同一张字符编码表

猜你喜欢

转载自blog.csdn.net/Yosigo_/article/details/111631133