内容回顾
列表在调用内置方法之后不是产生新的值,而是改变它的自身
1.统计列表内数据的个数
关键字:len
l1 = ['jason','lisa','kevin','tony','joker']
print(len(l1))
2.增
2.1 尾部追加一个数据
关键字:append() 括号内无论放什么数据类型,都会当一个整体追加
l1 = ['jason','lisa','kevin','tony','joker']
l1.append([1,2,3])
print(l1)
2.2 任何位置追加一数据
关键字:insert() 括号内不管放什么数据类型,也是会当一个整体追加
l1 = ['jason','lisa','kevin','tony','joker']
l1.insert(1,'插队')
print(li)
2.3扩展列表
方式一: for 循环
方式二: 使用 + 号
方式三: extend() 括号内必须是支持 for循环的数据类型
推荐使用第三种方式 底层原理就是 for循环加append方法
3.查询数据或修改
3.1 查询数据 通过索引即可
l1 = ['jason','joker','lisa','kevin''tony]
print(l1[0]) # jason
print(l1[0:2]) # ['jason','joker']
3.2 修改数据 把需要修改的数据值索引修改
4.删除数据
4.1 通用删除策略
关键字:del 索引修改
l1 = ['jason','joker','lisa','kevin''tony]
del l1[1]
print(l1)
4.2 指名道姓的删
关键字:remove() 括号内放入明确要删除的数据值
l1 = ['jason','joker','lisa','kevin''tony]
l1.remove('jason')
print(l1) # ['joker','lisa','kevin','tony']
4.3 先取出数据值 然后再删
关键字:pop() 什么都不放默认取出尾部数据值 然后再删
同时也可以通过索引取出数据值 然后再删除
l1 = ['jason','joker','lisa','kevin''tony]
res = l1.pop()
print(res)
print(l1)
5.查看数据值对应的索引值
关键字:index()
l1 = ['jason','joker','lisa','kevin''tony]
l1.index(2)
print(l1) # lisa
6.统计某个数据值出现的次数
关键字:count()
l1 = ['jason','jason','jason','tony','lisa']
l1.count('jason')
print(l1.count('jason')) # 3
7.排序
升序 关键字:sort
降序 关键字:sort(reverse = True)
8.翻转
关键字:reverse 前后跌倒
9.比较运算
l1 = [66,22]
l2 = [11,22,33,44,55]
print(l1 > l2) # True 按照第一个位置来比较
类型转换
字典很少涉及到类型转换 都是直接定义使用
1.字典内的K:V键值对是无序的 所以无法索引取值
2.取值操作
关键字:get
info = {'username': 'lisa','pwd': 11,'hobby': ['read', 'run']}
print(info.get('username'))
print(info.get('xxx'))
print(info.get('username','键不存在返回不存在'))
print(info.get('某某','键不存在返回不存在'))
3.统计字典内数据的个数
关键字:len
4.修改数据与新增
通过索引K 来修改
在没有K 的时候是增加
5.删除数据
方式一
关键字:del
info = {'username': 'lisa','pwd': 11,'hobby': ['read', 'run']}
del info['username']
print(info)
方式二
关键字:pop
info = {'username': 'lisa','pwd': 11,'hobby': ['read', 'run']}
res = info.pop('usermane')
print(info)
方式三
关键字:popitem
info.popitem
6.快速获取键、值、键值对数据
方式一
关键字:keys()
info = {'username': 'lisa','pwd': 11,'hobby': ['read', 'run']}
print(info.keys())
方式二
关键字:values()
info = {'username': 'lisa','pwd': 11,'hobby': ['read', 'run']}
print(info.values)
方式三
关键字:items()
info = {'username': 'lisa','pwd': 11,'hobby': ['read', 'run']}
print(info.items)
8.修改字典数据 键存在则是修改 不存在则是新增
关键字:updata
9.快速构造字典 给的值默认
关键字:fromkeys
10.键存在获取对应的数据值 键不存在设置并返回新的值
关键字:setdefault
支持 for循环的数据类型都可以转成元组
1.索引取值
2.统计元组内数据的个数 len
3.查与改
元组支持查看 不支持修改
类型转换
支持 for循环的 并且数据必须是不可变类型
1.定义空集合 set()
2.集合内数据必须是不可变类型(整型 浮点型 字符串 元组 布尔值)
3.集合自带去重功能
4.关系运算
& | ^ > <
1.可变的类型:list
值改变(内存方法) 内存地址可以不变
列表内置方法是修改自身,索引是可变类型
2.不可变的类型:str int float
值改变(内置方法) 内存地址肯定变
字符串的内置方法是产出一个新的数据 需要用另一个变量名接收 所以是不可变类型
什么是垃圾回收机制
在python中编辑会产生很多的数据值 当没有绑定变量名的数据值则会被当成垃圾回收
'''python会自动申请内存和释放空间'''
1.引用计数
当数据值身上计数不为0时表示还有用 不会被回收
当数据值身上计数为0时 则会被垃圾机制当成垃圾给回放
2.标记清除
专门用于解决循环引用的问题 将内存中所产生的数据值全部检查一遍 是否存在循环打上标记后一次性清除
3.分代回收
标记清除每隔一段时间就要把所以的数据排查一遍 资源消耗过大
为了减轻垃圾机制的资源损耗 所以开发了三代垃圾管理机制 越往下排查的的频率就越低
1.只有文本文件才有字符的概念
2.计算机内部存取的数据本质(二进制)
计算机其实只认识0和1
3.为什么我们在使用计算机的时候能随意敲出各国的文字
因为计算机不认识我们人家的语言 所以我们人类定义了一种数字的转换关系
4.转换关系不能随便改变 应该有统一的标准
字符编码表 记录了人类的字符与数据对应的关系
1.一家独大
计算机是由美国人发明的 美国人需要让计算机识别英文字符
ps:英文所有的字符加起来不超过127个(2的七次方)但是美国人考虑到后续可能会出现新的字符所以加了以备不时之需(2的八次方)
ASCII编码表:内部记录了英文字符与数字的对应关系 1bytes来储存字符
2.群雄割据
因为ASCII编码表只能表示英文不能表示中文,后来我们中国就开发了一套可以识别中文的编码表
GBK编码表:内部记录了中文字符、英文字符与数据的对应关系
2bytes起步储存中文(遇到生僻字会使用更多的字节)
1bytes储存英文
韩国所对应的编码表
EUS_kr编码表:内部记录了韩文、英文字符与数字的对应关系
日本所对应的编码表
shift_JIS编码表:内部记录了日文、英文字符与数字的对应关系
注意:此时各国的计算机文件文本无法直接交互 会出现乱码的情况
3.天下统一
万国码(unicde):兼容万国的字符
所有的字符都以2bytes起步储存
utf家族(针对unicde版本的优化):utf8
英文还是采用1bytes
其他统一采用3bytes
注:内存使用unicde 硬盘使用utf8
1.只有字符串可以参与编码与解码 其他数据类型需要先转换成字符串才可以
2.如何解决乱码
当初使用什么代码存的就使用什么代码来解
3.编码与解码
把人类的字符按照指定的编码转换成计算机能识别的数字
4.解释器层面
python2默认的编码是ASCII码
文件头
定义字符串:需要在字符串的前面加上u
为什么要这么做呢 因为python2的时候还没有发明出utf8 所有只能采取补救措施
python默认的编码就是utf8
1.文件操作
通过编写代码自动来操作文件读写
2.什么是文件
双击文件图标是从硬盘加载数据到内存
写文件之后保存其实就是将内存的数据刷到硬盘
文件其实就是操作系统暴露给用户操作计算机的快捷方式之一
3.如何使用代码操作文件
open('文件路径','读写模式','字符编码')
方法一:
f = open()
f.close()
方法二:
with open() as 变量名
子代码运行之后自动调用close()方法
4.针对文件路径可能有特殊含义字母与撬棍的组合
在字符串的前面加上字母'r'取消特殊含义
'''补充知识
1.with语法支持一次性打开多个文件
with open(r'a.txt','r',encoding='utf8') as f1, open(r'b.txt','r',encoding='utf8') as f2, open(r'c.txt','r'encoding='utf8') as f3...
2.补全python语法 但是不执行任何操作
pass (推荐使用)
... 不推荐使用
3.通常情况下英语单词的结尾如果加上了able表示该单词具备了描写能力
readable 具备读取内容的能力
writable 具备填写内容的能力
'''
1.r模式的使用 (默认的只读)
with open(r'a.txt','r'encoding='utf8') as f:
res = f.read()
print(res)
如果文件不存在时则会报错 文件存在时会打开等待读取
2.w模式的使用 只写
with open(r'b.txt','w'encoding='utf8') as f:
f.write('你们好鸭\n')
f.write('我是新来的\n')
当文件不存在时会创建一个空文件 文件存在时会清空文件内容等待填写新的内容
3.a模式的使用(只追加写)
with open(r'c.txt','a',encoding='utf8') as f:
f.write('你们好鸭\n')
f.write('我是新来的\n')
当文件不存在时会创建空文件 不会清空该文件里的内容 只会在文件的末尾等待填写新的内容
文本模式 t
rt,wt,at
1.只能操作文本文件
2.必须指定encoding参数
3.读写都是以字符串为单位
二进制模式 bytes
rb,wb,ab 必须自己指定 不能省略
1.能够操作所有类型的文件
2.不需要指定encoding参数
3.读写都是以bytes为单位
read()
readdline()
readdlines()
readable()
writable()
write()
writelines()
flush()
'''当文件数据比较大时,不建议一次性读取'''
可以使用 for循环读取 文件支持 for循环一次只读一行
for line in f:
print(line)
1.在文本模式下read的括号内数字是几就表示读多少个字节
with open(r'a.txt','r',encoding='utf8')as f:
data = f.read(3)
print(data)
2.在二进制模式下read的括号内数字是几就表示读多少个字节,英文是一个字节 中文是三个字节 括号内的数字不能大于小于字节 否则和报错
with open(r'a.txt','rb')as f:
data = f.read(3)
print(data.decode.('utf8'))
f.tell() 获取光标的移动的字节数
seek(offset,whence) 模式
offset 控制光标移动的位移量
whence模式0,1,2
0的参照物是从文件开头的位置
1的参照物是从光标当前所在的位置
2的参照物是从文件末尾的位置 应该倒着移动
注:1和2模式只能在二进制模式下使用 0无所谓
"""机械硬盘的存储数据原理
1.数据的修改 其实就是覆盖写
2.数据的删除 占有态跟自由态"""
修改方式一
覆盖写:先读取文件里的内容到内存 在内存中完成修改 之后w模式打开该文件写入
with open(r'a.txt','r',encoding='utf8')as f:
data = f.read()
new_data = data.replace('你好','不好')
with open(r'a.txt','w',encoding='utf8')as f1:
f1.write(new.data)
优点是只占用硬盘一块空间
缺点就是数据量比较大的时候会造成内存爆满
修改方式二
重命名:先将文件内容读取至内存 在内存中完成修改 之后在保存到另一个文件中 在将原来的文件删除 将新的文件重命名原文件
import os
with open('a.txt','r'encoding='utf8')as f,\
open('.a.txt.swap','w',encoding='utf8')as wrife_f:
for line in read_f:
wrife_f.write(line.replace('Sb','Nb'))
os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')
优点 不会造成内存溢出
缺点是可能会有那么一段时间需要占用两个硬盘空间 也可能是在内存没刷在硬盘