- 概念:
当数据值身上的引用计数不为0即变量绑定值不为零时,表示该数据值还有用,不会被删除。
当数据值身上的引用计数为0则会被垃圾回收机制回收。
- 缺陷:
2.标记清除容易被循环引用
- 概念:
用于解决循环引用问题,将内存中陈序产生的所有数据值全部检查一遍,对于存在循环引用的数据值做标记,最后统一清除。
- 缺陷:
3.分代回收标记清除每隔一段时间就需要将所有有数据重新排查一遍,资源消耗过大
- 概念:
为减轻垃圾回收机制的资源损耗,开发出三代管理:
初生代————青春代————老年代
- 缺陷:
(二)字符编码概述 1.字符编码简介越往下检测的频率越低,节省资源损耗!!!
2.字符编码发展史字符编码也称字集码,是把字符集中的字符编码为指定集合中某一对象,以便文本在计算机中存储和通过通信网络的传递。常见的例子包括将拉丁字母表编码成摩斯电码和ASCII。
2.1.最开始为美国人发明的ASCII码,内部只记录了英文字符与数字的对应关系.
存储字符:1bytes
2.2.而后又有一些国家发明了适用于自己国家语言的编码表。
==中国的GBK码:==内部记录了中文字符、英文字符与数字的对应关系
2bytes起步存储中文(遇到生僻字使用更多字节)
1bytes存储英文
韩国的Euc_kr码:内部记录了韩文字符、英文字符与数字的对应关系
日本的shift_JIS码:内部记录了日文字符、英文字符与数字的对应关系
这也导致了各国计算机文本文件无法直接交互,出现乱码的情况!!!
(三)字符编码相关操作 1.编码与解码2.3.为了解决乱码问题,先后出现了适用于各个语言的编码表
==万国码(unicode):==兼容万国字符
所有的字符全部使用2bytes起步存储
utf家族(针对unicode的优化版本)>>>:utf8
英文还是采用1bytes
其他统一采用3bytes
- 编码(encode):
把字符编译成字节的过程叫做编码。
- 解码(decode):
2.解决乱码问题把字节转为人类看的懂的现实生活里面的字符过程就是解码。
3.python解释器层面出现乱码的原因主要是因为在进行编码和解码的过程中使用的编码表不同导致的
所以编码过程中要注意编码表的正确使用!!!
因为现阶段python解释器开发时间不同,所以导致对于编码问题的处理就有了不同的方法。(这也与编码表的发展有关)
| 版本 | 方法 |
|---|---|
| python2.x | 默认的编码是ASCII码 1.必须在文件的开头告诉解释器使用指定的编码 2.在使用python2解释器的环境下定义字符串习惯在前面加u |
| python3.x | 解释器默认的编码是utf-8 |
2.如何操作文件?文件就是把一些数据存起来,可以让程序下一次执行的时候直接使用,而不必重新制作一份,省时省力。
文件其实是操作系统暴露给用户操作计算机硬盘的快捷方式之一!!!
- 2.1:打开文件,创建文件
# open(文件路径,读写模式,字符编码) W = open(‘a.txt’,’w’) #没有找到‘a.txt’文件,所以新建了‘a.txt’文件
- 关闭文件
3.文件的读写模式方式一: .close()关键字直接关闭
f = open(“a.txt”,”w”) f.colse()#关闭这个文件方式二: with语法结构
上述操作open完最后都需要执行close 而close这一行很任意被遗忘# with上下文管理(推荐使用) with open(r'a.txt', 'r', encoding='utf8') as f: # f = open() data = f.read() print(data)
- 3.1:只读模式
3.1.1:定义:
简称字母r,全称为rt。
使用该模式打开的文件只能读取内容!!!
使用该模式打开的文件不能做写的操作!!!
3.1.2:敲重点:
with open(r'a.txt', 'r', encoding='utf8') as f: print(f.read())当文件路径不存在,r模式会直接报错处理
当文件路径存在时,r模式会打开文件等待读取内容
- 3.2:只写模式
3.2.1:定义:
简称字母w,全称为wt。
使用该模式打开的文件只能写内容!!!
使用该模式打开的文件不能做读的操作!!!
3.1.2:敲重点:
with open(r'a.txt', 'w', encoding='utf8') as f: print(f.write('好好学习,天天向上'))当文件路径不存在,w模式会自动创建该文件
当文件路径存在时,w模式会先清空该文件内容 之后等待填写新内容
- 3.3:只追加模式
3.3.1:定义:
简称字母a,全称为at。
使用该模式打开的文件默认是在末尾追加新的内容!!!
使用该模式打开的文件不能做读的操作!!!
3.1.2:敲重点:
with open(r'a.txt', 'a', encoding='utf8') as f: f.write('不要蒙圈 好好听课n')当文件路径不存在,a模式会自动创建该文件
当文件路径存在时,a模式不会先清空该文件内容 只在在文件末尾等待填写新内容
- 3.4:额外知识点补充
3.4.1:with语法支持一次性打开多个文件!!!
with open(r'a.txt', 'r', encoding='utf8') as f1, open(r'b.txt', 'r', encoding='utf8') as f2, open() as f3, open() as f4...:
3.4.2:补全python语法,不做任何操作,有两种方法:
方法一:with语法结束后pass结束;
方法二:直接加…(不推荐使用!!!)
4.文件的操作模式3.4.3:英语单词的结尾如果更上了able表示具备该单词描述的能力
eg:
read+able = readable 具备读取内容的能力
write+able = writable 具备填写内容的能力
| 模式 | 英文字母 | 分类 | 作用 |
|---|---|---|---|
| 文本模式 | t | rt ;wt ; at | 1.只能操作文本文件;2.必须指定encoding参数;3.读写都是以字符串为单位 |
| 二进制模式 | b | rb ;wb ;ab | 1.能够操作所有类型的文件 ;2.不需要指定encoding参数;3.读写都是以bytes为单位 |
| 文件操作方法 | 作用 |
|---|---|
| read() | 一次性读取文件内容并且光标会停留在文件末尾,继续读则为空。 |
| readline() | 一次只读一行内容 |
| readlines() | 按照行的方式读取所有的内容并组织成列表返回 |
| readable() | 判断当前文件是否可读 |
| writable() | 判断当前文件是否可写 |
| write() | 填写文件内容 |
| writelines() | 支持填写容器类型(内部可以存放多个数据值的数据类型)多个数据值 |
| flush() | 将内存中的文件数据立刻刷到硬盘(主动按ctrl+s) |
- 6.1:read()文件操作
6.1.1:当文件数据很大时一般不采用一次性读取。
for line in f: print(line) # 文件对象支持for循环,并且依次只读一行
6.1.2:在文本模式下:resd括号内的数字表示读取几个字符。
with open(r'aaa.txt','r',encoding='utf8')as f: data = f.read(5) # 文本模式只读5个字符 print(data) # a你好啊朋
6.1.3:在二进制模式下:read括号内的数字表示读取几个字节(英文一字节,中文三字节)。
with open(r'aaa.txt', 'rb',encoding='utf8') as f: data = f.read(4) # 二进制模式只读4个字节,即a一字节和你三字节 print(data.decode('utf8')) # a你
- 6.2:获取光标移动的字节数
tell()方法
with open(r'aaa.txt', 'r',encoding='utf8') as f: data = f.read(3) print(f.tell()) # 7字节 print(data) # a 你好 date1 = f.read() print(date1) # 啊朋友
- 6.3:光标的移动之seek()方法
6.3.1:seek语法结构:
seek(offset,whence)
offset:控制移动的字节数
whence: 控制模式
6.3.2:whence控制模式
| 数字 | 作用 | 使用模式 |
|---|---|---|
| 0 | 基于文件开头移动多少字节 | 支持文本模式和二进制模式 |
| 1 | 基于光标当前所在位置移动多少字节 | 只支持二进制模式 |
| 2 | 基于文件末尾移动多少字节 | 只支持二进制模式 |
- 7.1:机械硬盘存储数据原理
(1)硬盘中数据的修改,其实就是覆盖写
(2)硬盘中数据的删除,占有态自由态存在
- 7.2:代码修改文件的方式
7.2.1:覆盖写:
先读取文件内容到内存 在内存中完成修改 之后w模式打开该文件写入
优点: 硬盘只占用一块空间
缺点: 数据量较大的时候会造成内存溢出with open(r'demo.txt','r',encoding='utf8') as f: data = f.read() new_data = data.replace('DSB','NB') # 修改数据 with open(r'demo.txt','w',encoding='utf8') as f1: f1.write(new_data)
(五)函数 1.什么是函数?7.2.2:重命名:
先读取文件内容到内存 在内存中完成修改 之后保存到另外一个文件中再将原文件删除 将新的文件重命名为原文件
优点: 不会造成内存溢出
缺点: 有那么一段时间需要占用硬盘两个地方的空间(可能) 也可能是在内存中创建没有刷到硬盘import os with open('demo.txt', 'r', encoding='utf8') as read_f, open('.demo.txt.swap', 'w', encoding='utf8') as wrife_f: for line in read_f: wrife_f.write(line.replace('NB', 'SB')) os.remove('demo.txt') # 删除文件 os.rename('.demo.txt.swap', 'demo.txt') # 重命名文件
2.函数与循环如果在开发程序时,需要某块代码多次,但是为了提高编写的效率以及代码的重用,所以把具有独立功能的代码块组织为一个小模块,这就是函数。
3.函数的本质循环: 在相同的位置反复执行相同的代码
函数: 在不同的位置反复执行相同的代码
函数可以看成是代码编写的工具。(提前定义好,然后在编写过程中反复使用)
4.函数的语法结构函数必须要先定义,之后才能使用
- 4.1:语法结构:
def 函数名(参数1,参数2): '''函数解释''' 函数体代码 return 返回值
- 4.2:语法结构拆分
| 名称 | 解释 |
|---|---|
| def | 是定义函数的关键字 |
| 函数名 | 与变量名一样,要做到见名知意 |
| 括号 | 在定义函数的时候函数名后面必须跟括号 |
| 参数 | 定义函数括号内可以写参数,且参数个数可变,也可以不写参数。用于接收外界传递给函数体代码内部的数据 |
| 函数解释 | 类似于“说明书”,用于介绍函数的主体功能和具体用法 |
| 函数体代码 | 整个函数的核心区域(逻辑代码)代码执行处 |
| return | 控制函数的返回值 |
- 5.1:函数必须先定义后使用
定义函数的代码必须要在调用函数的代码之前先运行即可
def func(): # 先定义函数名func() print('hello python') func() # 使用函数func()
5.2:函数在定义阶段只检测函数体代码语法,不执行函数体代码,只有在调用阶段才会真正的执行函数体代码.
(1)未调用函数前:只当做一行处理,即定义一个函数。
def func(): name(2)调用函数后,才能判断函数体代码能否正常运行!!!
# 这边正常调用函数,发现函数体代码不正确,报错处理 def func(): name func() # 报错啦 ~~~~~
5.3:函数名加括号代码执行优先级最高(定义阶段除外
6.函数的分类函数名绑定的是一块内存地址,里面存放了函数体代码
def func(): print('hello python') print(func) # 函数名
- 6.1:内置函数
解释器提前帮你定义好的函数,并且用户可以直接调用。
- 6,2:自定义函数
6.2.1:空函数:
函数体代码使用pass代替,暂时没有任何功能
主要用于前期的项目搭建,提示项目所需主要功能# 某某某系统 def run(): pass def fight(): pass def fly(): pass
6.2.2:无参函数:
函数定义阶段括号内没有填写参数
无参函数直接函数名加括号即可调用def func(): print('from func') func()
7.函数的返回值6.2.3:有参函数:
函数定义阶段括号内填写参数
有参函数调用需要函数名加括号并且给数据值def func(a,b): print('from func') func(1,2)
- 7.1:函数体代码没有return关键字:
默认返回None
def func(): print('from func') # 获取返回值 res = func() # 先执行func(),结果为from func print(res) # 获取到返回值为None
- 7.2:函数体代码有return关键字:
后面不写,也返回None
def func(): print('from func') return # return后面什么也不写 # 获取返回值 res = func() # 先执行func(),结果为from func print(res) # 获取到返回值为None
- 7.3:函数体代码有return关键字:return后面写什么就返回什么:
如果是数据值则直接返回 如果是变量则需要找到对应的数据值返回
def func(): print('from func') return 123 # 数据值 # 获取返回值 res = func() # 先执行func(),结果为from func print(res) # 获取到返回值为return返回值后面数据值123
- 7.4:函数体代码有return关键字并且后面写了多个数据值(名字) 逗号隔开:
默认情况下会自动组成元组返回。
def func(): return 1,2,3,4 # 多个数据值 res = func() print(res) # 获取到返回值return后为多个数据值,默认返回为元组格式
- 7.5:函数体代码遇到return关键字会立刻结束函数体代码的运行
def func():
print('我在上面')
return 123 # 我在上面
print('我在下面') # 不执行此处
func()
8.函数的参数
1.形式参数——相当于变量名
函数在定义阶段括号内填写的变量名,简称为“形参”
2.实际参数——相当于数据值
函数在调用阶段括号内填写的变量名,简称为“实参”def func(a): # 代码a为函数func的形式参数 pass func(123) # 123为函数func的实际参数
- 8.1:位置参数
1.位置形参
在函数定义阶段括号内从左往右依次填写的变量名称之为位置形参
2.位置实参
在函数调用阶段括号内从左往右依次填写的数据值称之为位置实参def func(a,b,c): # 代码定义函数阶段括号内a,b,c为位置形参 pass func(1,2,3) # 调用函数阶段括号内1,2,3,为位置实参
- 8.2:关键字参数
关键字实参
(1)指名道姓的给形参传值:def func(a,b): print(a,b) func(1,2) func(a=2,b=1) # 打破了位置的限制(2)位置实参必须在关键字实参的前面
def func(a,b): print(a,b) func(1,2) func(2,b = 1)(3)同一个形参在一次调用中只能传一次值
def func(a,b): print(a,b) func(666,a=1) # 报错啦~~~~~~a被传两次值
- 8.3:默认值参数
默认值形参
在函数定义阶段括号内以什么等于什么的形式填写的形参称之为默认值形参
具备条件:
1.在函数定义阶段就给形参绑定值 后续调用阶段就可以不传
2.调用阶段不传值就使用默认的 传了就用传了的
3.在定义形参时还需要遵循前面总结的规律(简单的在左边 复杂的在右边)def register(name,age,gender='male'): print(f""" -------------info------------ name:{name} age:{age} gender:{gender} ----------------------------- """) register('jason', 18) register('tony', 18) register('rouse', 18,'female')
- 8.4:可变长参数
可变长形参
可以打破形参与实参的个数限制 随意传值
.*在形参中的作用
接收多余的位置参数并组织成元组的形式赋值给*后面的变量名def func(*x): # *x不是形参 print(x) func() # () func(1) # (1,) func(1,2) # (1,2) func(1,2,3,4,5,6) # (1,2,3,4,5,6)
**在形参中的作用
接收多余的关键字参数并组织成字典的形式赋值给**后面的变量名def func(**y): print(y) func() # {} func(name='jason') # {'name': 'jason'} func(name='jason',age=18) # {'name': 'jason', 'age': 18} func(name='jason',age=18,hobby='read') # {'name': 'jason', 'age': 18, >'hobby': 'read'}



